相信這個(gè)東西很多人都見過(guò),大佬做的一個(gè)機(jī)器人
大部分人都是在關(guān)注功能本身,只有我看上了這個(gè)改裝的小舵機(jī)。因?yàn)槭忻嫔系亩鏅C(jī)只能接收PWM信號(hào),進(jìn)行角度控制。
這就有問(wèn)題了。
在這種情況下我們只能發(fā)送指令,讓舵機(jī)運(yùn)動(dòng),卻不能接收指令,從而知道它的運(yùn)動(dòng)狀態(tài)。同時(shí),想要讓舵機(jī)進(jìn)行反驅(qū),就必須能讓舵機(jī)隨時(shí)進(jìn)行輸出力矩的切換。小驅(qū)動(dòng)器支持IIC總線通信,PID閉環(huán)控制,位置回傳,還能設(shè)置最大的輸出力矩,斷電儲(chǔ)存參數(shù)等。

更加詳細(xì)的一些內(nèi)容在readme里面
魔改后的舵機(jī)通過(guò)I2C接口和控制板進(jìn)行通信,STM32F4的控制板為主機(jī),舵機(jī)為從機(jī)。通信的過(guò)程始終是主機(jī)發(fā)起的,主機(jī)首先下發(fā)位置、參數(shù)等指令,然后即時(shí)取回相關(guān)數(shù)據(jù)完成一個(gè)通信來(lái)回。
每個(gè)舵機(jī)作為從機(jī)接收兩個(gè)地址的指令:自己的ID號(hào),以及0號(hào)廣播。廣播用于在沒有給舵機(jī)設(shè)置地址的時(shí)候作為通配地址使用(比如你剛燒寫完舵機(jī)固件,此時(shí)舵機(jī)的Flash是沒有儲(chǔ)存自己的ID的,只能通過(guò)0號(hào)地址通信)。
值得注意的是:舵機(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ī)的通信代碼,不然也會(huì)造成輪詢等待超時(shí)。

舵機(jī)指令的含義

大概的樣子

改裝后的樣子

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

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

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

IC簡(jiǎn)單的介紹

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

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

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

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

LP2992


兩版的原理圖

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

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

3,4是PWM的腳

內(nèi)部的框圖

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

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

典型波形圖

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

這個(gè)是main文件

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

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

在一開始會(huì)聲明兩個(gè)對(duì)象,一個(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è)庫(kù)函數(shù)的參數(shù)

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

PWM波的生成

生成的原理

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

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

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

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

判斷目前的配置情況

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

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

初始化兩個(gè)PWM的通道

然后這才開始初始化IIC硬件

就是一段代碼了,應(yīng)該是很簡(jiǎn)單的

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ī)要工作的模式

對(duì)電壓的測(cè)量是使用的回調(diào)函數(shù)

接下來(lái)是大段的協(xié)議封裝
也就是我們的中斷回調(diào)函數(shù)

會(huì)先來(lái)判斷一下HAL的狀態(tài)

這是要發(fā)送和接受的I2C數(shù)組

看右邊

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

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

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

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

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