SLAM+語音機器人DIY系列:(四)差分底盤設計——2.stm32主控軟體設計

来源:https://www.cnblogs.com/hiram-zhang/archive/2019/02/19/10403822.html
-Advertisement-
Play Games

摘要 運動底盤是移動機器人的重要組成部分,不像激光雷達、IMU、麥克風、音響、攝像頭這些通用部件可以直接買到,很難買到通用的底盤。一方面是因為底盤的尺寸結構和參數是要與具體機器人匹配的;另一方面是因為底盤包含軟硬體整套解決方案,是很多機器人公司的核心技術,一般不會隨便公開。出於強烈的求知欲與學習熱情 ...


摘要                                            

運動底盤是移動機器人的重要組成部分,不像激光雷達、IMU、麥克風、音響、攝像頭這些通用部件可以直接買到,很難買到通用的底盤。一方面是因為底盤的尺寸結構和參數是要與具體機器人匹配的;另一方面是因為底盤包含軟硬體整套解決方案,是很多機器人公司的核心技術,一般不會隨便公開。出於強烈的求知欲與學習熱情,我想自己DIY一整套兩輪差分底盤,並且將完整的設計過程公開出去供大家學習。說乾就乾,本章節主要內容:

1.stm32主控硬體設計

2.stm32主控軟體設計

3.底盤通信協議

4.底盤ROS驅動開發

5.底盤PID控制參數整定

6.底盤裡程計標



2.stm32主控軟體設計                

上一節搭建好了底盤的stm32主控硬體,現在就來說說怎麼開發配套的stm32軟體。關於建立stm32工程、使用stm32開發庫、stm32軟體調試方法等基礎知識就不多說了,有需要的可以查閱相關資料學習,我覺得http://www.openedv.com《正點原子》的開發資料寫的還可以。我就直接從底盤控制的項目入手,直接進行項目中各個功能需求開始分析講解,如圖11,是我的底盤控制stm32工程項目。

(圖11)底盤控制stm32工程項目

2.1.電機控制                

電機控制分為兩個部分(電機轉向控制、電機轉速控制),這些都集成在了電機驅動晶元TB6612FNG裡面,所以只需要用單片機的IO口產生控制轉向的高低電平和控制轉速的PWM波就能實現。

首先,初始化IO口作為輸出腳,用於產生高低電平輸出來控制轉向,實例代碼如圖12

(圖12)電機轉向控制IO口初始化

然後,用通用定時器TIM4的通道CH1CH2分別產生兩路PWM輸出用於兩個電機的轉速控制,定時器預設引腳分配如圖13

