## 項(xiàng)目簡介
這是本人一個(gè)機(jī)器人項(xiàng)目的一個(gè)子模塊(也可用在其他地方),基于 STM32 芯片、支持CAN通信的無刷
電機(jī)驅(qū)動(dòng)板,有如下特性:
- 芯片方案
- 主控芯片:STM32F103C6T6
- 驅(qū)動(dòng)芯片:DRV8313
-
磁編碼器:AS5600
- CAN驅(qū)動(dòng)芯片:TJA1050T
- 僅支持電壓控制扭矩,硬件不支持電流閉環(huán)
- 使用 CAN 通信控制(硬件留有串口但程序沒有使用)
- 可反饋轉(zhuǎn)角和轉(zhuǎn)速,反饋頻率500Hz
- 使用按鈕設(shè)置電機(jī)ID或觸發(fā)自動(dòng)標(biāo)定,產(chǎn)生的參數(shù)支持掉電保存
- PCB 尺寸:直徑30mm
- 本項(xiàng)目中供電電壓:12V
- 物料成本:約¥25
> 注:經(jīng)測(cè)試 STM32F103C8T6 可直接替換,軟硬件都可直接兼容
完整的機(jī)器人項(xiàng)目可以查看這個(gè)視頻:
[https://www.bilibili.com/video/BV1bP411k75b/](https://www.bilibili.com/video/BV1bP411k75b/)
完整項(xiàng)目開源鏈接:[Gitee](https://gitee.com/skythinker/foc-wheel-legged-robot) [Github](https://github.com/Skythinker616/foc-wheel-legged-robot)
## 軟件說明
STM32 程序見附件,程序開發(fā)環(huán)境為 Keil uVision 5,使用 STM32CubeMX v5.6.0 生成工程,使用 HAL 庫編寫
FOC核心算法參考了CSDN博主 [loop222](https://blog.csdn.net/loop222) 所移植的C語言版 SimpleFOC,本程序?qū)⑵湟浦驳搅薍AL庫中,并添加了CAN通信、Flash掉電存儲(chǔ)、蜂鳴、按鍵、LED、濾波等功能
## 使用說明
### 硬件設(shè)置
1. 將驅(qū)動(dòng)板與電機(jī)固定在一起,電機(jī)轉(zhuǎn)子上的徑向磁鐵與磁編碼器對(duì)正且相距2~3mm
2.
驅(qū)動(dòng)電路板使用2.54mm排針孔引出了電機(jī)三相線、CAN總線、電源、SWD調(diào)試接口和串口,用戶可根據(jù)需要自行焊接
> 注:電源建議選擇12V左右,具體范圍可以參考DRV8313芯片的電壓范圍和降壓LDO芯片的最高耐壓
### 驅(qū)動(dòng)ID設(shè)置及自動(dòng)標(biāo)定
**驅(qū)動(dòng)ID**:區(qū)分一條CAN總線上多個(gè)電機(jī)的標(biāo)識(shí),范圍1-8,同一總線上的驅(qū)動(dòng)ID不能重復(fù)
**自動(dòng)標(biāo)定**:驅(qū)動(dòng)需要知道電機(jī)的極對(duì)數(shù)、零點(diǎn)偏移量、傳感器方向信息,這些信息可以通過自動(dòng)標(biāo)定獲得
- 在正常運(yùn)行狀態(tài)下,LED的閃爍代表電機(jī)當(dāng)前ID
- 按下按鈕不松手即可進(jìn)入ID設(shè)置,此時(shí)LED會(huì)以500ms周期閃爍,閃爍第N次時(shí)松手即可設(shè)置ID為N
- 閃爍次數(shù)超過8次仍不松手,LED會(huì)常亮2秒,此時(shí)松手即可進(jìn)入自動(dòng)標(biāo)定
- 若2秒后仍然不松手,LED會(huì)熄滅,此后松手不會(huì)觸發(fā)任何操作
- 自動(dòng)標(biāo)定時(shí),電機(jī)會(huì)緩慢旋轉(zhuǎn),需確保電機(jī)處于空載狀態(tài),盡可能減少旋轉(zhuǎn)阻力,標(biāo)定成功后會(huì)播放開機(jī)音效
### CAN
通信協(xié)議
CAN通信使用標(biāo)準(zhǔn)幀,波特率為1Mbps
**驅(qū)動(dòng)反饋數(shù)據(jù)幀格式**:
不同ID的驅(qū)動(dòng)板會(huì)使用不同的CAN數(shù)據(jù)幀標(biāo)識(shí)符(StdID)發(fā)送反饋數(shù)據(jù):
| 驅(qū)動(dòng)ID | StdID | 幀類型 | DLC |
| :------: | :----------: | :----: | :-: |
| N | 0x100+N | 標(biāo)準(zhǔn)幀 | 8 |
| DATA[0-3] | DATA[4-5] | DATA[6-7] |
| :------: | :------: | :------: |
| 累計(jì)轉(zhuǎn)角*1000 | 當(dāng)前轉(zhuǎn)速*10 | 保留 |
| 單位rad | 單位rad/s | / |
| int32_t | int16_t | / |
**驅(qū)動(dòng)板接收電壓指令數(shù)據(jù)幀格式**:
為節(jié)省
總線帶寬,不同ID的驅(qū)動(dòng)板不會(huì)使用完全不同的數(shù)據(jù)幀接收數(shù)據(jù),而是共用一個(gè)數(shù)據(jù)幀中的不同字節(jié)
共用接收數(shù)據(jù)幀 **StdID = 0x100** 的四個(gè)驅(qū)動(dòng)ID為1-4:
| DATA[0-1] | DATA[2-3] | DATA[4-5] | DATA[6-7] |
| :------: | :------: | :------: | :------: |
| ID=1 輸出電壓 | ID=2 輸出電壓 | ID=3 輸出電壓 | ID=4 輸出電壓 |
| 單位mV | 單位mV | 單位mV | 單位mV |
| int16_t | int16_t | int16_t | int16_t |
共用接收數(shù)據(jù)幀 **StdID = 0x200** 的四個(gè)驅(qū)動(dòng)ID為5-8:
| DATA[0-1] | DATA[2-3] | DATA[4-5] | DATA[6-7] |
| :------: | :------: | :------: | :------: |
| ID=5 輸出電壓 | ID=6 輸出電壓 | ID=7 輸出電壓 | ID=8 輸出電壓 |
| 單位mV | 單位mV | 單位mV | 單位mV |
| int16_t | int16_t | int16_t | int16_t |
也就是說,如果向總線發(fā)送StdID=0x100的數(shù)據(jù)幀,那么ID為1-4的驅(qū)動(dòng)板會(huì)同時(shí)接收到指令;如果發(fā)送StdID=0x200的數(shù)據(jù)幀,則ID為5-8的驅(qū)動(dòng)板會(huì)收到指令
## 改進(jìn)方向
- AS5600磁編碼器數(shù)據(jù)不夠穩(wěn)定,采樣頻率也不夠高(軟件IIC實(shí)測(cè)最高約2KHz),留給濾波算法的余地不大,可以考慮更換更好的編碼器