瑞萨RA4L1 实现 ADC 水位监测
本文介绍了 RA4L1 开发套件和瑞萨 e2 Studio 灵活软件包(FSP)实现 ADC 水位检测的工程设计,工程快速构建等流程。
简介
包括主控和开发板的基本参数和特点介绍。
主控
开发板主控型号为 R7FA4L1BD4CFP
RA4L1 概览
瑞萨电子 RA4L1 MCU 产品组,低功耗 32 位微控制器 (MCU),基于支持 TrustZone? 的 Arm? Cortex?-M33 (CM33) 内核,实现了低工作电压、低功耗与高性能的理想平衡。 RA4L1 的工作电压低至 1.6V,待机电流低至 1.65μA,并具有多种低功耗功能,可根据应用要求实现动态优化功耗/性能。
RA4L1 MCU 具有低功耗功能,例如段码 LCD 显示驱动器和高级安全引擎,以及 RTC、ADC 和定时器。 该系列MCU 集成了 CAN FD、USB 2.0 FS、I2C/I3C 和低功耗 UART 等通信接口,适用于工业自动化、家电、智能家居、消费品、楼宇/家居自动化和医疗等应用。
RA4L1 提供一系列标准 LQFP 和 QFN 封装选项,以及多种节省尺寸的 BGA 和 CSP 选项,可支持 -40 到 125 °C 的工作温度。 支持瑞萨灵活软件包 (FSP) 和整套的软硬件开发工具的全面支持。
详见:RA4L1 - Renesas 瑞萨电子 .
开发套件
RA4L1-SENSOR 套件基于瑞萨 RA4L1 系列微控制器,完美实现了低工作电压、低功耗与高性能之间的理想平衡。RA4L1 微控制器具备多种低功耗功能,包括段码 LCD 显示驱动器、高级安全引擎、RTC、ADC、定时器和低功耗UART 等通信接口,用户可以根据具体应用需求灵活优化功耗与性能的平衡。这使其成为工业自动化、家电、智能家居、消费电子、楼宇自动化以及医疗保健等领域的理想选择。
该套件还包括传感器(SENSOR)系列接口、Arduino Uno扩展接口,并提供对微控制器所有引脚的通孔访问,大大提升了系统的扩展性,助力开发者在高效、灵活的开发环境中进行创新设计。
管脚定义
top view
bottom view
详见:RA4L1: 瑞萨 RA4L1(R7FA4L1BD4CFP#BA0) - Gitee.com
环境搭建
这里使用 Renesas 瑞萨 e2 studio 开发工具,
下载 FSP (flexible software package) 软件包 并安装。
FSP 安装程序内包含 e2 studio 集成开发环境、工具链和 FSP 软件包。
ADC 串口输出
介绍了 RA4L1 实现 ADC 模拟电压采集,并通过串口输出。
创建工程
打开 e2 studio 软件
依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA
依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA4L1BD4CFP ,工具链选择 GNU ARM Embedded
完成工程创建
ADC 读取
介绍了工程新建与 ADC 单通道采集电压的实现。
参考:e2studio开发RA4L1(16)----ADC单通道采集电压-CSDN博客
串口配置
新建串口通信堆栈
New Stack - Connectivity - UART (r_sci_uart)
属性设置
属性 - Module g_uart9 UART (r_sci_uart) - General 、Baud、Interrupts 设置
注意中断 - 回调函数设置
ADC配置
新建ADC堆栈
New Stack - Analog - ADC (r_adc)
属性配置
General 选项下设置 ADC 单次扫描
Input 选项下勾选 Channel25,配置中断与回调函数
ADC 及串口配置完成后,构建工程,确保无误。
代码
修改主函数代码,实现 ADC 采集与重定向串口打印输出。
完整 hal_entry.c 代码
#include "hal_data.h" #include <stdio.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) { //宏将告知编译器回调函数不使用参数 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_data25=0; double a25; /* 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_25, &adc_data25); assert(FSP_SUCCESS == err); a25=(double)(adc_data25/4095.0)*3.3; printf("P510(AN25)=%d,voltage=%f\n",adc_data25,a25); R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } void R_BSP_WarmStart(bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open (&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME); #if BSP_CFG_SDRAM_ENABLED /* Setup SDRAM and initialize it. Must configure pins first. */ R_BSP_SdramInit(true); #endif } } #if BSP_TZ_SECURE_BUILD FSP_CPP_HEADER BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } FSP_CPP_FOOTER #endif
保存文件,构建工程,使用 J-Link 调试和上传固件。
效果演示
分别演示了 A0 引脚悬空、接地、接 3V3 的 ADC 采集与电压串口输出。
A0 悬空
A0 接地
A0 连接 GND,输出电压值约为 0
可见此时 P510(AN25) 输出最小值为 0
A0 接 3V3
A0 连接 3V3 ,输出电压值为 3.30 V
可见此时 P510(AN25) 输出最大值为 4095
水位传感器
水位传感器(Water Sensor)可以检测水位高度(检测高度:0 - 40 mm),亦可用作雨滴传感器,用于各种天气状况的监测,检测是否下雨及雨量的大小,广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。
模块简介
当模块上电,电源指示 LED 点亮;
工作电压:DC 3.3V - 5V ;
输出类型:模拟信号;
传感器具有 10 条裸露的铜线,其中 5 条是电源铜线,另外 5 条是感测铜线。
走线隔行平行排列,每两条电源铜线间有一条感测铜线。
引脚定义
S(信号)为模拟输出;
+(VCC)为传感器供电;
–(GND)为接地。
运行原理
当平行铜线之间有水时,水浸没的高度不同,电流不同。 铜线间的电阻根据水位的变化而变化。
电阻与水的高度成反比(传感器浸水越深,导电性越好,电阻越小,电流越大)。
因此根据 ADC 测量传感器输出的电压,便可以确定水位。
模块原理图
硬件连接
将水位传感器的模拟输出引脚 S 与开发板的 A0 相连,正负极分别与开发板的 3V3 和 GND 相连,示意图如下
A0 引脚对应 MCU 的 adc_channel_25
绘图工具:Cirkit Designer IDE , Fritzing .
水位校准
由于各地的水质差异,导电性能不同,因此需要根据实际情况进行校准。
多次校准,取平均值;
每次校正前,需将 PCB 表面的平行铜线擦干,待测得电压为 0 时再置入水中,记录水位值和电压值。
校准数据采集
水位 10 毫米,相应的串口输出电压为 1.25 伏特
实际水位 22 毫米,相应的串口输出电压为 1.65 伏特
实际水位 37 毫米,相应的串口输出电压为 1.84 伏特
假设 ADC 读取电压(V)与水位高度(mm)为线性相关关系,对上述数据进行拟合
获得拟合表达式 y = 41.774 x - 38.686
这里使用 Excel 软件对数据进行拟合
代码
在代码中添加相应的水位高度定义
while(1) { uint16_t adc_data25=0; double a25,wl; // define wl (water level) (void) R_ADC_ScanStart(&g_adc0_ctrl); scan_complete_flag = false; while (!scan_complete_flag) { } err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_25, &adc_data25); assert(FSP_SUCCESS == err); a25=(double)(adc_data25/4095.0)*3.3; wl = (double)(41.774 * a25 - 38.686); // water level definition equation printf("P510(AN25)=%d, voltage=%f, water level=%f mm\n",adc_data25,a25,wl); // print water level (mm) R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS); }
保存代码,重新构建工程,调试工程,上传工程至开发板;
打开串口助手,连接目标串口对应的设备端口号,打开串口,获取实时 ADC 电压值和水位值。
效果演示
结果分析
经过多次测量,可以获得较为理想的检测结果。
此外,校准和测量过程中发现 ADC 采集的电压值会随时间逐渐减小,可能原因是
PCB 板被液体浸润,液体表面张力导致初始时刻覆盖更大面积的铜板,电阻较小,输出电压较大;
随着时间推移,表面张力被克服,PCB板液面覆盖面积逐渐平稳下降,此时电压也逐渐减小,最后趋于稳定(类似“海水退潮”)。
总结
本文介绍了 RA4L1 开发套件和瑞萨 e2 Studio 灵活软件包(FSP)实现 ADC 水位检测的工程设计,工程快速构建,包括 ADC 采集、串口打印电压值、水位传感器、运行原理、硬件连接、水位校准、代码、效果展示等流程,为瑞萨单片机 ADC 的相关产品设计和快速应用提供了参考。