单片机
返回首页

手写STM32 FOC记录-----USART连接vofa+上位机显示波形

2025-10-21 来源:bilibili

电机调试过程中很有必要对相关参数进行监控,最好的方式就是将这些数据输出出来,编程可视化的波形,正好最近看到一款很好用的上位机——vofa+,想了想可以在STM32电机调试过程中用到,将实现过记录下来如下。

1、串口配置

其他基本配置跟前两篇一样,这里不做介绍,有疑问看看前两篇文章。

        根据原理图,选择USART2,模式选择异步通信,配置波特率为115200。

        选择串口引脚,PA2 ->Tx,PA3 ->Rx

    其他不用配置,默认即可,生成代码

2、收发数据验证

测试文件中编写一个串口初始化函数

主要用到以下两个接口函数

HAL_UART_Transmit_IT(&huart2 ,(uint8_t*)StaMessages,sizeof(StaMessages));

HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1);

主函数初始化调用

uint8_t StaMessages[4] = {0x11,0x22,0x33,0x44};

uint8_t RxBuffer[20];

void test_uart_init(void)

{

 

    HAL_UART_Transmit_IT(&huart2 ,(uint8_t*)StaMessages,sizeof(StaMessages)); //初始化发送数据

HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1);//调用中断接收函数,接收长度设为1,接收一个字节进一次中断

}

然后,重写接收回调函数HAL_UART_RxCpltCallback,

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    UNUSED(huart);

    HAL_UART_Transmit(&huart2,(uint8_t*)RxBuffer,1,0xFFFF);  //发送接收到的数据

    HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1);  //再开启接收中断(因为里面中断只会触发一次,因此需要再次开启)

 

}

        需要说明一下的是,在调用接收中断HAL_UART_Receive_IT时,要根据实际情况填写接收长度,这里,我使用1个字节,即串口收到一个字节就进入接收回调,输出接收到的数据。

到这里就完成了,编译下载后,看一下实际效果。

3、FireWater协议连接vofa+输出波形

        这里主要给大家演示一下FireWater协议下的VOFA+使用效果和方法。FireWater协议是CSV风格的字符串流,直观简洁,编程像printf简单。但由于字符串解析消耗更多的运算资源(无论在上位机还是下位机),建议仅在通道数量不多、发送频率不高的时候使用。将鼠标放到FireWater协议上,可以很贴心的得到使用格式帮助。如上图所示,我们使用printf("simples:%f, %fn", sin(t1), sin(t2)")函数进行打印测试。

由于需要使用printf打印输出数据,首先要保证printf可以正常输出,需要重写fputc

主函数调用printf输出测试

测试效果:

编写测试函数,输出三条正弦波

主函数中调用

打开vofa+,做好串口相关配置,拖出波形控件

这里有个小细节,如果下方显示数据正常,右侧通道数据也正常,但是没有波形出现,可以尝试拖动下方彩色球球,试试看波形能否正常显示,具体原因还没有研究明白

4、JustFloat协议连接vofa+输出波形

        FireWater协议仅在通道数量不多、发送频率不高的时候使用,而JustFloat协议是小端浮点数组形式的字节流协议,纯十六进制浮点传输,节省带宽。此协议非常适合用在通道数量多、发送频率高的时候。

编写JustFloat协议测试代码

void vofa_JustFloat_output(void)

{

static float t = 0;

uint8_t tail[4]  = {0x00, 0x00, 0x80, 0x7f};

   

    // 发送数据

    float data[4];  

    data[0] = sin(t);

    data[1] = sin(2*t);

    data[2] = sin(3*t);

    data[3] = sin(4*t);

  HAL_UART_Transmit(&huart2,(uint8_t*)data,sizeof(float) * 4,100);  //发送数据

    // 发送帧尾

HAL_UART_Transmit(&huart2,tail,4,100);

    HAL_Delay(100);

  t += 0.1;

 

}

在主函数中调用

选择JustFloat协议,其他配置与FireWater协议一致。

下方数据显示选择Hex,然后可以看到每包数据都会以00 00 80 7f结束。

这时配置下波形控件,显示4个数据,就可以看到4条曲线了。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章