这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案

共2条 1/1 1 跳转至

【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案

工程师
2025-03-23 22:18:11   被打赏 20 分(兑奖)     打赏

 硬件:RA2E1开发板

 软件:e2studio Version: 2024-10 (24.10.0)

 调试器:J-link V9

 今天继续和大家分享使用瑞萨的开发板实现位移传感器的采集方案;

简单和大家分享一下瑞萨RA2E1的ADC知识:   

一:ADC的基本知识如下所示:

ADC,全称为模拟-数字转换器(Analog-to-Digital Converter),是一种电子设备,其主要功能是将连续的模拟信号转换为离散的数字信号。举例来说,我们日常生活中的温度、压力和声音等模拟信号,可以通过ADC转换为单片机能够处理的数字信号。

二:瑞萨RA2E1 ADC 简单描述

ADC的特征如下:

2 个 ADC 转换单元。

支持高达 26 个通道。其中有三组通道(AN000& AN100、AN001 & AN101 和 AN002 &AN102)分别共用相同的引脚,因此通道AN000和 AN100 不可同时使用,AN001 和 AN101.AN002 和 AN102 这两组也同理。

支持内部温度传感器,可以检测芯片运行温度;支持测量内部参考电压。

逐次逼近型 ADC,支持的分辨率:12-bit,10-bit.8-bit。

转换时间很短:0.4 μs/每通道(这是在使用 12-bit ADC、时钟 PCLKC(ADCLK)等于 50 MHz的条件下)。

PCLKA 是 RA2E1的ADC 外设模块的时钟,用于驱动外设模块的工作;而 PCLKC (ADCLK)是用于 A/D 转换的时钟,它们的频率需要保持一定的比例。PCLKA与PCLKC(ADCLK)的时钟频率比可以设置为:1:1,2:1,4:1,8:1,1:2,1:4。

可启用的 A/D 数据存储缓冲区是一个环形缓冲区,由 16 个缓冲组成,用于顺序存储 AD转换后的数据。

三:ADC的系统框图如下:

1.png

ADC0 的参考电压为 VREFH0 和 VREFL0、输人电压范围为:VREFLO≤VINSVREFH0;

ADC 的模拟输入通道:

ANOxx 是 ADC0 的模拟输入通道(xx 为通道号);可选通道如下所示:

2.png

触发来源:

中断请求信号

事件输出到 ELC 信号

同步触发信号

异步触发信号

四:任务创建过程

4.1 增加ADC通道

3.png

4.2 配置ADC的通道属性

4.png

五:任务编写:

5.1 程序流程图如下所示:

5.png

5.2 ADC初始化函数如下“

/* Initializes the module. */
err = R_ADC_Open(&g_adc1_ctrl, &g_adc1_cfg);

assert(FSP_SUCCESS == err);

err = R_ADC_ScanCfg(&g_adc1_ctrl, &g_adc1_channel_cfg);
assert(FSP_SUCCESS == err);

5.3 ADC读取函数如下:

volatile bool scan_complete_flag = false;
void adc1_callback (adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}

double  adcVolate; //adc电压值
uint16_t adcSample ;  //adc采样值

void ReadAdcSample(void)
{
(void) R_ADC_ScanStart(&g_adc1_ctrl);
scan_complete_flag = false;
while (!scan_complete_flag)
{

}
err =R_ADC_Read(&g_adc1_ctrl, ADC_CHANNEL_1, &adcSample);
assert(FSP_SUCCESS == err);
adcVolate =(adcSample/4095.0)*3.3;
}

5.4 主程序执行如下:

R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
/*        printf("EEPW test data \r\n");
        SendTestData(0x01);
        Add_Write_Data(0x12,12);*/
/*处理串口屏数据信息*/
DealDwinData();
/*处理串口屏按键信息*/
DealTouchPanelInfo(ucKeyValue);
/*读取ADC数据*/
ReadAdcSample();
printf("EEPW test data = %5d\r\n",adcSample);

5.4数据输出图片如下所示:

6.png

七:调试心得:

需要注意以下的几个方面:

采样时间:根据信号特性选择合适的采样时间,避免信号失真。

参考电压:确保参考电压稳定,以获得准确的转换结果。

噪声抑制:在高速连续转换时,注意电源和信号噪声的影响。

还有就是ADC采集的通道,我之前在使用keil读取多路ADC时候,会导致程序异常的卡死,然后也没有分析出问题来,这次我使用的是E2S进行编程,也没有尝试读取多个通道进行采集,仅仅是读取某个通道,采集数据没有经过处理,直接进行的读取,数据的稳定性还是很不错的,如果经过处理,性能会有更大的提升,虽然没有使用位移传感器,但是使用的电位器,原理是一样的。

视频链接如下所示:

https://www.bilibili.com/video/BV19noxYCE3Z/



院士
2025-03-24 10:40:44     打赏
2楼

话说这ADC采集回来的数字稳吗?

我看你的代码没有添加滤波算法


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]