VESC4
本章将分析 VESC 官方固件中关于 CAN 通信的代码,并介绍如何使用 CAN 总线进行 VESC 多电机控制。
前言
推荐没有 CAN 通信软件基础的读者先阅读《一文学会手写CAN通信,CUBEMX+STM32+HAL库》
这篇文章详细讲解了 CAN 收发配置、函数代码,有完整的代码示例,只需略微修改即可适配 VESC CAN 通信。
VESC 端 CAN 接收
- 数据帧格式:扩展格式(29位ID)。
- VESC ID:仲裁段(ID)取低8位。
- VESC 指令值:仲裁段(ID)取高21位。
常用指令表
| 指令 | 指令值(十进制) | 内容 | 数据长度(字节) | 数据类型 | 物理单位 |
|---|---|---|---|---|---|
| CAN_PACKET_SET_DUTY | 0 | 设置占空比 | 4 | int32_t | duty cycle * 1e5 (50000 -> 50%) |
| CAN_PACKET_SET_CURRENT | 1 | 设置电流 | 4 | int32_t | mA |
| CAN_PACKET_SET_CURRENT_BRAKE | 2 | 设置制动电流 | 4 | int32_t | mA |
| CAN_PACKET_SET_RPM | 3 | 设置电转速 | 4 | int32_t | erpm |
其余指令可以参考 VESC 官方固件中的 comm_can.c 及 datatypes.h 文件。
指令发送示例
1 | void fdcan_send_vesc(FDCAN_HandleTypeDef *hfdcan, motor_vesc_t *motor_vesc) |
将指令和 vesc id 打包成 CAN 报文 ID,指令内容作为报文数据段。
USER 端 CAN 接收
- 数据帧格式:扩展格式(29位ID)。
- VESC ID:仲裁段(ID)取低8位。
- VESC 状态值:仲裁段(ID)取高21位。
常用状态表
| 状态 | 状态值(十进制) | 内容 | 数据长度(字节) | 数据类型 |
|---|---|---|---|---|
| CAN_PACKET_STATUS | 9 | 转速、电机电流、占空比 | 8 | int32_t, int16_t, int16_t |
| CAN_PACKET_STATUS_2 | 14 | 安时、电池安时 | 8 | int32_t, int32_t |
| CAN_PACKET_STATUS_3 | 15 | 瓦时、电池瓦时 | 8 | int32_t, int32_t |
| CAN_PACKET_STATUS_4 | 16 | MOSFET温度、电机温度、输入电流、电机位置 | 8 | int16_t, int16_t, int16_t, int16_t |
其余指令可以参考 VESC 官方固件中的 comm_can.c 及 datatypes.h 文件。
指令接收示例
1 | switch (status){ |
其中 data 为接收到的 CAN 报文数据段,为长度为 8 的 uint8_t 数组。
结尾
VESC 系列教程到这里算是告一段落了。(撒花~)
粗略涵盖了 原理图、PCB、测试、上位机、软件 全流程,非常感谢你的阅读!
若有任何疑问,欢迎邮件交流~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Poria Cocos的海边小居!




