相信這個東西很多人都見過,大佬做的一個機(jī)器人
大部分人都是在關(guān)注功能本身,只有我看上了這個改裝的小舵機(jī)。因為市面上的舵機(jī)只能接收PWM信號,進(jìn)行角度控制。
這就有問題了。
在這種情況下我們只能發(fā)送指令,讓舵機(jī)運動,卻不能接收指令,從而知道它的運動狀態(tài)。同時,想要讓舵機(jī)進(jìn)行反驅(qū),就必須能讓舵機(jī)隨時進(jìn)行輸出力矩的切換。小驅(qū)動器支持IIC總線通信,PID閉環(huán)控制,位置回傳,還能設(shè)置最大的輸出力矩,斷電儲存參數(shù)等。
更加詳細(xì)的一些內(nèi)容在readme里面
魔改后的舵機(jī)通過I2C接口和控制板進(jìn)行通信,STM32F4的控制板為主機(jī),舵機(jī)為從機(jī)。通信的過程始終是主機(jī)發(fā)起的,主機(jī)首先下發(fā)位置、參數(shù)等指令,然后即時取回相關(guān)數(shù)據(jù)完成一個通信來回。
每個舵機(jī)作為從機(jī)接收兩個地址的指令:自己的ID號,以及0號廣播。廣播用于在沒有給舵機(jī)設(shè)置地址的時候作為通配地址使用(比如你剛燒寫完舵機(jī)固件,此時舵機(jī)的Flash是沒有儲存自己的ID的,只能通過0號地址通信)。
值得注意的是:舵機(jī)和主機(jī)的上電需要有先后順序,一定要先讓從機(jī)初始化完成開始監(jiān)聽數(shù)據(jù),再讓主機(jī)發(fā)送指令!
如果主機(jī)發(fā)送指令的時候從機(jī)不響應(yīng),或者多個舵機(jī)地址相同同時響應(yīng),都可能引起通信錯誤,因此需要保證上述的順序。
由于硬件上主機(jī)和舵機(jī)上電都是同時的,所以在主機(jī)的固件代碼中,有一個延時2S的代碼(其實可以不用那么久),就是等待舵機(jī)都上電初始化完成再開始通信。
調(diào)試的時候,一個舵機(jī)一個舵機(jī)調(diào)試,注釋掉其他未連接的舵機(jī)的通信代碼,不然也會造成輪詢等待超時。
舵機(jī)指令的含義
大概的樣子
改裝后的樣子
在庫里面,我畫圖的地方是舵機(jī)庫的位置
一開始的話就看fw這個就行,下面是用較為低級的一個庫寫的。
單獨的keli工程
終于里面的芯片是這樣的,舵機(jī)馬達(dá)的驅(qū)動IC
IC簡單的介紹
DK是右邊的,方便調(diào)試和下載,量產(chǎn)的時候就用前面的就行。
右邊就是我們的驅(qū)動IC了
這是兩個版本的正反面
當(dāng)然AD里面可以拿到兩個
LP2992
兩版的原理圖
這個就是LDO,輸入的是5V,輸出就3V3
這個驅(qū)動芯片需要5V
3,4是PWM的腳
內(nèi)部的框圖
這個是控制的真值表
這個是預(yù)定的一些參數(shù)
典型波形圖
舵機(jī)的話,就使用這樣的原理圖
這個是main文件
但是具體的實現(xiàn)是在CPP文件里面
這個主控文件,就是這么簡單
在一開始會聲明兩個對象,一個舵機(jī),一個板子的配置
在這個類里面,他包裝了一下舵機(jī)的信息,包括實現(xiàn)的PID功能
這些就是共有的接口
私有的變量,命名清晰贊一個
設(shè)置要轉(zhuǎn)的角度
設(shè)置是否開啟舵機(jī)
設(shè)置轉(zhuǎn)矩的設(shè)置
輸入是是位置和值
這個就是PWM的輸出函數(shù)
放大一點看
這個庫函數(shù)的參數(shù)
-
定時器的句柄,
2.已經(jīng)被配置好的定時器通道,
3.要對比的寄存器值
電機(jī)的轉(zhuǎn)速是和PWM的占空比成正比的。
PWM波的生成
生成的原理
這里就是使用了兩個定時器
下面是4個定時器的通道
還記得板子的斷電信息存儲的功能嗎?這就是儲存數(shù)據(jù)
在每次上電后,都會取里面的數(shù)據(jù)
判斷目前的配置情況
進(jìn)行數(shù)據(jù)的賦值
把取到的數(shù)據(jù)都放在motor的類里面,以便于后面的使用,最后一個就是裝載完成。
初始化兩個PWM的通道
然后這才開始初始化IIC硬件
就是一段代碼了,應(yīng)該是很簡單的
IIC的寄存器就是這些了
使用7位模式
最后的三行代碼
在從模式下接收一定量的數(shù)據(jù),在非阻塞模式下使用中斷 。
param hi2c 指向 I2C_HandleTypeDef 結(jié)構(gòu)的指針,該結(jié)構(gòu)包含 * 指定 I2C 的配置信息。
param pData 指向數(shù)據(jù)緩沖區(qū)的指針
param Size 要發(fā)送的數(shù)據(jù)量 * @retval HAL 狀態(tài)
200HZ下獲取數(shù)據(jù)
頻繁的判斷,舵機(jī)要工作的模式
對電壓的測量是使用的回調(diào)函數(shù)
接下來是大段的協(xié)議封裝
也就是我們的中斷回調(diào)函數(shù)
會先來判斷一下HAL的狀態(tài)
這是要發(fā)送和接受的I2C數(shù)組
看右邊
自己看這個數(shù)組的順
使用的是switch的結(jié)構(gòu)來解讀信息
當(dāng)這個信息是0x01的話,
會從這里的進(jìn)行一個數(shù)據(jù)的組裝
TX萬事了RX,安排發(fā)送
最后是一個控制數(shù)據(jù)的發(fā)送,從ADC讀取,接著是angle角度的計算,把角度給PID的函數(shù)處理,平滑軌跡,最后設(shè)置PWM。
代碼還是看的有點粗,還有很多的細(xì)節(jié)沒有寫,但是學(xué)到的東西已經(jīng)很多了。
不過多數(shù)是這樣的。。。確實很強(qiáng)的大佬~
https://github.com/peng-zhihui/ElectronBot
https://www.tech-harry.cn/archives/4511
https://item.szlcsc.com/145106.html
審核編輯:湯梓紅
-
機(jī)器人
+關(guān)注
關(guān)注
210文章
28109瀏覽量
205861 -
PWM
+關(guān)注
關(guān)注
114文章
5119瀏覽量
213183 -
數(shù)字舵機(jī)
+關(guān)注
關(guān)注
1文章
11瀏覽量
6297
原文標(biāo)題:ElectronBot-數(shù)字舵機(jī)篇
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論