(圖13stm32定時器通道預設引腳分配

初始化通用定時器TIM4的通道CH1CH2PWM輸出,實例代碼如14

(圖14)電機轉速控制IO口初始化

最後,將電機轉向和速度控制的操作封裝在一個函數中,便於其它地方調用,實例代碼如圖15

(圖15)電機轉向和速度控制封裝

2.2.編碼器數據讀取           

編碼器對底盤來說至關重要,一方面底盤通過編碼器的反饋進行PID閉環速度控制,另一方面底盤通過編碼器進行航跡推演得到里程計用於後續的定位與導航等高級演算法中。這裡用到的編碼器是正交編碼器,所以直接使用通用定時器的輸入捕獲中的編碼器模式來讀取編碼器。採用通用定時器TIM2的通道CH1CH2捕獲encoder1A相和B相脈衝,採用通用定時器TIM3的通道CH1CH2捕獲encoder2A相和B相脈衝。

先初始化TIM2作為編碼器encoder1的捕獲,實例代碼如圖16

(圖16)初始化TIM2作為編碼器encoder1的捕獲

然後,將讀取編碼器計數值的操作封裝在一個函數中,便於其它地方調用,實例代碼如圖17

(圖17)讀取編碼器encoder1計數值封裝

最後,編寫TIM2計數溢出時的中斷處理函數,實例代碼如圖18

(圖18TIM2計數溢出中斷處理函數

同理可得TIM3捕獲encoder2的代碼實現,這裡就不在贅述了。

2.3.串口數據收發            

串口2是數據介面,負責接收上位機發送過來的控制指令,同時將編碼器值返回給上位機;串口1debug介面,負責接收上位機發送過來的版本信息請求、PIDm預設值恢復、PID值設定等調試指令,同時將程式中的debug列印信息返回給上位機。但是在底盤正常工作時,只需要連接串口2;串口1是預留出來給有需要自己動手修改PID參數使用的。

首先,配置串口1,先對串口1的輸出進行printf函數列印支持,實例代碼如圖19

(圖19)串口1的輸出進行printf函數列印支持

然後,初始化串口1,實例代碼如圖20

(圖20)初始化串口1

最後,編寫串口1接收中斷處理函數,此函數主要進行對上位機發過來的數據進行協議解析,實例代碼如圖21

(圖21)串口1接收中斷處理函數

接下來,介紹串口2,初始化串口2,實例代碼如圖22

(圖22)初始化串口2

然後,將串口2發送數據的操作封裝到函數中,便於其它地方調用,實例代碼如圖23

(圖23)串口2發送數據封裝

最後,編寫串口2接收中斷處理函數,此函數主要進行對上位機發過來的數據進行協議解析,實例代碼如圖24

(圖24)串口2接收中斷處理函數

到這裡,串口有1和串口2的數據發送與接收都編寫好了,依據我們定義的usart2數據通信協議和usart1調試通信協議,上位機就可以編寫對應的程式來跟底盤的串口2和串口1進行通信了。關於通信協議的具體內容,將在後續做展開。

2.4.電機速度PID控制         

我在底盤中採用的是增量型PID演算法,編程涉及到的數學表達式有3個,分別是:

e(k) = target_value - current_value

delta_u(k) = Kp*[e(k)-e(k-1)] + Ki*e(k) + Kd*[e(k)-2*e(k-1)+e(k-2)]

u(k) = u(k-1) + delta_u(k)

將這3個數學表達式封裝到函數中,便於其它地方調用,實例代碼如圖25

(圖25)串口2接收中斷處理函數

 電機1與電機2採用同樣的PID演算法,所以電機2PID演算法代碼實現就不贅述了。關於PID參數的整定方法,將在後續做展開。

2.5.周期性控制           

通過上面的講解,各個模塊的驅動代碼都準備就緒了,現在需要產生一個周期性的過程,在裡面實現編碼器計數值採樣、PID控制等具體實現。這裡採用定時器TIM1產生一個周期性的中斷,在中斷處理函數中實現各模塊的具體操作。

首先,配置定時器TIM1,實例代碼如圖26

(圖26)配置定時器TIM1

然後,編寫中斷處理函數,實例代碼如圖27

(圖27TIM1中斷處理函數

2.6.stm32主控軟體整體框圖

通過上面的講解,對底盤控制的stm32程式實現有了一定的瞭解,接下來就來做一個總結。

先來看看main()函數實現,如圖28

(圖28main()函數實現

結合上面TIM1中斷處理函數,不難發現,整個stm32程式的執行過程:

a.main()函數中初始化各個模塊;

b.TIM1中斷處理函數周期性的讀取編碼器值、反饋獲取的編碼值、PID控制;

c.剩下的就是串口1和串口2的通信交互。

具體stm32主控軟體整體框圖如圖29

(圖29stm32主控軟體整體框圖

需要說明的是,在周期性迴圈體中,要首先讀取編碼器的值,來保證嚴格的等間隔採樣。

後記                

如果大家對博文的相關類容感興趣,或有什麼技術疑問,歡迎加入下麵的《SLAM+語音機器人DIY》QQ技術交流群,一起討論學習^_^


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄,是指書籍、文檔正文前所載的目次,將主要內容以一定次第順序編排,起指導閱讀、檢索內容的作用。在Word中生成目錄前,需要設置文檔相應文字或者段落的大綱級別,根據設定的大綱級別可創建文檔的互動式大綱,即在Word文檔左側導航視窗中可顯示為如同目錄的標題大綱,通過點擊相應級別的內容,可跟蹤閱讀位置或 ...
  • 一.概述 EF實體關係定義了兩個實體互相關聯起來(主體實體和依賴實體的關係,對應資料庫中主表和子表關係)。 在關係型資料庫中,這種表示是通過外鍵約束來體現。本篇主要講一對多的關係。先瞭解下描述關係的術語。 (1) 依賴實體: 這是包含外鍵屬性的實體(子表)。有時稱為 child 。 (2) 主體實體 ...
  • 索引: 目錄索引 一.API 列表 C# 代碼中 String.Contains("conditionStr") 生成 SQL 對應的 like '%conditionStr%' 如:.Queryer<Agent>() ... ... .Where(it => it.PathId.Contains( ...
  • 對象深拷貝 計算最大公約數 數組與結構體相互轉換 字元串與char數組、byte數組轉換 Windows消息處理 字元串編碼轉換 通過反射獲取對象所有屬性集合,以鍵值對形式展現 實體類轉SQL條件字元串 待續 ...
  • 一、為什麼要學習Razor? 可以讓伺服器代碼(就是c#和vb)嵌入到網頁中,也就是說這個頁面中包含html代碼和C#(vb)代碼。基於伺服器的代碼可以在網頁傳送給瀏覽器時,創建動態 Web 內容。當一個網頁被請求時,伺服器在返回頁面給瀏覽器之前先執行頁面中的基於伺服器的代碼。通過伺服器的運行,代碼 ...
  • Quartz.NET是一個強大、開源、輕量的作業調度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改寫,可用於winform和asp.net應用中。它靈活而不複雜。你能夠用它來為執行一個作業而創建簡單的或複雜的作業調度。它有很多特征,如:資料庫支持,集群,插件,... ...
  • C#:使用Parallel並行執行任務 1. 代碼實現 2. 運行結果: ...
  • 前幾個章節我們講到Windows Server 2016-圖形化新建域用戶(一),本章節我們簡單講解下如何通過命令批量創建域用戶,以便高效完成日常工作中實際批量創建用戶需求,內容涉及dsadd user、net user、new-aduser,具體信息如下:dsadd user創建用戶:將單個用戶添... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...