【RA-Eco-RA6M4开发板评测】ADC 电压的 LabVIEW 数据采集
本文介绍了 RA-Eco-RA6M4-100PIN-V1.0 开发板通过 LabVIEW 上位机实现 ADC 电压数据采集的项目设计,采用串口发送和串口中断查询两种方案。
项目介绍
- 开发板工程调试:串口输出 JSON 格式的 ADC 值及其电压转换值;
- LabVIEW 上位机设计:包括前面板和程序框图的设计等;
- LabVIEW 测试与程序优化:通过串口获取芯片发送的 ADC 数据,提高响应速度、减小延迟;
- 使用串口中断方案实现 ADC 数值和电压数据的采集,以及相应的 LabVIEW 上位机设计。
工程调试
在前面完成 UART 串口输出 ADC 数值和电压转换数值的基础上,修改输出格式为 JSON,关键代码如下
#include "hal_data.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_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;
}
}
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#endif
PUTCHAR_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<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
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)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
uint16_t adc_data0=0;
double a0;
(void) R_ADC_ScanStart(&g_adc0_ctrl);
scan_complete_flag = false;
while (!scan_complete_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;
printf("{\"value\": %d, \"voltage\": %f}\n",adc_data0,a0);
R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
保存文件,右键项目 - 构建程序,
右键项目 - 调试项目 - 上传固件至开发板。
串口测试
- TypeC - USB 数据线连接开发板串口和电脑;
- 打开串口调试助手,配置对应的波特率等参数;
- 打开串口,即可接收芯片发送的字符串

此时串口输出数据为标准 JSON 格式,便于后续 LabVIEW 数值读取。
LabVIEW 上位机
包括前面板设计、程序框图设计两部分。
前面板

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

连续采集
连续采集

动态效果见底部视频。
数据保存
点击 Stop 按钮,停止数据采集,文件自动保存至预设路径,3 列数据依次为 日期-时间-数值

串口中断
除了上述串口不间断发送数据的方案,还可以使用 串口中断 实现 ADC 数据的自动采集。
工程代码
#include "hal_data.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_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};
void 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;
}
}
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#endif
PUTCHAR_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<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
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)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 3);
assert(FSP_SUCCESS == err);
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
uint16_t adc_data0=0;
double a0;
if(uart_receive_complete_flag)
{
uart_receive_complete_flag = false;
if(uart_rx_buffer[0] == 0x55 && uart_rx_buffer[1] == 0xAA)
{
(void) R_ADC_ScanStart(&g_adc0_ctrl);
scan_complete_flag = false;
while (!scan_complete_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;
if(uart_rx_buffer[2] == 0x10)
{
printf("%d\n", adc_data0);
}
else if(uart_rx_buffer[2] == 0x11)
{
printf("%f\n", a0);
}
}
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
R_BSP_NonSecureEnter();
#endif
}
保存文件,右键项目 - 构建程序,
右键项目 - 调试项目 - 上传固件至开发板。
测试
使用串口调试助手测试串口中断响应。
分别以十六进制发送查询代码 55 AA 10 和 55 AA 11 分别获取 ADC 数值和相应的电压值。

LabVIEW 上位机
基于上述串口中断查询的项目,设计了对应的 LabVIEW 上位机程序,便于自动化数据采集。
前面板
前面板设计包括串口配置、ADC 数值和电压的表盘显示、演化曲线图、控制按钮、数据保存配置等模块。

程序框图

操作方法
- 串口配置:端口号、波特率等;
- 单击运行按钮,设置文件保存路径;
- 点击 START 按钮,开始连续采集数据;
- 采集完成后,点击 STOP 按钮结束程序,数据自动保存至设定路径文件;
- 再次点击 START 重新采集数据;
- 点击 Terminate 按钮终止上位机程序。
总结
本文介绍了 RA-Eco-RA6M4-100PIN-V1.0 开发板通过 LabVIEW 上位机实现 ADC 电压数据采集的项目设计,采用串口发送和串口中断查询两种方案,包括项目介绍、工程调试、串口打印 JSON 测试、LabVIEW 上位机设计、程序测试及调优等,为 Renesas 系列产品的开发设计和工业科研等领域的应用提供了参考。