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

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

我计算RPM的想法是:

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

我可以计算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 ) ; } 

然后,您只需要一个中断来计算脉冲 – 它不需要执行任何计算,只需递增计数器 – 也许是计时器的中断,具体取决于WaitTimer()的实现以及这是否是multithreading的。

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