【干货分享】在 RA-Eco-RA6M4开发板上实现 ADC 电压的 LabVIEW 数据采集

描述

本文介绍了 RA-Eco-RA6M4-100PIN-V1.0 开发板通过 LabVIEW 上位机实现 ADC 电压数据采集的项目设计,采用串口发送和串口中断查询两种方案。
https://bbs.elecfans.com/jishu_2496332_1_1.html


 

RA-Eco-RA6M4-100PIN-V1.0开发板,主控芯片为R7FA6M4AF3CFP。 瑞萨电子 RA6M4 微控制器 (MCU) 产品群使用了支持 TrustZone 的高性能 Arm Cortex-M33 内核。与片内的 Secure Crypto Engine(SCE) 配合使用,可提供安全芯片的功能。集成带有专用 DMA 的以太网 MAC,可确保高数据吞吐率。RA6M4 采用高效的 40nm 工艺,由基于 FreeRTOS 的灵活配置软件包 (FSP) 这一开放且灵活的生态系统概念提供支持,并能够扩展以使用其他实时操作系统(RTOS)和中间件。RA6M4 适用于物联网应用的需求,如以太网、面向未来应用的安全功能、大容量嵌入式 RAM 和较低功耗(从闪存运行 CoreMark 算法,低至 99µA/MHz)。

 


一、项目介绍

开发板工程调试:串口输出 JSON 格式的 ADC 值及其电压转换值;

LabVIEW 上位机设计:包括前面板和程序框图的设计等;

LabVIEW 测试与程序优化:通过串口获取芯片发送的 ADC 数据,提高响应速度、减小延迟;

使用串口中断方案实现 ADC 数值和电压数据的采集,以及相应的 LabVIEW 上位机设计。


 

二、工程调试

在前面完成 UART 串口输出 ADC 数值和电压转换数值的基础上,修改输出格式为 JSON,关键代码如下
 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include "hal_data.h"FSP_CPP_HEADERvoid R_BSP_WarmStart(bsp_warm_start_event_t event);FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;volatile bool uart_send_complete_flag = false;void user_uart_callback (uart_callback_args_t * p_args){    if(p_args->event == UART_EVENT_TX_COMPLETE)    {        uart_send_complete_flag = true;    }}/*------------- UART redirection printf -------------*/#ifdef __GNUC__    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#endifPUTCHAR_PROTOTYPE{        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);        if(FSP_SUCCESS != err) __BKPT();        while(uart_send_complete_flag == false){}        uart_send_complete_flag = false;        return ch;}int _write(int fd,char *pBuffer,int size){    for(int i=0;i    {        __io_putchar(*pBuffer++);    }    return size;}/*------------- ADC callback -------------*/volatile bool scan_complete_flag = false;void adc_callback (adc_callback_args_t * p_args){    FSP_PARAMETER_NOT_USED(p_args);    scan_complete_flag = true;}void hal_entry(void){    /* TODO: add your own code here */    /* Open the transfer instance with initial configuration. */    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);    assert(FSP_SUCCESS == err);    //printf("hello world!\n");    /* Initializes the module. */    err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);    /* Handle any errors. This function should be defined by the user. */    assert(FSP_SUCCESS == err);    /* Enable channels. */    err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);    assert(FSP_SUCCESS == err);    while(1)    {        uint16_t adc_data0=0;        double a0; // define voltage value        /* Enable scan triggering from ELC events. */        (void) R_ADC_ScanStart(&g_adc0_ctrl);        scan_complete_flag = false;        while (!scan_complete_flag)        {            /* Wait for callback to set flag. */        }        err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0);        assert(FSP_SUCCESS == err);        a0 = (double)(adc_data0/4095.0)*3.3; // define voltage formula        //printf("P000(AN0)=%d,voltage=%f\n",adc_data0,a0);        printf("{\"value\": %d, \"voltage\": %f}\n",adc_data0,a0);        R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);    }#if BSP_TZ_SECURE_BUILD    /* Enter non-secure code */    R_BSP_NonSecureEnter();#endif}

保存文件,右键项目 - 构建程序,

右键项目 - 调试项目 - 上传固件至开发板。


 

串口测试

  • TypeC - USB 数据线连接开发板串口和电脑;
  • 打开串口调试助手,配置对应的波特率等参数;
  • 打开串口,即可接收芯片发送的字符串

LabVIEW

此时串口输出数据为标准 JSON 格式,便于后续 LabVIEW 数值读取。


 

三、LabVIEW 上位机
 

包括前面板设计、程序框图设计两部分。

前面板

LabVIEW

使用方法

  • 串口配置:端口号、波特率等;
  • 单击运行按钮,设置文件保存路径;
  • 点击 START 按钮,开始连续采集数据;
  • 采集完成后,点击 STOP 按钮结束程序,数据自动保存至设定路径文件。

程序框图

LabVIEW

连续采集

连续采集

LabVIEW

动态效果见底部视频。

数据保存

