手写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条曲线了。
上一篇:STM32MP1xx启动流程详解
下一篇:常见STM32术语解释
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




