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

时间:2013-06-21 13:58:18

标签: c embedded avr avr-gcc motordriver

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

我计算RPM的想法是:

  1. 启动计时器并使用中断计数编码器脉冲。
  2. 使用一些简单的数学转换为RPM。
  3. 重置使用的变量并重新开始。
  4. 我可以计算RPM但是我只能在计算之后调用我的PID控制器(不管我想等多长时间才能获得良好的分辨率。)这会导致代码非常混乱。是否有更简单的方法或我遗漏的东西?

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

1 个答案:

答案 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