四. 軟體準備——ucos-iii作業系統
匆匆忙忙的2023年結束了,在機械人平台開發方面算是搞清了些端倪。近來總算有時間回顧過往,稍作整理。計畫寫乙個專題系列,內容即為「機械人控制系統設計與實現」,這將會是我的系列文章的宗旨。機械人平台從地面無人車到空中無人機到水下無人潛航器,這將是乙個可上九天攬月、可下五洋捉鱉的巨集大藍圖。講述內容從控制演算法到嵌入式軟體開發,從計算機**到微控制器實戰,從底層驅動到上層應用。所有的**源於專案實戰,講述方式將是雅俗共賞。記錄與分享心得的過程是快樂的,既是悅己、也可及人。如果有志同道合的朋友們可以動動小爪點個關注,我們一起成長、一起進步叭!
第一篇從實現乙個四輪四驅小車開始~
搭建四輪小車的機械部分就不細講了,有條件的自己設計機架機加工或3d列印,沒條件的直接買乙個四輪底盤即可,電機、輪子配套,成本不高。
電機選擇就很多了,小型四輪車常見的是編碼器電機,如圖1所示,一般是六根接線,兩根編碼器電源線,兩根電源線,兩根編碼器訊號線(a相b相)。只需要一路編碼器就可用於測速,兩路可以測方向,控制板需要解析編碼器訊號做速度閉環控制。
另外一種是匯流排電機,常見的是can匯流排電機、串列埠匯流排電機,這種電機一般會有配套的驅動器,控制板只需要給定速度、位置訊號。如圖所示是大疆的m3508行星減速電機與配套的c620電調(robomaster用的電機同一系列),可以使用can匯流排控制和pwm兩種控制方式。本篇我們就用這個電機,基於can匯流排方式去做速度閉環。
驅動板是小車的大腦,由於本篇所實現的功能只是實現基本運動,就是遙控器控制小車直行和轉彎,所以只需要乙個底層驅動控制板,在後續增加高階功能之後會疊加上層控制器(如樹莓派、英偉達)。
板子可以買,以可以畫。主要是要有iic、串列埠、can匯流排、編碼器介面等外設介面和電源介面。前述的編碼器電機的介面是通用的,**上有很多板子是帶了這種介面的,如果沒有的話將電機的線分別接到對應的io口即可,只是不太好看。
本文選擇自主開發的使用stm32f7主控的驅動板,時鐘頻率216mhz,一般的智慧型小車應用都足夠了。
感測器主要是需要姿態感測器,一般使用九軸慣性感測器,即三軸陀螺儀、三軸加速度計、三軸磁力計。最終目的就是解算三軸姿態角,這裡簡單粗暴,直接買了乙個姿態角感測器,如圖所示是維特智慧型的感測器,串列埠輸出三軸姿態角,其內部還是使用姿態解算演算法算出來的。如果使用mpu9250等模組就需要自己進行解算了,後面有時間專門寫一篇濾波演算法與姿態解算。
建議選用鋰電池。
本系列文章都會使用作業系統,ucos-iii和freertos原理差不多,只不過前者商用後者免費,我使用的是ucos-iii。如果沒有嵌入式作業系統的小夥伴們自行補補課叭,不會也沒關係。不影響核心**部分的閱讀。
在空的作業系統的工程模板中,建立4個任務,乙個communicatetask,sensortask,stabilizationtask,motortask,分別進行遙控器通訊、感測器資料讀取、姿態控制、電機控制。使用作業系統的優勢就是實時性,請大家牢記這個概念。在作業系統下,每個任務都像是同時執行的,其實是分時復用,只有在多核的處理器上才能實現真正的同時。
首先在main檔案的起始部分定義任務優先順序、任務堆疊、堆疊大小、任務函式等。這裡的starttask用於建立其他任務,建立完之後就掛起自己。
//任務優先順序
#define start_task_prio 3
//任務堆疊大小
#define start_stk_size 128
//任務控制塊
os_tcb starttasktcb;
//任務堆疊
cpu_stk start_task_stk[start_stk_size]
;//任務函式
void
start_task
(void
*p_arg)
;//communicate任務
//設定任務優先順序
#define communicate_task_prio 5
// sbus 訊號的更新是在串列埠中斷中進行的
//任務堆疊大小
#define communicate_stk_size 512
//任務控制塊
os_tcb communicatetasktcb;
//任務堆疊
cpu_stk communicate_task_stk[communicate_stk_size]
;//led0任務
void
communicate_task
(void
*p_arg)
;//stabalizer任務
//設定任務優先順序
#define stabilization_task_prio 4
//任務堆疊大小
#define stabilization_stk_size 2048
//任務控制塊
os_tcb stabilizationtasktcb;
//任務堆疊
cpu_stk stabilization_task_stk[stabilization_stk_size]
;//led0任務
void
stabilization_task
(void
*p_arg)
;//motor電機任務
//設定任務優先順序
#define motor_task_prio 7
//任務堆疊大小
#define motor_stk_size 512
//任務控制塊
os_tcb motortasktcb;
//任務堆疊
cpu_stk motor_task_stk[motor_stk_size]
;//motor任務
u8 motor_task
(void
*p_arg)
;//設定任務優先順序
#define sensor_task_prio 6
//任務堆疊大小
#define sensor_stk_size 512
//任務控制塊
os_tcb sensortasktcb;
//任務堆疊
cpu_stk sensor_task_stk[sensor_stk_size]
;//motor任務
u8 sensor_task
(void
*p_arg)
;
在main函式中系統初始化、外設初始化、建立開始任務
int
main
(void
)
開始任務的內容如下,內容就是建立其他四個任務,之後把自己掛起。
//開始任務函式
void
start_task
(void
*p_arg)
緊接著寫四個主要任務,這四個函式是主體部分,分別實現遙控器通訊、感測器資料讀取、姿態控制、電機伺服。四個函式全是空的,啥也沒乾,只有乙個while迴圈中delay_ms(10),意思就是每隔10ms執行一次這個任務(是不是就是裸機裡面的while(1)迴圈?)後續文章會依次往各個任務裡面加內容。
//通訊任務
void
communicate_task
(void
*p_arg)
}void
stabilization_task
(void
*p_arg)
}u8 sensor_task
(void
*p_arg)
}u8 motor_task
(void
*p_arg)
}
以上關於作業系統的**部分如果沒有作業系統基礎的小夥伴們可能有點雲裡霧裡,可以不用管。只需要明白,它其實是把乙個main函式變成了多個main函式,名義上的main函式只進行初始化和任務建立,每個void ***_task()就是乙個main函式,多個main函式分時復用,就像多個任務同時執行。 基於STM32的智慧型小車(一)
基於stm32的智慧型小車 在假期自學了stm32,一直想做乙個智慧型小車,剛好這次有時間就在家自己製作了這個基於stm32的智慧型小車,小車基本功能包括循跡 壁障及手機藍芽控制,本人是第一次製作小車,有不對的,望大牛指教。一 製作產品基本材料清單 1 stm32c8t6核心板 一塊 2 l298n...
STM32實現水下四旋翼(一)飛行原理
飛行是人類孜孜以求的夢想。從莊子的 御風而行 扶搖而上 到武俠神鬼 中的輕功 御劍飛行,各種文字 圖騰都滿含飛行的樸素理想,據說每個大男孩心中都有乙個飛天夢。對於乙個理工科的大男孩來說,製造乙個飛機恐怕是更有 力吧!網路時代知識共享,開源社群的盛行讓這不再是難事,事實上你想學,大把的資源可供利用。當...
MODBUS協議在STM32上實現 一
第一節 通訊的硬體協議機制 主從模式的建立 目的 實現在modbus的從機實現 1.硬體層協議 解決傳輸問題,相當於路 2.軟體層協議 舉例 例如rs232 傳送1是多少v,傳送0是多少v 485協議 這個硬體晶元是廠商做到一起的,一般需要有一根控制線用開判斷是哪種模式 can硬體協議也是類似的 1...