2013-06-21 76 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