【螢火工場GD32VW553-IOT開發板】ADC電壓的LabVIEW采集
🔋 本文介紹了螢火工場 GD32VW553-IOT 開發板通過串口中斷查詢的方式采集 ADC 電壓及溫度轉換數據,并進一步結合LabVIEW上位機實現數據自動采集和實時監測的項目設計。
項目介紹
- 串口中斷查詢,獲取 ADC 電壓數據,以及溫度轉換數據 🍦
- LabVIEW 上位機程序設計 🥧
- 開發板結合 LabVIEW上位機實現 ADC 電壓和溫度數據采集、實時演化曲線的顯示、數據保存 🍫
硬件連接
- RXD -> PB15
- TXD -> PA8
- 3V3 -> VCC
- GND -> GND
示意圖
實物連接
工程創建
-
運行
Embedded Builder
軟件,File
-New
-Project ...
; -
選擇
C/C++
-C Project
- 點擊 Next ; -
設置工程名稱、工程路徑,目標設備選擇
GD32VW553HMQ7
,點擊Finished
完成工程創建。
流程圖
工程代碼
📊 打開 src/main.c
文件,修改代碼如下
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"uint16_t adc_value[2]; // storage adc valuevoid led_spark(void){}void rcu_config(void);
void adc_config(void);
void dma_config(void);
void usart_config(void);int main(void)
{/* system clocks configuration */rcu_config();/* systick configuration */systick_config();/* DMA configuration */dma_config();/* ADC configuration */adc_config();/* USART configuration */gd_eval_com_init(EVAL_COM0);usart_config();while (1){}
}/*!\brief USART interrupt function\param[in] none\param[out] none\retval none
*/
void USART0_IRQHandler(void) {static uint8_t comdata[3];static uint8_t com_index = 0;float temperature;float vref_value;if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){uint8_t data = usart_data_receive(USART0); // 讀取數據comdata[com_index++] = data;if (com_index >= 3){if(comdata[0] == 0x55){if(comdata[1] == 0xAA){switch(comdata[2]){case 0x10:while (!adc_flag_get(ADC_FLAG_EOC));vref_value = (adc_value[1] * 3.3f / 4096);printf("%5.3f\r\n", (double)vref_value);break;case 0x11:while (!adc_flag_get(ADC_FLAG_EOC));temperature = (1.43f - adc_value[0]*3.3f/4096) * 1000 / 4.3f + 25;printf("%2.2f\r\n", (double)temperature);break;}}}com_index = 0;}}
}/*!\brief Enable USART interrupt\param[in] none\param[out] none\retval none
*/
void usart_config(void)
{usart_interrupt_enable(USART0, USART_INT_RBNE); // 接收緩沖區非空中斷eclic_irq_enable(USART0_IRQn, 0, 0); // 使能 USART0 中斷usart_enable(USART0);
}/*!\brief configure the different system clocks\param[in] none\param[out] none\retval none
*/
void rcu_config(void)
{/* enable ADC1 clock */rcu_periph_clock_enable(RCU_ADC);/* enable DMA clock */rcu_periph_clock_enable(RCU_DMA);/* config ADC clock */adc_clock_config(ADC_ADCCK_PCLK2_DIV6);
}
/*!\brief configure the DMA peripheral\param[in] none\param[out] none\retval none
*/
void dma_config(void)
{/* ADC_DMA_channel configuration */dma_single_data_parameter_struct dma_single_data_parameter;/* ADC DMA_channel configuration */dma_deinit(DMA_CH0);/* initialize DMA single data mode */dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA);dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;dma_single_data_parameter.memory0_addr = (uint32_t)(&adc_value);dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;dma_single_data_parameter.number = 2;dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;dma_single_data_mode_init(DMA_CH0, &dma_single_data_parameter);dma_channel_subperipheral_select(DMA_CH0, DMA_SUBPERI0);/* enable DMA circulation mode */dma_circulation_enable(DMA_CH0);/* enable DMA channel */dma_channel_enable(DMA_CH0);
}
/*!\brief configure the ADC peripheral\param[in] none\param[out] none\retval none
*/
void adc_config(void)
{/* ADC contineous function enable */adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);/* ADC scan mode disable */adc_special_function_config(ADC_SCAN_MODE, ENABLE);/* ADC data alignment config */adc_data_alignment_config(ADC_DATAALIGN_RIGHT);/* ADC channel length config */adc_channel_length_config(ADC_ROUTINE_CHANNEL, 2U);/* ADC regular channel config */adc_routine_channel_config(0U, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);adc_routine_channel_config(1U, ADC_CHANNEL_10, ADC_SAMPLETIME_55POINT5);/* ADC trigger config */adc_external_trigger_config(ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE);adc_tempsensor_vrefint_enable();/* ADC DMA function enable */adc_dma_request_after_last_enable();adc_dma_mode_enable();/* enable ADC interface */adc_enable();delay_1ms(1U);/* ADC software trigger enable */adc_software_trigger_enable(ADC_ROUTINE_CHANNEL);
}
🍟 保存代碼,編譯工程,生成 Debug 文件夾,右鍵 bin 文件 - Show In
- System Explorer
,打開文件夾并獲得 *.bin
固件。
固件上傳
📡 采用 ISP 方式上傳固件至開發板。
-
將 BOOT0 拉高,USB 轉 TTL 工具連接開發板;
-
運行 GD32 All-In-One Programmer 軟件;
-
設備端口選擇、串口參數設置,設備名稱選擇 GD32VW553HMQ7 ,點擊
Connect
按鈕(若連接失敗,則短按復位鍵); -
加載鏡像固件、設置起始地址,點擊
Download
按鈕; -
待加載完成,跳帽恢復,將 BOOT0 拉低;
-
短按 RST 復位鍵,程序開始運行。
效果演示
📡 打開串口調試助手,配置串口參數,打開串口,即可觀察到串口輸出文本。
動態演示
LabVIEW 上位機
🔎 LabVIEW 上位機的設計包括 前面板 和 程序框圖 兩部分。
🧵 結合開發板程序可知,
- 當串口接收到
55 AA 10
指令時,反饋 ADC 電壓數據; - 當串口接收到
55 AA 11
指令時,反饋 ADC 溫度數據。
🔮 由此通信協議,設計串口上位機程序,每隔 500 毫秒查詢一次數據,并繪制演化曲線,實時監測電壓和溫度變化情況。
前面板
💡 前面板包括串口配置、儀表盤、演化曲線、保存路徑、數組等模塊。
操作流程
- 選擇串口對應的設備端口號,設置波特率;
- 點擊左上角箭頭按鈕,運行程序,設置數據采集保存文檔的路徑;
- 點擊 START 按鈕,開始采集數據和實時監測 ADC 電壓和溫度演化曲線;
- 采集完成后,點擊 Stop 按鈕結束,同時數據保存至預設路徑;
- 點擊 Terminate 按鈕終止和退出程序。
程序框圖
page 1
page 2
效果
🛠? 程序開始運行后,左側儀表盤顯示實時采集的電壓和溫度數值,曲線繪制相應的數據點和演化曲線。
數據保存
🎨 數據保存為 dat 格式,其中第 1 列為日期時刻、第 2 列為 ADC 電壓值、第 3 列為溫度值。
總結
🔋 本文介紹了螢火工場 GD32VW553-IOT 開發板通過串口中斷查詢的方式采集 ADC 電壓及溫度轉換數據,并進一步結合LabVIEW上位機實現數據自動采集和實時監測的項目設計,為相關嵌入式開發和自動化應用設計提供了參考。