三个霍尔信号接28035的EQEP1A/1B/1I,这三个引脚设置为普通输入,双边沿触发中断。用定时器0记录60度内的时间。那么问题来了,时间为定时器0中断次数的整数倍,会有误差,除非把定时器周期设的很短如1us,这样误差很小,但隔1us进入一次中断会影响程序运行。但如果设为10us误差会很大。怎么办呢?
Johnson Chen1:
为什么要用TIMER0金中断来计时呢?
通常应该是用ECAP或者,用外部中断的方法来实现。这样误差就不大了,
三个霍尔信号接28035的EQEP1A/1B/1I,这三个引脚设置为普通输入,双边沿触发中断。用定时器0记录60度内的时间。那么问题来了,时间为定时器0中断次数的整数倍,会有误差,除非把定时器周期设的很短如1us,这样误差很小,但隔1us进入一次中断会影响程序运行。但如果设为10us误差会很大。怎么办呢?
Tong Daniel:
回复 Johnson Chen1:
是用外部中断,但时间如果不是用Timer0来计算,那应该用什么方式呢?谢谢了
三个霍尔信号接28035的EQEP1A/1B/1I,这三个引脚设置为普通输入,双边沿触发中断。用定时器0记录60度内的时间。那么问题来了,时间为定时器0中断次数的整数倍,会有误差,除非把定时器周期设的很短如1us,这样误差很小,但隔1us进入一次中断会影响程序运行。但如果设为10us误差会很大。怎么办呢?
Tong Daniel:
回复 Tong Daniel:
找到解决办法了,是我自己学艺不精,采用以下计算方法,还是比较准的
T0CNT_now=CpuTimer0Regs.TIM.all; L++; if(L==1)MotorADJ.Now_Speed=10000000*L/((1000*(timer0Base.usCounter-1)+(60000+T0CNT_last-T0CNT_now)/60)*Pole);//计算转速 :单位 r/min;timer0Base.usCounter=0;
} T0CNT_last=T0CNT_now;
三个霍尔信号接28035的EQEP1A/1B/1I,这三个引脚设置为普通输入,双边沿触发中断。用定时器0记录60度内的时间。那么问题来了,时间为定时器0中断次数的整数倍,会有误差,除非把定时器周期设的很短如1us,这样误差很小,但隔1us进入一次中断会影响程序运行。但如果设为10us误差会很大。怎么办呢?
mangui zhang:
回复 Tong Daniel:
除了计算方法外 还有波形要做好整形处理
三个霍尔信号接28035的EQEP1A/1B/1I,这三个引脚设置为普通输入,双边沿触发中断。用定时器0记录60度内的时间。那么问题来了,时间为定时器0中断次数的整数倍,会有误差,除非把定时器周期设的很短如1us,这样误差很小,但隔1us进入一次中断会影响程序运行。但如果设为10us误差会很大。怎么办呢?
Tong Daniel:
回复 mangui zhang:
你是指霍尔信号整形处理吗,那就是在硬件上要考虑了吧