2

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

我计算 RPM 的想法是:

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

我可以计算 RPM,但我只能在计算后调用我的 PID 控制器(但我想等待多长时间才能获得良好的分辨率。)这会导致代码非常混乱。有没有更简单的方法或我缺少的东西?

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

4

1 回答 1

7

您的速度计算计时器和您的 PID 回路计时器应该是同一件事 - 不是分开的。

不要浪费时间和分辨率将脉冲计数转换为 RPM 中的速度;如果计时器是准确的周期性 - 并且它需要稳定的 PID - 那么脉冲计数与速度成正比,并且 PID 不关心单位 - 可以通过系数的值进行调整。如果您希望您的设定点速度采用实际单位,请将其转换每个 PID 周期的等效脉冲数,而不是相反。

你的循环应该是这样的;

for(;;)
{
    WaitTimer() ;
    pulses = pulse_count - previous_pulse_count ;
    previous_pulse_count = pulse_count ;
    control = pid( pulses ) ;
    motor( control ) ;
}

然后,您只需要一个中断来计算脉冲 - 它不需要执行任何计算,只需增加一个计数器 - 可能还有一个定时器的中断,这取决于 WaitTimer() 的实现以及这是否是多线程的。

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

于 2013-06-22T06:25:29.783 回答