樂高NXT的輸出目前是以馬達為主因此對於馬達的瞭解是非常重要的一課,實際在玩NXT有時候你對NXT下達轉90度的指令時馬達實際卻轉了100度這十度的誤差有可能影響很大,如果這類指令常用那累計的誤差值非常可觀,玩NXT想要精確的控制馬達一定要知道PID的控制原理。
研發養成所的這篇PID Speed Control 推薦一定要去看。
另外 文章中提到 NXC 沒有提供小數Float 資料型態在最新版的NXC已經支援了,以前在用NXC時也覺得不支援Float實在不方便要自己做轉換才能得到數據使用。
後來去研發養成所問了一個問題:
請問在NXC中讀取角度的Function:MotorRotationCount()、MotorTachoCount()..........都可以讀取馬達角度值...請問這兩者有何差異
再請問當我下達 RotateMotor(OUT_A,80,320) 指令後,再讀取馬達角度MotorTachoCount(OUT_A)時,往往不相同也就是馬達沒有精確的的停在320度.....請問要如何解決才能準確停在320度
-----------------------------------------------------------------
版主很熱心的回應:
MotorTachoCount()會因每次 RotateMotor 指令執行,而重置清除馬達角度值,但是 MotorRotationCount()不會,因此 MotorRotationCount()會一直累積馬達角度值,直到執行 ResetAllTachoCounts(OUT_A)才清除。
RotateMotor 指令,為 open loop 控制指令,它無法精確控制角度,會因電池電力大小或負載情形,造成角度有誤差。你可以嘗試 RotateMotorPID(OUT_A,80,320,P,I,D),P=50,I=50,D=50,這裡 PID 數值不是最佳值,您需要自行調整數值,PID控制後,才能修正回設定點。
看完回應後真是感謝版主的解釋........^_^
另一篇 J. Sluka PID 控制文章 也是一篇好文。
一定要去看看PID的計算原理你會獲益良多
Lego Run您好,
回覆刪除很高興認識你,你許多專文寫的很棒,日後有機會向您討教。
Bridan 您太客氣了
回覆刪除從你的Blog文章中知道你是電子方面的專業人員在軟硬體方面有深入的研究.....這對於像我這種對電子沒認識的人有很大的幫助.......再次謝謝你 ^_^