手写STM32 FOC记录-----USART连接vofa+上位机显示波形
电机调试过程中很有必要对相关参数进行监控,最好的方式就是将这些数据输出出来,编程可视化的波形,正好最近看到一款很好用的上位机——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, %f\n", 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条曲线了。