2013-06-21 78 views
2

我很难同时获得PID反馈和定位。带直流电机/编码器的PID反馈和位置控制器

我认为计算RPM是:

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

我可以计算每分钟转数,但是我只能在计算后才能调用我的PID控制器(无论多长时间我都想等待以获得良好的分辨率)。这会导致非常混乱的代码。有没有更简单的方法或我错过了什么?

信息关于我的应用程序: 我编程到爱特梅尔ATMEGA328P用直流电机/双磁编码器每圈(减速机后)〜600个脉冲。我想调用GoToTarget(#)并在更新PID参数时让电机转到位置。另外,它必须双向进行。

回答

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(执行),这是否是多-threaded。

另请注意,如果共享变量pulse_count不是原子的,则需要在读取时禁用中断(最好用函数封装),并且需要将其声明为volatile

+0

+1阅读你的答案总是很好的。你的描述几乎全面 – jeb

+0

我真的很感激它。谢谢 – jpmeyer001