基於RT-Thread的兩輪平衡小車設計


一、前言

  最近參加了RT-Thread官方發起的RT-Robot Car DIY活動,借此機會想總結一些自己本科四年的所學的部分知識。

  也可以幫助到那些需要的小伙伴(可以參考我的代碼中對RT-Thread的can設備驅動的使用方法,對IIC驅動的使用方法,mpu6050+hmc5883的初始化和數據讀取的方法,RT-Thread硬件定時器的使用方法,滑動窗口濾波的鏈表實現,pid結構的代碼參考,pid參數調試方法等)

 

二、演示

  github鏈接(包括整個keil工程的代碼,原理圖和PCB,機械圖紙和一些參考資料):https://github.com/iamluoyijie/funny_car

  小車實物:

 

  兩個演示視頻鏈接:https://v.youku.com/v_show/id_XNDMzNzExODMyMA==.html

           https://v.youku.com/v_show/id_XNDMzNzExODMxNg==.html

 

 

 

 

三、詳細步驟

  硬件上,MCU選用stm32f407zgt6,imu選用gy-86(mpu6050+hmc5883+ms5611)。電機為大疆無刷電機m2006,電機驅動為電調c610,所以選用6s航模鋰電池,所以需要設計24V轉5v,5v轉3.3v穩壓電路,分別使用lm2576-5.0和asm1117-3.3穩壓芯片,由於電調使用can總線通信,所以需要單片機外接can芯片,選用TJA1050,除此之外就是MCU的一些接口電路,包括led,key,sw下載接口、多路串口、PWM和IO。總得來說比較簡單(需要注意一點是:電池24v輸出到電調24v輸入,是在pcb上走線,單路額定電流10A,線寬需要注意,最好雙面都布線)。這是AD18的PCB工程鏈接,。這是pcb的3d圖:

  

  機械上,需要根據電機尺寸單獨設計電機支架和小車底板,三視圖如下所示:

     

  軟件上,我是使用的這個目錄下的bsp:https://github.com/RT-Thread/rt-thread/tree/v4.0.0/bsp/stm32f4xx-HAL,需要的功能可以在rtconfig.h文件中開啟對應的宏。 

  1. 用rtt的can設備驅動框架,完成了對電機電調的讀寫控制,具體見keil工程目錄下的can_app.c文件,實現了對兩個電機的正反轉控制,讀取電機轉速,轉矩等數據。
  2. 由於can讀取的電機轉速值數據的波動不穩定,再一個因為轉速更新頻率為1k,速度環控制周期是2ms,所以用滑動窗口濾波算法對數據做了平滑處理,最后pid調參的效果因此好了很多。
  3. 用rtt的IIC驅動完成了對gy-86傳感器(mpu6050+hmc5883+ms5611)的初始化和數據讀取,具體見gy-86.c文件,完成了對角速度,加速度,和磁力計數據的讀取。
  4. 然后用Mahony算法(這算法是開源的)把讀到的數據解算成歐拉角,見imu.c文件,需要注意的是sampleFreq要根據自己的控制周期來設置,角速度需要歸一化。最后解算的pitch和roll角比較穩定,yaw角有一點漂移。
  5. 然后用rtt的軟件定時器,將pid內環速度環控制周期設置為2ms,外環角度環控制周期設置為5ms, 見timer_app.c文件。
  6. pid參數整定是通過山外調試助手顯示波形,通過rtt的FinSH組件在線去修改參數,極大的提高了效率,見timer_app.c文件,。
  7. pid控制框圖如下圖所示,其中的PID計算就是最簡單的比例+積分+微分的結構,再加上了適當的限幅。
  8. 平衡車直立就是將下圖期望角度設置為0,前進后退則是將期望角度設置為一個合適的正負的角度值,轉彎就是在左右輪的期望速度上,加減一個合適的速度值,這角度值和速度值通過PS2搖桿的模擬量給定,就能完成遙控對平衡小車的控制。
  9. 利用rtt的多線程技術,完成了ps2遙控線程(ps2代碼參考的這位朋友的,很好用,在此表示感謝),LED狀態顯示線程,電機電流保護線程,按鍵線程,很大程度上簡化了程序的設計。

四、不足分析與接下來繼續要做的工作。

  1、速度內環的pid效果不太理想,500的電機目標轉速,實際轉速波動有正負50。角度外環0度的期望角度,有正負0.5度的波動,小車運動過程中,速度過快就會倒。我感覺最重要的原因就是電池太重,導致小車重心偏高,其次就角度更新頻率太慢,電機轉速值不准,pid參數也不是最優。

  2、代碼上,使用了太多全局變量。led的狀態顯示沒好好弄,ps2的好多按鍵沒利用上。

  3、接下里的工作就是,使用RT-Thread的IPC機制,盡量減少全局變量的使用。 通過yaw角度或電機編碼器,實現轉向環 速度 的閉環控制。增加 前進 和 轉向 的位置控制。(前面的都是速度控制),也就是說還要增加3組pid控制。

  4、可能會重新設計電機支架,把電池放到電機下面,降低平衡車重心。會增加樹莓派,用opencv實現簡單的目標跟蹤等工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM