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