相信這個(gè)東西很多人都見過,大佬做的一個(gè)機(jī)器人
大部分人都是在關(guān)注功能本身,只有我看上了這個(gè)改裝的小舵機(jī)。因?yàn)槭忻嫔系亩鏅C(jī)只能接收PWM信號,進(jìn)行角度控制。
這就有問題了。
在這種情況下我們只能發(fā)送指令,讓舵機(jī)運(yùn)動,卻不能接收指令,從而知道它的運(yùn)動狀態(tài)。同時(shí),想要讓舵機(jī)進(jìn)行反驅(qū),就必須能讓舵機(jī)隨時(shí)進(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ù)等指令,然后即時(shí)取回相關(guān)數(shù)據(jù)完成一個(gè)通信來回。
每個(gè)舵機(jī)作為從機(jī)接收兩個(gè)地址的指令:自己的ID號,以及0號廣播。廣播用于在沒有給舵機(jī)設(shè)置地址的時(shí)候作為通配地址使用(比如你剛燒寫完舵機(jī)固件,此時(shí)舵機(jī)的Flash是沒有儲存自己的ID的,只能通過0號地址通信)。
值得注意的是:舵機(jī)和主機(jī)的上電需要有先后順序,一定要先讓從機(jī)初始化完成開始監(jiān)聽數(shù)據(jù),再讓主機(jī)發(fā)送指令!
如果主機(jī)發(fā)送指令的時(shí)候從機(jī)不響應(yīng),或者多個(gè)舵機(jī)地址相同同時(shí)響應(yīng),都可能引起通信錯(cuò)誤,因此需要保證上述的順序。
由于硬件上主機(jī)和舵機(jī)上電都是同時(shí)的,所以在主機(jī)的固件代碼中,有一個(gè)延時(shí)2S的代碼(其實(shí)可以不用那么久),就是等待舵機(jī)都上電初始化完成再開始通信。
調(diào)試的時(shí)候,一個(gè)舵機(jī)一個(gè)舵機(jī)調(diào)試,注釋掉其他未連接的舵機(jī)的通信代碼,不然也會造成輪詢等待超時(shí)。

舵機(jī)指令的含義

大概的樣子

改裝后的樣子

在庫里面,我畫圖的地方是舵機(jī)庫的位置

一開始的話就看fw這個(gè)就行,下面是用較為低級的一個(gè)庫寫的。

單獨(dú)的keli工程
終于里面的芯片是這樣的,舵機(jī)馬達(dá)的驅(qū)動IC

IC簡單的介紹

DK是右邊的,方便調(diào)試和下載,量產(chǎn)的時(shí)候就用前面的就行。

右邊就是我們的驅(qū)動IC了

這是兩個(gè)版本的正反面

當(dāng)然AD里面可以拿到兩個(gè)

LP2992


兩版的原理圖

這個(gè)就是LDO,輸入的是5V,輸出就3V3

這個(gè)驅(qū)動芯片需要5V

3,4是PWM的腳

內(nèi)部的框圖

這個(gè)是控制的真值表

這個(gè)是預(yù)定的一些參數(shù)

典型波形圖

舵機(jī)的話,就使用這樣的原理圖

這個(gè)是main文件

但是具體的實(shí)現(xiàn)是在CPP文件里面

這個(gè)主控文件,就是這么簡單

在一開始會聲明兩個(gè)對象,一個(gè)舵機(jī),一個(gè)板子的配置

在這個(gè)類里面,他包裝了一下舵機(jī)的信息,包括實(shí)現(xiàn)的PID功能

這些就是共有的接口

私有的變量,命名清晰贊一個(gè)

設(shè)置要轉(zhuǎn)的角度

設(shè)置是否開啟舵機(jī)

設(shè)置轉(zhuǎn)矩的設(shè)置

輸入是是位置和值

這個(gè)就是PWM的輸出函數(shù)

放大一點(diǎn)看

這個(gè)庫函數(shù)的參數(shù)

-
定時(shí)器的句柄,
2.已經(jīng)被配置好的定時(shí)器通道,
3.要對比的寄存器值
電機(jī)的轉(zhuǎn)速是和PWM的占空比成正比的。

PWM波的生成

生成的原理

這里就是使用了兩個(gè)定時(shí)器

下面是4個(gè)定時(shí)器的通道

還記得板子的斷電信息存儲的功能嗎?這就是儲存數(shù)據(jù)

在每次上電后,都會取里面的數(shù)據(jù)

判斷目前的配置情況

進(jìn)行數(shù)據(jù)的賦值

把取到的數(shù)據(jù)都放在motor的類里面,以便于后面的使用,最后一個(gè)就是裝載完成。

初始化兩個(gè)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ù)組

看右邊

自己看這個(gè)數(shù)組的順

使用的是switch的結(jié)構(gòu)來解讀信息
當(dāng)這個(gè)信息是0x01的話,

會從這里的進(jìn)行一個(gè)數(shù)據(jù)的組裝

TX萬事了RX,安排發(fā)送

最后是一個(gè)控制數(shù)據(jù)的發(fā)送,從ADC讀取,接著是angle角度的計(jì)算,把角度給PID的函數(shù)處理,平滑軌跡,最后設(shè)置PWM。
代碼還是看的有點(diǎn)粗,還有很多的細(xì)節(jié)沒有寫,但是學(xué)到的東西已經(jīng)很多了。
不過多數(shù)是這樣的。。。確實(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)注
213文章
30892瀏覽量
221158 -
PWM
+關(guān)注
關(guān)注
116文章
5862瀏覽量
224752 -
數(shù)字舵機(jī)
+關(guān)注
關(guān)注
1文章
19瀏覽量
6652
原文標(biāo)題:ElectronBot-數(shù)字舵機(jī)篇
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【資料推薦】數(shù)字舵機(jī)與模擬舵機(jī)的控制方法與性能比較
舵機(jī)是什么?數(shù)字電機(jī)和模擬電機(jī)有什么不同?
數(shù)字舵機(jī)與模擬舵機(jī)的區(qū)別在哪?
HAL庫是如何控制數(shù)字舵機(jī)的
數(shù)字舵機(jī)與模擬舵機(jī)的區(qū)別在哪
數(shù)字舵機(jī)與模擬舵機(jī)有哪些不同之處
數(shù)字舵機(jī)與模擬舵機(jī)的區(qū)別在哪
無刷舵機(jī)與數(shù)字舵機(jī)以及模擬舵機(jī)有哪些區(qū)別
數(shù)字舵機(jī)控制原理是什么_數(shù)字舵機(jī)與模擬舵機(jī)的區(qū)別
dfrobot數(shù)字舵機(jī)Arduino擴(kuò)展板簡介
舵機(jī)是什么_數(shù)字舵機(jī)與模擬舵機(jī)有的區(qū)別
Arduino的實(shí)驗(yàn)例程之9克舵機(jī)實(shí)驗(yàn)的詳細(xì)資料說明
Arduino的實(shí)驗(yàn)例程之9克舵機(jī)實(shí)驗(yàn)的詳細(xì)資料說明
Arduino UNO驅(qū)動數(shù)字舵機(jī)
ElectronBot教程之?dāng)?shù)字舵機(jī)
評論