简单理解:STM32 + VOFA 上位机波形调试代码
·
debug_task.h 带行右侧注释版
#ifndef _DEBUG_TASK_H // 头文件防止重复包含宏定义
#define _DEBUG_TASK_H
/*vofa的通道数量*/
#define VOFA_CH_COUNT 20 // VOFA上位机发送通道最大数量
#define VOFA_RECV_CH_COUNT 4 // VOFA上位机下发接收通道数量
/*发送结构体*/
typedef struct{
float fdata[VOFA_CH_COUNT]; // 待发送的浮点数据数组,对应各个通道
const unsigned char tail[4]; /*尾帧 0x00, 0x00, 0x80, 0x7f*/ // VOFA协议固定帧尾标识
}VOFA_Send_Handle_t;
/*接收结构体*/
typedef struct{
float fdata[VOFA_RECV_CH_COUNT]; // 存储上位机下发的多路浮点数据
}VOFA_Recv_Handle_t;
void Debug_Task(void); // 调试任务函数,定时上传电机数据给VOFA上位机
#endif
debug_task.c 带行右侧注释版
#include "debug.h" // 引入本模块头文件
#include <stdlib.h> // 引入标准库头文件
#include "usb_device.h" // 引入USB虚拟串口驱动头文件
/*vofa数据帧*/
VOFA_Send_Handle_t VOFA_Handle = { // 定义VOFA发送帧全局结构体变量
.tail = {0x00, 0x00, 0x80, 0x7f}, // 初始化VOFA协议固定帧尾
};
#include "foc_type.h" // 引入FOC电机控制数据类型头文件
extern abc_t Iabc; // 声明三相电流全局变量
extern alphabeta_t Ialphabeta; // 声明αβ坐标系下电流全局变量
extern qd_t Iqd; // 声明dq旋转坐标系下电流全局变量
void Debug_Task(void) // 调试任务函数实现
{
VOFA_Handle.fdata[0] = Iabc.a; // 通道0:A相电流
VOFA_Handle.fdata[1] = Iabc.b; // 通道1:B相电流
VOFA_Handle.fdata[2] = Iabc.c; // 通道2:C相电流
VOFA_Handle.fdata[3] = Ialphabeta.alpha+3; // 通道3:α轴电流,偏移+3方便波形区分
VOFA_Handle.fdata[4] = Ialphabeta.beta+3; // 通道4:β轴电流,偏移+3方便波形区分
VOFA_Handle.fdata[5] = Iqd.q+5; // 通道5:q轴交轴电流,偏移+5方便波形区分
VOFA_Handle.fdata[6] = Iqd.d+5; // 通道6:d轴直轴电流,偏移+5方便波形区分
VCP_DataTx((uint8_t*)&VOFA_Handle, sizeof(VOFA_Handle)); // 通过USB虚拟串口发送整帧VOFA数据
}
一、整体作用
这段代码是 STM32 + VOFA 上位机波形调试代码,通过 USB 虚拟串口(VCP)把 FOC 电机控制里的各类电流数据实时上传到电脑 VOFA 软件,用来实时看波形、调电机参数、排查算法 bug。
1. 头文件 debug_task.h 作用
- 防止头文件重复包含:
#ifndef _DEBUG_TASK_H避免多次编译报错 - 宏定义通道数量:
VOFA_CH_COUNT=20:最多支持 20 路浮点波形上传VOFA_RECV_CH_COUNT=4:预留 4 路用来接收上位机下发的数据
- 定义 VOFA 协议标准发送结构体:
float fdata[]:存放要画波形的所有浮点数据(三相电流、αβ、dq 电流等)unsigned char tail[4]:VOFA 固定帧尾0x00 0x00 0x80 0x7F,用来让上位机识别一帧完整数据
- 定义接收结构体:预留接收上位机下发浮点指令的缓存
- 声明调试任务函数
Debug_Task()
2. C 文件 debug_task.c 作用
(1)头文件依赖
usb_device.h:调用 USB 虚拟串口发送函数VCP_DataTxfoc_type.h:FOC 电机算法的坐标系数据类型(三相 abc、αβ、dq)
(2)全局 VOFA 帧结构体
VOFA_Send_Handle_t VOFA_Handle = {.tail = {0x00,0x00,0x80,0x7f}};
初始化 VOFA 必须的帧尾标识,上位机靠这 4 个字节区分每一帧数据的边界。
(3)数据来源:FOC 电机算法全局变量
Iabc:电机三相 A/B/C 相实际采样电流Ialphabeta:三相经过克拉克变换后的 α、β 两相静止坐标系电流Iqd:帕克变换后的 d、q 旋转坐标系电流(FOC 核心控制量)
(4)Debug_Task() 核心功能
- 把电机 6 组关键电流赋值到 VOFA 数据数组:
- 通道 0/1/2:A、B、C 三相电流
- 通道 3/4:α、β 轴电流(+3 偏移,防止波形重叠看不清)
- 通道 5/6:q、d 轴电流(+5 偏移,错开波形)
VCP_DataTx:把整个结构体二进制数据通过 USB 虚拟串口一次性发给电脑- 电脑打开 VOFA 软件,选择「浮点帧模式」,就能实时画出 6 条电流波形曲线
二、实际开发用途
- 调试 FOC 算法最常用工具 观察三相电流是否平衡、克拉克 / 帕克变换是否正确、dq 电流闭环控制是否稳定。
- 故障排查 电机抖动、过流、异响、启动失败时,看电流波形就能定位是采样问题、坐标变换错误还是 PI 参数不合适。
- 参数整定 不断修改电流环 PI 参数,通过波形观察超调、稳态误差,调到波形平稳。
- 预留扩展:最多可以上传 20 路变量,后续电压、转速、角度、PI 输出等都可以加进去观测。
三、小补充(你当前代码的小特点)
- 用 USB 虚拟串口传输,速度快、不占用硬件串口,调试不影响其他外设;
- 给 αβ、dq 电流加了固定偏移值(+3、+5),多条波形上下错开,不会重叠遮挡;
- 只做了数据上传,接收结构体只定义没使用,暂时还不能用 VOFA 下发指令控制电机。
更多推荐


所有评论(0)