前言:分享一下RA8D1,ADC的学习配置过程。
ADC 即模拟-数字转换器(Analog-to-digital converter),是一种用于将连续的模拟信号转换为离散的数字信号的器件。就比如我们可以将我们生活中的温度、压力、声音这样的模拟信号通过 ADC转化为可以通过单片机处理的数字信号。
一:RA8D1的ADC知识分享:
MCU包括12位逐次逼近A/D转换器(ADC12)单元。在单元0中,最多可以选择12个模拟输入通道。在单元1中,最多可以选择13个模拟输入通道、温度传感器输出、内部参考电压、VBATT 1/3电压监视器输出,以便在相应的单元中进行转换。
A/D转换精度可选择为12位、10位和8位,从而可以在生成数字值时优化速度与分辨率之间的权衡。
ADC12支持以下操作模式:
单扫描模式,按通道号升序转换选定通道的模拟输入。
连续扫描模式,以通道号升序顺序连续转换选定通道的模拟输入。
群组扫描模式,将通道的模拟输入分为两组(A组和B组),并按通道编号的升序转换所选通道的模拟输入。
在群组扫描模式下,选择两个群组(群组A和B)。您可以分别选择每个群组(群组A、B)的扫描开始条件,并在不同时间开始每个群组的扫描。此外,当设置群组A的优先级控制操作时,ADC12会在群组B的AD转换期间接受群组A的扫描开始,暂停群组B的转换。这允许您为群组A的A/D转换开始分配更高的优先级
在双触发模式下,所选通道的模拟输入在单扫描模式或组扫描模式(组A)中被转换,由第一和第二A/D转换开始触发转换的数据被存储在不同的寄存器中,提供A/D转换数据的双工。
自我诊断在每次扫描开始时执行一次,ADC12生成的三个参考电压值之一被 A/D 转换。
温度传感器输出和内部参考电压可以与通道的模拟输入同时选择。首先对通道的模拟输入进行第一次A/D转换,然后对温度传感器输出进行转换,最后对内部参考电压进行转换。
ADC12还提供比较功能(窗口A和窗口B)。比较功能指定窗口A的上参考值和窗口B的下参考值,并在所选通道的A/D转换值满足比较条件时输出中断。
A/D数据存储缓冲区是一个由16个缓冲区组成的环形缓冲区,用于顺序存储A/D转换后的数据。
表45.1列出了 ADC12 规范,表45.2列出了功能。图45.1显示了ADC12的框图,表45.3列出了I/0引脚。
二:e2s软件配置过程:
2.1 配置ADC
打开该工程的 FSP 配置界面进行配置。
首先依次点击“Stacks”->“Pins”->“Peripherals”->“ADC0”来配置通道 AN000 对应的引脚为 P004。如下图所示。
2.2 开启ADC任务:
属性参数详细介绍:
配置完毕之后,直接点击生成代码工具就可以。
三:程序编写:
3.1 初始化ADC函数
void ADC_Init(void) { fsp_err_t err; err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg); err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg); assert(FSP_SUCCESS == err); }
3.2 ADC的读取和数据输出函数:
/* 进行ADC采集,读取ADC数据并转换结果 */ double Read_ADC_Voltage_Value(void) { uint16_t adc_data; double a0; (void)R_ADC_ScanStart(&g_adc0_ctrl); while (!scan_complete_flag) //等待转换完成标志 { ; } scan_complete_flag = false; //重新清除标志位 /* 读取通道0数据 */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data); /* ADC原始数据转换为电压值(ADC参考电压为3.3V) */ a0 = (double)(adc_data*3.3/4095); printf("adc_data: %u", adc_data); return a0; }
3.3 主程序如下所示:
/*初始化 串口3部分*/ err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg); if (FSP_SUCCESS != err) { while(1); } ADC_Init(); while(1) { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS); printf("Hello EEPW! by:keyboard007!\r\n"); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_10_PIN_01, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS); ADC0_data = Read_ADC_Voltage_Value(); printf("ADC Voltage = %d V\r\n", ADC0_data); }
四:实物验证:
五:总结如下:
1:使用官方的FSP库配置软件,一键可以配置ADC的基本参数,使用起来很方面。
2:简单测试了一RA8D1 内部ADC的数据,飘动较小,可以用于单端输入的场景。
六:软件代码如下: