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 作用

  1. 防止头文件重复包含:#ifndef _DEBUG_TASK_H 避免多次编译报错
  2. 宏定义通道数量:
    • VOFA_CH_COUNT=20:最多支持 20 路浮点波形上传
    • VOFA_RECV_CH_COUNT=4:预留 4 路用来接收上位机下发的数据
  3. 定义 VOFA 协议标准发送结构体:
    • float fdata[]:存放要画波形的所有浮点数据(三相电流、αβ、dq 电流等)
    • unsigned char tail[4]:VOFA 固定帧尾 0x00 0x00 0x80 0x7F,用来让上位机识别一帧完整数据
  4. 定义接收结构体:预留接收上位机下发浮点指令的缓存
  5. 声明调试任务函数 Debug_Task()

2. C 文件 debug_task.c 作用

(1)头文件依赖

  • usb_device.h:调用 USB 虚拟串口发送函数 VCP_DataTx
  • foc_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() 核心功能

  1. 把电机 6 组关键电流赋值到 VOFA 数据数组:
    • 通道 0/1/2:A、B、C 三相电流
    • 通道 3/4:α、β 轴电流(+3 偏移,防止波形重叠看不清)
    • 通道 5/6:q、d 轴电流(+5 偏移,错开波形)
  2. VCP_DataTx:把整个结构体二进制数据通过 USB 虚拟串口一次性发给电脑
  3. 电脑打开 VOFA 软件,选择「浮点帧模式」,就能实时画出 6 条电流波形曲线

二、实际开发用途

  1. 调试 FOC 算法最常用工具 观察三相电流是否平衡、克拉克 / 帕克变换是否正确、dq 电流闭环控制是否稳定。
  2. 故障排查 电机抖动、过流、异响、启动失败时,看电流波形就能定位是采样问题、坐标变换错误还是 PI 参数不合适。
  3. 参数整定 不断修改电流环 PI 参数,通过波形观察超调、稳态误差,调到波形平稳。
  4. 预留扩展:最多可以上传 20 路变量,后续电压、转速、角度、PI 输出等都可以加进去观测。

三、小补充(你当前代码的小特点)

  1. 用 USB 虚拟串口传输,速度快、不占用硬件串口,调试不影响其他外设;
  2. 给 αβ、dq 电流加了固定偏移值(+3、+5),多条波形上下错开,不会重叠遮挡;
  3. 只做了数据上传,接收结构体只定义没使用,暂时还不能用 VOFA 下发指令控制电机。

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