jpm*_*001 2 c embedded avr avr-gcc motordriver
我很难让PID反馈和定位同时运行.
我计算RPM的想法是:
我可以计算RPM但是我只能在计算之后调用我的PID控制器(不管我想等多久才能获得良好的分辨率.)这会导致代码非常混乱.是否有更简单的方法或我缺少的东西?
关于我的应用的信息: 我正在使用直流电机/双磁编码器编程到Atmel ATmega328P,每转约600个脉冲(齿轮箱后).我想调用GoToTarget(#)并让电机在更新PID参数时转到该位置.此外,它必须双向进行.
您的速度计算计时器和您的PID循环计时器应该是相同的 - 不是分开的.
不要浪费时间和分辨率将脉冲计数转换为以RPM为单位的速度; 如果定时器是精确周期性的 - 并且它需要一个稳定的PID - 则脉冲计数与速度成正比,而PID不关心单位 - 可以通过系数值进行调整.如果您希望您的设定点速度为实际单位,请将其转换为相当于每个PID周期的脉冲数,而不是相反.
你的循环应该是这样的;
for(;;)
{
WaitTimer() ;
pulses = pulse_count - previous_pulse_count ;
previous_pulse_count = pulse_count ;
control = pid( pulses ) ;
motor( control ) ;
}
Run Code Online (Sandbox Code Playgroud)
然后,您只需要一个中断来计算脉冲 - 它不需要执行任何计算,只需递增计数器 - 也许是计时器的中断,具体取决于WaitTimer()的实现以及这是否是多线程的.
另请注意,如果共享变量pulse_count不是原子的,则需要在读取时禁用中断(最好包装在函数中),并且需要声明它volatile.