【萤火工场GD32VW553-IOT开发板】ADC电压的LabVIEW采集

【萤火工场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 文件,修改代码如下

c++ 复制代码
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"

uint16_t adc_value[2]; // storage adc value

void 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上位机实现数据自动采集和实时监测的项目设计,为相关嵌入式开发和自动化应用设计提供了参考。

相关推荐
不会代码的小猴28 分钟前
3. 控件学习1
开发语言·c++·笔记·qt·算法
恒锐丰-罗生1 小时前
国产 H 桥驱动 SS6289|18V/4A 有刷电机驱动芯片性与应用分析 内置采样 + 多保护,门锁 / 机器人优选器件
驱动开发·嵌入式硬件·硬件工程
数字新视界3 小时前
动环监控信创适配助力机房管理智能化转型
物联网·数据中心·动环监控·微模块机房·模块化机房
zcmodeltech5 小时前
工程机械与矿山机械沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的露天开采-井下掘进-智慧矿山全场景联动方案
数据库·stm32·单片机·嵌入式硬件·制造·多分类
烧酒同学5 小时前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
云泽8086 小时前
深入浅出 STM32(十五):多通道GPIO驱动的软件抽象与实现
stm32·单片机·嵌入式硬件
嵌入式阿蔡6 小时前
OTA 实战五(收官):量产落地 Checklist —— 版本号 / 防回滚 / 灰度 / 断点续传
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
乐橙开放平台7 小时前
物业 SaaS 笔记:子账号 Policy 按通道隔离,At_ 管控面 / St_ 数据面治理 accessToken
后端·物联网·音视频
碧海银沙音频科技研究院7 小时前
基于杰理AC7016C的GTCRN门控卷积神经网络语音增强方法
人工智能·嵌入式硬件·语音识别
@呱呱爱学习8 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++