PID反馈和位置控制器,带直流电机/编码器

jpm*_*001 2 c embedded avr avr-gcc motordriver

我很难让PID反馈和定位同时运行.

我计算RPM的想法是:

  1. 启动定时器并使用中断计数编码器脉冲.
  2. 使用一些简单的数学转换为RPM.
  3. 重置变量使用并重新开始.

我可以计算RPM但是我只能在计算之后调用我的PID控制器(不管我想等多久才能获得良好的分辨率.)这会导致代码非常混乱.是否有更简单的方法或我缺少的东西?

关于我的应用的信息: 我正在使用直流电机/双磁编码器编程到Atmel ATmega328P,每转约600个脉冲(齿轮箱后).我想调用GoToTarget(#)并让电机在更新PID参数时转到该位置.此外,它必须双向进行.

Cli*_*ord 6

您的速度计算计时器和您的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.