《RA MCU众测宝典》ADC/DAC通信专题上线!
接下来我们将解锁嵌入式开发中“连接模拟和数字世界”的关键技能——ADC/DAC专题。
这次瑞萨嵌入式百科将和大家一起围绕【瑞萨RA2L1】开发板,一步步玩转DAC电压输出与ADC电压采集:从12位DAC的引脚配置、ADC的单通道扫描设置,到代码中电压值的动态调整和串口打印,一起体验“数字信号到模拟电压”和“模拟电压到数字数据”的奇妙过程。
开启宝典1前言本次实验的内容是先使用DAC进行电压输出,然后使用ADC进行电压采集,最后在串口上打印查看。
2硬件部分2.1DACDAC是数字/模拟转换模块。顾名思义,它的作用就是将输入的数字代码转换成相应的模拟电压输出。其功能与ADC相反。
在常见的数字信号系统中,大多数传感器信号被转换为电压信号,而ADC将电压模拟信号转换为易于计算机存储和处理的数字代码。计算机处理完成后,DAC输出电压模拟信号。这种电压模拟信号常被用来驱动某些执行装置,以便于人类感知。例如音频信号的采集和恢复就是这样一个过程。
RA2L1开发板上配备的R7FA2L1AB2DFL芯片具有12位DAC。
2.2ADCADC是模数转换器,是用来将连续的模拟信号转换成离散的数字信号的器件。例如,我们可以将生活中的温度、压力、声音等模拟信号通过ADC转换成单片机可以处理的数字信号。
RA2L1开发板上配备的R7FA2L1AB2DFL芯片具有12位ADC。
3软件部分复制之前的P 项目模板,重命名为02_DAC-ADC-Voltage3.1配置DAC首先进入Pins 页面。
向左或向右滑动即可查看全部
再次进入堆栈页面。
向左或向右滑动即可查看全部
最后配置DAC的属性。
向左或向右滑动即可查看全部
3.1配置ADC进入Pin 图页面。
向左或向右滑动即可查看全部
进入堆栈页面。
向左或向右滑动即可查看全部
配置完成后,生成项目代码。
3.3编写代码3.3.1新建adc.h新建文件adc.h,添加以下代码
左右滑动查看完整内容#ifndefADC_H_#defineADC_H_voidadc0_waitComplete();#endif
3.3.2 新建adc.c这段代码实现了adc回调函数adc0_callback,当ADC扫描完成时会自动调用该函数。在回调函数中设置标志scan_complete_flag为true,使adc0_waitComplete函数退出无限循环。
新建文件adc.c,添加以下代码
左右滑动查看完整内容#include'adc.h'#include'hal_data.h'
volatilestaticbool scan_complete_flag=true;voidadc0_callback(adc_callback_args_t*p_args){ FSP_PARAMETER_NOT_USED(p_args); scan_complete_flag=true;}
voidadc0_waitComplete(){ scan_complete_flag=false; while(!scan_complete_flag) { /* 等待回调*/}}
3.3.3修改hal_entry.c这里需要使用DAC输出电压,ADC采集电压,每隔200ms增加或减少DAC输出的电压值,同时打印到串口。
在文件hal_entry.c开头添加:
左右滑动查看完整内容#include'adc.h'uint16_tadc_data=0;
在hal_entry函数中添加:
左右滑动查看完整内容typedefenum { 上、下} 方向;方向d=向上; uint16_t dac_value=0; Debug_UART9_Init();//SCI9 UART调试串口初始化g_dac0.p_api-open(g_dac0_ctrl, g_dac0_cfg); g_dac0.p_api-start(g_dac0_ctrl);
g_adc0.p_api-open(g_adc0_ctrl, g_adc0_cfg); g_adc0.p_api-scanCfg(g_adc0_ctrl, g_adc0_channel_cfg); while(1) { g_dac0.p_api-write(g_dac0_ctrl, dac_value); g_adc0.p_api-scanStart(g_adc0_ctrl); adc0_waitComplete(); g_adc0.p_api-read(g_adc0_ctrl, ADC_CHANNEL_0, adc_data);双伏=(双)(adc_data /4095.0) *3.3; printf('adc_data:%d, 电压:%.3lf V\n', adc_data, 伏特); if(d==up) { dac_value +=500; } else { dac_value -=500; } if(dac_value=4000) { d=向下; } if(dac_value==0) { d=向上; R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS); }
注意这里使用的是面向对象的编程方法。参考教程为:基于DShanMCU-RA6M5(瑞萨MCU)的《ARM嵌入式系统中面向对象的模块编程方法》。
也可以使用瑞萨FSP库函数编程,同样的。例如:
左右滑动查看完整内容g_dac0.p_api-write(g_dac0_ctrl, dac_value);
您可以改用FSP 库。
左右滑动查看完整内容R_DAC_Write(g_dac0_ctrl, dac_value);
4下载测试将编译好的程序下载到开发板并复位,短接P000引脚和P014引脚,打开串口助手,观察输出adc值和计算电压值。
点击查看大图
5工程附件
工程附件链接https://ramcu.cn/uploads/02_DAC-ADC-Voltage_1751363208.zip
在【RA2L1】开发板上完成ADC/DAC实验后,您是不是对“模拟与数字信号的转换”有了更直观的认识呢?
从DAC输出电压的递增和递减,到ADC的精确采集并转换为特定的电压值并打印,每一步都让我们掌握了嵌入式系统中处理模拟信号的核心方法。这些可以用于后续的传感器项目(例如温度传感和光敏采集)。
接下来的新专题“IIC”已经安排给——了,接下来我们将解锁“嵌入式多设备协同通信”技术,比如通过IIC连接温湿度传感器和OLED显示屏,实现多模块数据交互。关注瑞萨嵌入式百科,我们即刻开启“设备组网通信”新的学习之旅!
标题:RA MCU众测宝典 | ADC/DAC之DAC电压输出及ADC电压采集实验
链接:https://yqqlyw.com/news/sypc/71067.html
版权:文章转载自网络,如有侵权,请联系删除!