点击 Stop 按钮,停止数据采集,文件自动保存至预设路径,3 列数据依次为 日期-时间-数值

LabVIEW


 

四、串口中断
 

除了上述串口不间断发送数据的方案,还可以使用 串口中断 实现 ADC 数据的自动采集。

工程代码

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include "hal_data.h"FSP_CPP_HEADERvoid R_BSP_WarmStart(bsp_warm_start_event_t event);FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;volatile bool uart_send_complete_flag = false;volatile bool uart_receive_complete_flag = false;uint8_t uart_rx_buffer[3] = {0}; // storage the received ordersvoid user_uart_callback (uart_callback_args_t * p_args){    if(p_args->event == UART_EVENT_TX_COMPLETE)    {        uart_send_complete_flag = true;    }    else if(p_args->event == UART_EVENT_RX_COMPLETE)    {        uart_receive_complete_flag = true;    }}/*------------- UART redirection printf -------------*/#ifdef __GNUC__    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#endifPUTCHAR_PROTOTYPE{    err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);    if(FSP_SUCCESS != err) __BKPT();    while(uart_send_complete_flag == false){}    uart_send_complete_flag = false;    return ch;}int _write(int fd,char *pBuffer,int size){    for(int i=0;i    {        __io_putchar(*pBuffer++);    }    return size;}/*------------- ADC callback -------------*/volatile bool scan_complete_flag = false;void adc_callback (adc_callback_args_t * p_args){    FSP_PARAMETER_NOT_USED(p_args);    scan_complete_flag = true;}void hal_entry(void){    /* TODO: add your own code here */    /* Open the transfer instance with initial configuration. */    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);    assert(FSP_SUCCESS == err);    // start interrupt    err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 3);    assert(FSP_SUCCESS == err);    /* Initializes the module. */    err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);    /* Handle any errors. This function should be defined by the user. */    assert(FSP_SUCCESS == err);    /* Enable channels. */    err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);    assert(FSP_SUCCESS == err);    while(1)    {        uint16_t adc_data0=0;        double a0; // define voltage value        // check if receive order        if(uart_receive_complete_flag)        {            uart_receive_complete_flag = false;            // check if `55 AA 10` or `55 AA 11`            if(uart_rx_buffer[0] == 0x55 && uart_rx_buffer[1] == 0xAA)            {                /* Enable scan triggering from ELC events. */                (void) R_ADC_ScanStart(&g_adc0_ctrl);                scan_complete_flag = false;                while (!scan_complete_flag)                {                    /* Wait for callback to set flag. */                }                err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0);                assert(FSP_SUCCESS == err);                a0 = (double)(adc_data0/4095.0)*3.3; // define voltage formula                if(uart_rx_buffer[2] == 0x10) // send ADC value                {                    printf("%d\n", adc_data0);                }                else if(uart_rx_buffer[2] == 0x11) // send ADC voltage                {                    printf("%f\n", a0);                }            }            // restart UART receive            err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 3);            assert(FSP_SUCCESS == err);        }        R_BSP_SoftwareDelay (100, BSP_DELAY_UNITS_MILLISECONDS);    }#if BSP_TZ_SECURE_BUILD    /* Enter non-secure code */    R_BSP_NonSecureEnter();#endif}

保存文件,右键项目 - 构建程序,

右键项目 - 调试项目 - 上传固件至开发板。


 

五、测试

使用串口调试助手测试串口中断响应。

分别以十六进制发送查询代码 55 AA 10 和 55 AA 11 分别获取 ADC 数值和相应的电压值。

LabVIEW

LabVIEW 上位机

基于上述串口中断查询的项目,设计了对应的 LabVIEW 上位机程序,便于自动化数据采集。

前面板

前面板设计包括串口配置、ADC 数值和电压的表盘显示、演化曲线图、控制按钮、数据保存配置等模块。

LabVIEW

程序框图

LabVIEW

操作方法

  • 串口配置:端口号、波特率等;
  • 单击运行按钮,设置文件保存路径;
  • 点击 START 按钮,开始连续采集数据;
  • 采集完成后,点击 STOP 按钮结束程序,数据自动保存至设定路径文件;
    • 再次点击 START 重新采集数据;
    • 点击 Terminate 按钮终止上位机程序。


 


 

六、总结

本文介绍了 RA-Eco-RA6M4-100PIN-V1.0 开发板通过 LabVIEW 上位机实现 ADC 电压数据采集的项目设计,采用串口发送和串口中断查询两种方案,包括项目介绍、工程调试、串口打印 JSON 测试、LabVIEW 上位机设计、程序测试及调优等,为 Renesas 系列产品的开发设计和工业科研等领域的应用提供了参考。


 


LabVIEW

 

声明:本文由电子发烧友社区发布,转载请注明以上来源。如需平台(包括:试用+专栏+企业号+学院+技术直播+共建社区)合作及入群交流,请咨询18925255684(微信同号:elecfans123),谢谢!
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分