2020-01-19 19:41发布
alias 发表于 2014-3-11 22:53 当相位差向0接近,输入捕获得到的数值是渐渐变小,由於中断处理及改变捕获的讯号源都要些时间,处理完毕后 ...
alias 发表于 2014-4-5 17:44 我上面提到的是AVR上单一个的捕获寄存器,其它有多个捕获寄存器的 MCU 可能更好做。 先确定要测量方波的周 ...
最多设置5个标签!
我是这样处理的,不知道为什么相位差接近0时会出错
void TIM4_IRQHandler(void)
{
u32 temp = 0;
temp = TIM4->SR;
if (temp & 0x02) //捕获1发生捕获事件
{
TIM4->SR&=~(1<<1); //清除1通道中断标志位
ReadValue1[0] = TIM4->CCR1;
TIM4->DIER&=~(1<<1); //禁止1通道捕获中断
LED1 =!LED1;
}
else if(temp & 0x04) //捕获2发生捕获事件
{
TIM4->SR&=~(1<<2); //清除2通道中断标志位
ReadValue1[1] = TIM4->CCR2;
Getnum[0]= (ReadValue1[1] - ReadValue1[0]);
TIM4->DIER&=~(1<<2); //禁止2通道捕获中断
LED2 =!LED2;
}
}
直接AD采样,并做FFT,即可算出2个的相位差,精度一般都可以做到0.2度
我上面提到的是AVR上单一个的捕获寄存器,其它有多个捕获寄存器的 MCU 可能更好做。
先确定要测量方波的周期,假设周期 = Timer4 的 2345 个计数,我的做法如下:
1. 禁止通道2捕获中断
2. 使能通道1捕获中断
.
.
3. 通道1捕获中断出现及进入Handler
4. ReadValue[0]
5. 禁止通道1捕获中断
6. 使能通道2捕获中断
7. 中断返回
.
.
8. 通道2捕获中断出现及进入Handler
9. ReadValue[1]
10. 禁止通道2捕获中断
11. Result=ReadValue[1]-ReadValue[0]. If Result >= 2345 then Result = Result - 2345
12. 中断返回
我知道我的为什么会出错了:我在测出30次角度差后取了个平均值,结果当相位差接近0度时,
参与计算中的数象这样(359,0,1,359,358,0,1,359,359.........),虽然一眼看出来平均值是接近0度的,但单片机计算下来,就是乱的了。
这个怎么解决呢??
一周热门 更多>