是这样的,我希望测试HALL信号的频率来计算电机转速
使用了定时器3的捕获功能
但是发现一个问题,电机转速设置成400转,即频率为33HZ,2000转,即167HZ,通过测试频率,闭环控制转速,都没问题
但是单片机分不清楚800转和1600转,在这个转速下测试频率有问题
下面是代码
void interrupt_timer3() interrupt 14
{
static unsigned int overflow_Flag = 0;
SFRPAGE = TMR3_PAGE;
TR3 = 0;
if(TF3 == 1) //溢出
{
TF3 = 0;
overflow_Flag++;
}
if(EXF3 == 1) //被测信号下降沿
{
capture_VAL = RCAP3H * 256 + RCAP3L;
temp[0] = RCAP3H;
temp[1] = RCAP3L;
speed_measure = 1843200 / capture_VAL * 12;
overflow_Flag = 0;
EXF3 = 0;
}
SFRPAGE = TMR3_PAGE;
TMR3L = 0x00;
TMR3H = 0x00;
TR3 = 1;
}
我通过串口调试助手把RCAP3H和RCAP3L显示出来,发现同样的被测试频率,他计数值会出错,而且就在这个频率段附近会出现,频率再高或再低都没问题
如图,30DA,2E8A是正确的,但是他会测试出来60C0,5E83这样的值
我晶振频率是22118400Hz,定时器3设置的时钟源是SYSCLK/12
先谢谢了哈
|