明日方舟苹果版
3.7G · 2025-10-14
硬件平台:STM32G474VET6 + VESC6电调 + N5065无刷电机
开发环境:CubeMX + CLion + OpenOCD(DAPLink调试器)
上位机:VOFA+ 和 VESC Tool 6.02
后续会将项目代码上传至github
vofa+视角
电机视角
VESC_Tool_6.02.exe
进入左侧菜单:Motor Settings → FOC → General
点击 Run Detection 按钮
按照提示完成:
点击 Apply 保存配置
CAN_STATUS_1_2_3_4_5
500000
(500kbps)STM32G474VETx
VESC6_N5065_Motor_Control
路径:Pinout & Configuration → System Core → RCC
Clock Configuration标签页:
路径:Connectivity → FDCAN1
Mode标签页:
Activated
(勾选)Parameter Settings:
10
13
3
1
1
计算得到波特率:
CAN_Clock = 85MHz / 10 = 8.5MHz
Bit_Time = 1 + 13 + 3 = 17
Baud_Rate = 8.5MHz / 17 = 500kbps
GPIO配置(自动设置):
NVIC Settings(中断配置):
路径:Connectivity → USART1
Mode标签页:
Asynchronous
Parameter Settings:
115200
Bits/s8 Bits
None
1
GPIO配置(自动设置):
NVIC Settings:
路径:Timers → TIM2
Clock Source:
Parameter Settings:
16999
99
Enable
计算公式:
Timer_Clock = 170MHz
Prescaler = 16999 → 实际分频系数 = 17000
Counter_Clock = 170MHz / 17000 = 10kHz
Period = 99 → 实际周期 = 100
Interrupt_Freq = 10kHz / 100 = 100Hz → 10ms中断一次
NVIC Settings:
路径:System Core → GPIO
手动配置两个LED引脚:
配置参数:
路径:System Core → SYS
Debug:
Timebase Source:
路径:System Core → NVIC
NVIC标签页配置优先级:
15
(最低,用于系统滴答)0
(最高,CAN接收)0
(高优先级,串口接收)0
(高优先级,控制任务)Project Manager → Project:
VESC6_N5065_Motor_Control
STM32CubeIDE
Code Generator:
点击右上角 GENERATE CODE 生成工程
CMakeLists.txt
文件在Core
目录下直接添加用户文件:
Core/
├── Inc/ # 头文件目录
│ ├── main.h # CubeMX生成
│ ├── stm32g4xx_it.h # CubeMX生成
│ ├── stm32g4xx_hal_conf.h # CubeMX生成
│ ├── motor_control.h # 手动添加
│ ├── vesc_communication.h # 手动添加
│ ├── vesc_motor.h # 手动添加
│ └── vofa_protocol.h # 手动添加
└── Src/ # 源文件目录
├── main.c # CubeMX生成(需修改)
├── stm32g4xx_it.c # CubeMX生成
├── stm32g4xx_hal_msp.c # CubeMX生成
├── system_stm32g4xx.c # CubeMX生成
├── motor_control.c # 手动添加
├── vesc_communication.c # 手动添加
├── vesc_motor.c # 手动添加
└── vofa_protocol.c # 手动添加
CubeMX生成的CMakeLists.txt已经包含了Core/Inc
和Core/Src
,无需额外修改。 用户自定义文件直接放在这两个目录下即可自动编译。
创建文件:项目根目录创建daplink.cfg
粘贴配置内容:(见项目文件daplink.cfg
)
CLion Run Configuration:
daplink.cfg
.elf
文件STM32引脚 | VESC6引脚 | 说明 |
---|---|---|
PA11 (FDCAN1_RX) | CAN_H | CAN总线H |
PA12 (FDCAN1_TX) | CAN_L | CAN总线L |
GND | GND | 共地 |
STM32引脚 | USB转TTL | 说明 |
---|---|---|
PC4 (USART1_TX) | RX | 串口接收 |
PC5 (USART1_RX) | TX | 串口发送 |
GND | GND | 共地 |
STM32引脚 | DAPLink | 说明 |
---|---|---|
PA13 (SWDIO) | SWDIO | 调试数据 |
PA14 (SWCLK) | SWCLK | 调试时钟 |
GND | GND | 共地 |
3V3 | 3V3 | 供电(可选) |
115200
FireWater
(CSV模式)在VOFA中配置8个通道(按CSV顺序):
target_duty
- 目标占空比current_duty
- 当前占空比current_rpm
- 当前转速target_current
- 目标电流current_current
- 当前电流temp_fet
- MOSFET温度temp_motor
- 电机温度control_type
- 控制模式在VOFA的"发送区"输入以下指令(输入后按回车发送):
切换控制模式:
mode:0 # 占空比模式
mode:1 # 电流模式
mode:2 # 转速模式
mode:3 # 刹车模式
占空比控制(-1.0 ~ 1.0):
duty:0.05 # 正转5%占空比
duty:-0.05 # 反转5%占空比
duty:0 # 停止
电流控制(单位:A):
current:1.5 # 正转1.5A电流
current:-2.0 # 反转2A电流(刹车)
转速控制(单位:RPM):
rpm:1000 # 正转1000RPM
rpm:-500 # 反转500RPM
刹车控制(单位:A):
brake:3.0 # 3A刹车电流
通用目标值设置:
target:0.1 # 根据当前模式设置目标值
使能控制:
enable:1 # 使能电机控制
enable:0 # 禁用电机控制
紧急停止:
stop # 立即停止电机
断开电机,仅连接STM32和VESC6的CAN线
给STM32和VESC分别上电
观察LED指示:
打开VOFA,观察是否收到数据(此时RPM和电流应为0)
duty:0.05
stop
duty:-0.05
stop
duty:0.1
→ duty:0.2
→ duty:0.3
电流模式测试:
mode:1
current:2.0
转速模式测试:
mode:2
rpm:1500
根据你的时钟配置图,让我详细分析CAN波特率的计算过程:
从你的时钟树图可以看到:
PLL配置路径:
CAN波特率由以下参数决定:
波特率 = FDCAN_Clock / (Prescaler × Bit_Time)
其中:
你的配置参数:
Bit_Time = 1 + 13 + 3 = 17 TQ(时间量子)
波特率 = 85,000,000 Hz / (10 × 17)
= 85,000,000 / 170
= 500,000 bps
= 500 kbps
步骤1:计算CAN模块时钟
CAN_Module_Clock = FDCAN_Clock / Prescaler
= 85 MHz / 10
= 8.5 MHz
步骤2:计算波特率
波特率 = CAN_Module_Clock / Bit_Time
= 8.5 MHz / 17
= 500 kbps
参数 | 配置值 | 说明 |
---|---|---|
FDCAN时钟源 | PLLQ = 85 MHz | 来自PLL的Q输出 |
Prescaler | 10 | CAN模块分频 |
Sync_Seg | 1 TQ | 固定值 |
Time_Seg1 | 13 TQ | 传播段+相位段1 |
Time_Seg2 | 3 TQ | 相位段2 |
总位时间 | 17 TQ | 1个CAN位的时间量子数 |
最终波特率 | 500 kbps | 与VESC默认匹配 |
采样点 = (Sync_Seg + Time_Seg1) / Bit_Time = (1 + 13) / 17 = 82.35%
这是一个标准的CAN采样点位置(推荐75%-90%)。
这个配置与VESC Tool中设置的500kbps完全匹配!
可能原因:
VESC_CONTROLLER_ID
是否与VESC Tool设置一致MAX_SAFE_DUTY
是否设置过小原因:字节序错误(小端序 vs 大端序) 解决:使用修正后的vesc_communication.c
代码(大端序发送)
可能原因:
VOFA_Init()
是否调用排查步骤:
处理措施:
在vesc_motor.c
的VESC_Motor_SetTarget()
中:
#define MAX_SAFE_DUTY 0.05f // 调试期间最大5%
调试完成后可修改为更大的值(最大1.0)
建议添加温度保护逻辑:
if (motor.current_temp_fet > 80.0f || motor.current_temp_motor > 80.0f) {
motor.enabled = 0;
VESC_SetDuty(0);
// 触发报警
}
代码中已包含2秒启动延时和3次闪烁指示,避免上电瞬间误动作
可在vesc_motor.c
中添加位置/速度PID控制器,实现精确控制
修改不同的VESC_CONTROLLER_ID
,可同时控制多个电机
结合TIM定时器,实现梯形/S型速度曲线
解析VESC的故障代码,实现故障自动检测和保护
VESC6_CAN_CommandsTelemetry.pdf
教程完成! 按照以上步骤操作,即可实现STM32通过CAN总线控制VESC电调和无刷电机。