ul0tWT

SimpleFOC brushless driver supporting CAN communication

 
Overview

## 项目简介

这是本人一个机器人项目的一个子模块(也可用在其他地方),基于 STM32 芯片、支持CAN通信的无刷电机驱动板,有如下特性:

- 芯片方案
- 主控芯片:STM32F103C6T6
- 驱动芯片:DRV8313
- 磁编码器:AS5600
- CAN驱动芯片:TJA1050T
- 仅支持电压控制扭矩,硬件不支持电流闭环
- 使用 CAN 通信控制(硬件留有串口但程序没有使用)
- 可反馈转角和转速,反馈频率500Hz
- 使用按钮设置电机ID或触发自动标定,产生的参数支持掉电保存
- PCB 尺寸:直径30mm
- 本项目中供电电压:12V
- 物料成本:约¥25

> 注:经测试 STM32F103C8T6 可直接替换,软硬件都可直接兼容

完整的机器人项目可以查看这个视频:
[https://www.bilibili.com/video/BV1bP411k75b/](https://www.bilibili.com/video/BV1bP411k75b/)
完整项目开源链接:[Gitee](https://gitee.com/skythinker/foc-wheel-legged-robot) [Github](https://github.com/Skythinker616/foc-wheel-legged-robot)

## 软件说明

STM32 程序见附件,程序开发环境为 Keil uVision 5,使用 STM32CubeMX v5.6.0 生成工程,使用 HAL 库编写

FOC核心算法参考了CSDN博主 [loop222](https://blog.csdn.net/loop222) 所移植的C语言版 SimpleFOC,本程序将其移植到了HAL库中,并添加了CAN通信、Flash掉电存储、蜂鸣、按键、LED、滤波等功能

## 使用说明

### 硬件设置

1. 将驱动板与电机固定在一起,电机转子上的径向磁铁与磁编码器对正且相距2~3mm

2. 驱动电路板使用2.54mm排针孔引出了电机三相线、CAN总线、电源、SWD调试接口和串口,用户可根据需要自行焊接

> 注:电源建议选择12V左右,具体范围可以参考DRV8313芯片的电压范围和降压LDO芯片的最高耐压

### 驱动ID设置及自动标定

**驱动ID**:区分一条CAN总线上多个电机的标识,范围1-8,同一总线上的驱动ID不能重复

**自动标定**:驱动需要知道电机的极对数、零点偏移量、传感器方向信息,这些信息可以通过自动标定获得

- 在正常运行状态下,LED的闪烁代表电机当前ID
- 按下按钮不松手即可进入ID设置,此时LED会以500ms周期闪烁,闪烁第N次时松手即可设置ID为N
- 闪烁次数超过8次仍不松手,LED会常亮2秒,此时松手即可进入自动标定
- 若2秒后仍然不松手,LED会熄灭,此后松手不会触发任何操作
- 自动标定时,电机会缓慢旋转,需确保电机处于空载状态,尽可能减少旋转阻力,标定成功后会播放开机音效

### CAN通信协议

CAN通信使用标准帧,波特率为1Mbps

**驱动反馈数据帧格式**:

不同ID的驱动板会使用不同的CAN数据帧标识符(StdID)发送反馈数据:

| 驱动ID | StdID | 帧类型 | DLC |
| :------: | :----------: | :----: | :-: |
| N | 0x100+N | 标准帧 | 8 |

| DATA[0-3] | DATA[4-5] | DATA[6-7] |
| :------: | :------: | :------: |
| 累计转角*1000 | 当前转速*10 | 保留 |
| 单位rad | 单位rad/s | / |
| int32_t | int16_t | / |

**驱动板接收电压指令数据帧格式**:

为节省总线带宽,不同ID的驱动板不会使用完全不同的数据帧接收数据,而是共用一个数据帧中的不同字节

共用接收数据帧 **StdID = 0x100** 的四个驱动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 |

共用接收数据帧 **StdID = 0x200** 的四个驱动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 |

That is to say, if a data frame with StdID=0x100 is sent to the bus, the driver boards with IDs 1-4 will receive the command at the same time; if a data frame with StdID=0x200 is sent, the driver boards with IDs 5-8 will receive the command. Go to instruction

## Improvement direction

- AS5600 magnetic encoder data is not stable enough and the sampling frequency is not high enough (the maximum measured by software IIC is about 2KHz), leaving little room for filtering algorithm, you can consider replacing it with a better encoder
参考设计图片
×
 
 
Search Datasheet?

Supported by EEWorld Datasheet

Forum More
Update:2025-06-24 18:24:19

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
community

Robot
development
community

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号