手寫STM32 FOC記錄-----USART連接vofa+上位機顯示波形
????????電機調(diào)試過程中很有必要對相關(guān)參數(shù)進行監(jiān)控,最好的方式就是將這些數(shù)據(jù)輸出出來,編程可視化的波形,正好最近看到一款很好用的上位機——vofa+,想了想可以在STM32電機調(diào)試過程中用到,將實現(xiàn)過記錄下來如下。
1、串口配置
其他基本配置跟前兩篇一樣,這里不做介紹,有疑問看看前兩篇文章。

????????根據(jù)原理圖,選擇USART2,模式選擇異步通信,配置波特率為115200。
????????選擇串口引腳,PA2 ->Tx,PA3 ->Rx

????其他不用配置,默認即可,生成代碼
2、收發(fā)數(shù)據(jù)驗證
測試文件中編寫一個串口初始化函數(shù)

主要用到以下兩個接口函數(shù)
HAL_UART_Transmit_IT(&huart2 ,(uint8_t*)StaMessages,sizeof(StaMessages));
HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1);
主函數(shù)初始化調(diào)用

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));?//初始化發(fā)送數(shù)據(jù)
HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1);//調(diào)用中斷接收函數(shù),接收長度設(shè)為1,接收一個字節(jié)進一次中斷
}
然后,重寫接收回調(diào)函數(shù)HAL_UART_RxCpltCallback,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
????UNUSED(huart);
????HAL_UART_Transmit(&huart2,(uint8_t*)RxBuffer,1,0xFFFF); ?//發(fā)送接收到的數(shù)據(jù)
????HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,1); ?//再開啟接收中斷(因為里面中斷只會觸發(fā)一次,因此需要再次開啟)
?
}
????????需要說明一下的是,在調(diào)用接收中斷HAL_UART_Receive_IT時,要根據(jù)實際情況填寫接收長度,這里,我使用1個字節(jié),即串口收到一個字節(jié)就進入接收回調(diào),輸出接收到的數(shù)據(jù)。
到這里就完成了,編譯下載后,看一下實際效果。

3、FireWater協(xié)議連接vofa+輸出波形
????????這里主要給大家演示一下FireWater協(xié)議下的VOFA+使用效果和方法。FireWater協(xié)議是CSV風(fēng)格的字符串流,直觀簡潔,編程像printf簡單。但由于字符串解析消耗更多的運算資源(無論在上位機還是下位機),建議僅在通道數(shù)量不多、發(fā)送頻率不高的時候使用。將鼠標放到FireWater協(xié)議上,可以很貼心的得到使用格式幫助。如上圖所示,我們使用printf("simples:%f, %f\n", sin(t1), sin(t2)")函數(shù)進行打印測試。

由于需要使用printf打印輸出數(shù)據(jù),首先要保證printf可以正常輸出,需要重寫fputc

主函數(shù)調(diào)用printf輸出測試

測試效果:

編寫測試函數(shù),輸出三條正弦波

主函數(shù)中調(diào)用

打開vofa+,做好串口相關(guān)配置,拖出波形控件

這里有個小細節(jié),如果下方顯示數(shù)據(jù)正常,右側(cè)通道數(shù)據(jù)也正常,但是沒有波形出現(xiàn),可以嘗試拖動下方彩色球球,試試看波形能否正常顯示,具體原因還沒有研究明白

4、JustFloat協(xié)議連接vofa+輸出波形
????????FireWater協(xié)議僅在通道數(shù)量不多、發(fā)送頻率不高的時候使用,而JustFloat協(xié)議是小端浮點數(shù)組形式的字節(jié)流協(xié)議,純十六進制浮點傳輸,節(jié)省帶寬。此協(xié)議非常適合用在通道數(shù)量多、發(fā)送頻率高的時候。
編寫JustFloat協(xié)議測試代碼

void vofa_JustFloat_output(void)
{
static float t = 0;
uint8_t tail[4] ?= {0x00, 0x00, 0x80, 0x7f};
???
????// 發(fā)送數(shù)據(jù)
????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); ?//發(fā)送數(shù)據(jù)
????// 發(fā)送幀尾
HAL_UART_Transmit(&huart2,tail,4,100);
????HAL_Delay(100);
??t += 0.1;
?
}
在主函數(shù)中調(diào)用

選擇JustFloat協(xié)議,其他配置與FireWater協(xié)議一致。

下方數(shù)據(jù)顯示選擇Hex,然后可以看到每包數(shù)據(jù)都會以00?00 80 7f結(jié)束。

這時配置下波形控件,顯示4個數(shù)據(jù),就可以看到4條曲線了。