RA4M2开发IOT(11)----ADC检测电压
RA4M2开发IOT.11--ADC检测电压
- 概述
- 视频教学
- 样品申请
- 硬件准备
- 参考程序
- ADC配置
- ADC属性配置
- R_ADC_Open()函数原型
- R_ADC_ScanCfg()函数原型
- R_ADC_ScanStart()函数原型
- 回调函数adc_callback ()
- OLED显示
概述
在上一章基础上,项目再接入一个 10 kΩ 线性滑动变阻器 并利用 RA4M2 片上 12-bit ADC 测量滑柄输出电压。
最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。
视频教学
https://www.bilibili.com/video/BV1TrN2zzEst
RA4M2开发IOT(11)----ADC检测电压
样品申请
https://www.wjx.top/vm/rCrkUrz.aspx
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL#AA0
同时添加RA4M2_IOT扩展版。
参考程序
https://github.com/CoreMaker-lab/RA4M2_IOT
https://gitee.com/CoreMaker/RA4M2_IOT
ADC配置
开IOT板中有个滑动变阻器,需通过跳线帽进行接线,最后由P015进行检测。
CN14不接,CN13接上面2个排针,CN16短接。
点击Stacks->New Stack->Driver->Analog -> ADC (r_adc)。
ADC属性配置
● Name:g_adc0该 ADC 实例的名称,在代码中用于引用此 ADC 设备。
● Unit:0表示使用的是 ADC0 设备(MCU 可能有多个 ADC 单元,如 ADC0、ADC1 等)。
● Resolution:12-Bit选择 ADC 分辨率为 12 位,即转换后的数值范围为 0~4095(2^12 = 4096)。
● Alignment:Right选择数据右对齐,即 ADC 结果存储时,低 12 位有效,高位填充 0。
● Clear after read:On每次读取 ADC 结果后,寄存器会自动清除,防止旧数据干扰新采样。
● Mode:Single Scan单次扫描模式,即每次触发 ADC 转换后,仅采样一次选中的通道。
● Normal/Group A Trigger:SoftwareADC 触发方式为软件触发,即需要手动调用 API R_ADC_ScanStart() 来启动转换。
● Callback(回调函数):指定回调函数 adc_callback,用于 ADC 转换完成后的事件处理。
● Scan End Interrupt Priority(扫描结束中断优先级):Priority 2ADC 扫描结束中断的优先级设置为 2(数值越小,优先级越高)。
● AN013 → P015 :ADC 通道 13(AN013)映射到 P015 引脚,即 ADC 采样的模拟信号输入在 P015 引脚。
R_ADC_Open()函数原型
故可以用R_ADC_Open() 函数进行配置,开启和初始化ADC模式。
R_ADC_ScanCfg()函数原型
配置ADC扫描参数,赋能ADC通道。在此函数中设置通道特定设置。
R_ADC_ScanStart()函数原型
启动扫描,若设置为单次扫描,每次扫描完一次都需要重新开启。
在app_peripheral_init函数中添加ADC初始化。
/* 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);/* Enable scan triggering from ELC events. */(void) R_ADC_ScanStart(&g_adc0_ctrl);
回调函数adc_callback ()
每次扫描完之后都会进入回调函数中。
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;
}
OLED显示
在OLED_DrawPage_TUYA函数中,添加对应下面代码,主要在Page-0页显示ADC值和电压值。
/* ─────────────────── OLED 行标签 ────────────────────────── */OLED_ShowString(0, 48, (u8 *)"ADC:", 16, 1); // 第 6 行左侧:显示 “ADC:”OLED_ShowString(64, 48, (u8 *)"VOL:", 16, 1); // 第 6 行偏右:显示 “VOL:”/* ─────────────────── ADC 采样并换算 ─────────────────────── */uint16_t adc_data13 = 0; // 存放通道 AN013 原始 12-bit 数据double a13; // 转换后的电压值 (单位 V)uint32_t t100; // 小数两位 ×100 的临时变量R_ADC_ScanStart(&g_adc0_ctrl); /* 启动一次软件触发扫描 */scan_complete_flag = false; /* 在 ADC 回调中置位 */while (!scan_complete_flag) /* 等待扫描完成 */{/* Wait for callback to set flag. */}/* 读取通道 13 (对应 P015) 原始值 --------------------------- */err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_13, &adc_data13);assert(FSP_SUCCESS == err);/* 将 0-4095 映射到 0-3.3 V ---------------------------------- */a13=(double)(adc_data13/4095.0)*3.3;
// printf("P014(AN12)=%d,voltage=%f\n",adc_data13,a13);/* ─────────────────── OLED 数值显示 ─────────────────────── *//* ADC 原码:4 位十进制,例如 0000–4095 */OLED_ShowNum(32, 48, adc_data13, 4, 16,1);/* 电压整数位:0–3(3.3 V 情况下最大为 3) */OLED_ShowNum (96, 48,(uint32_t)fabs(a13),1,16, 1);/* 小数点 '.' */OLED_ShowChar (104, 48, '.',16, 1);/* 小数后两位:把电压 ×100 再取低 2 位 */t100=(uint32_t)(fabs(a13)*100);OLED_ShowNum (112, 48,(uint32_t)t100%100,2,16, 1);