RA MCU众测宝典 | ADC/DAC之【RA2L1】DAC电压输出及ADC电压采集实验

描述

 

RA MCU众测宝典ADC/DAC通信专题上线啦!


 

咱们接下来要解锁嵌入式开发中“连接模拟与数字世界”的关键技能——ADC/DAC 专题。


 

这次,瑞萨嵌入式小百科将和大家一起聚焦【瑞萨RA2L1】开发板,一步步玩转DAC电压输出与ADC电压采集:从12位DAC的引脚配置、ADC的单通道扫描设置,到代码中实现电压值的动态调整与串口打印,一起感受“数字信号转模拟电压”“模拟电压变数字数据”的奇妙过程。


 

开启宝典

1

前言
 

 

本次实验内容是先用DAC做电压输出,再用ADC进行电压采集,最后在串口打印查看。


 


 

2

硬件部分

2.1

DAC

DAC为数字/模拟转换模块,顾名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。


 

在常见的数字信号系统中,大部分传感器信号被化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。


 

RA2L1开发板搭载的R7FA2L1AB2DFL芯片拥有12位的DAC。


 

2.2

ADC

ADC即模拟-数字转换器(Analog-to-digital converter),是一种用于将连续的模拟信号转换为离散的数字信号的器件。就比如我们可以将我们生活中的温度、压力、声音这样的模拟信号通过ADC转化为可以通过单片机处理的数字信号。


 

RA2L1开发板搭载的R7FA2L1AB2DFL芯片拥有12位的ADC。


 

3

软件部分
 


 

将先前的P项目模板复制一份,重命名为02_DAC-ADC-Voltage


 

3.1

配置DAC

先进入Pins页面。

adcadc

左右滑动查看全部


 

再来到Stacks页面。

adcadc

左右滑动查看全部


 

最后配置DAC的属性。

adcadc

左右滑动查看全部


 

3.1

配置ADC

进入Pins页面。

adcadc

左右滑动查看全部


 

进入Stacks页面。

adcadcadcadcadcadcadcadc

左右滑动查看全部


 

配置完成后,生成项目代码。


 

3.3

编写代码

3.3.1 新建adc.h

新建文件adc.h,加入以下代码

左右滑动查看完整内容

  •  
  •  
  •  
  •  

#ifndef ADC_H_#define ADC_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)    {        /* Wait for callback to*/    }}


 

3.3.3 修改hal_entry.c

在这里要实现用DAC输出电压,ADC采集电压,每隔200ms递增或递减一次DAC输出的电压值,同时打印到串口。


 

hal_entry.c的文件开头加入:

左右滑动查看完整内容

  •  
  •  

#include"adc.h"uint16_t adc_data = 0;


 

hal_entry函数中加入:

左右滑动查看完整内容

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

typedefenum    {        up,        down    } Direction;    Direction d = up;    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);        double volt = (double)(adc_data / 4095.0) * 3.3;        printf("adc_data: %d, 电压: %.3lf V\n", adc_data, volt);        if (d == up)        {            dac_value += 500;        }        else        {            dac_value -= 500;        }        if (dac_value >= 4000)        {            d = down;        }        if (dac_value == 0)        {            d = up;        }        R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);    }


 

注意,这里是用了面向对象的编程方法,参考教程为:《ARM嵌入式系统中面向对象的模块编程方法》基于DShanMCU-RA6M5(瑞萨MCU)。


 

也可以用瑞萨FSP库的函数编程,一样的。例如:

左右滑动查看完整内容

  •  

g_dac0.p_api->write(&g_dac0_ctrl, dac_value);


 

就可以用FSP库代替。

左右滑动查看完整内容

  •  

R_DAC_Write(&g_dac0_ctrl, dac_value);


 

4

下载测试

 

把编译好的程序下载到开发板并复位,将P000引脚与P014引脚短接,打开串口助手,可观察到输出的adc值与算得的电压值。


 

adc

点击可查看大图


 

5

工程附件

adc


 

工程附件链接

https://ramcu.cn/uploads/02_DAC-ADC-Voltage_1751363208.zip

adc


 

完成【RA2L1】开发板的ADC/DAC实验,是不是对“模拟与数字信号的转换”有了更直观的认知?


 


 

从DAC输出电压的递增递减,到ADC精准采集后换算成具体电压值并打印,每一步都让我们掌握了嵌入式系统处理模拟信号的核心方法。这些在后续做传感器项目(比如温感、光敏采集)时都能用得上。


 


 

下一个新专题“IIC”已经安排上了——接下来咱们要解锁“嵌入式多设备协同通信”的技能,比如通过IIC连接温湿度传感器、OLED显示屏,实现多模块的数据交互。关注瑞萨嵌入式小百科,咱们马上开启“设备组网通信”的新学习之旅!


 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分