adc——电压采集25.1. adc简介adc即模拟数字转换器,adc英文全称(analog-to-digital converter), 是一种用于将模拟电压的连续信号转换为离散的数字信号。 就比如我们可以将我们生活中的温度、压力、声音这样的模拟信号通过adc转化为我们可以通过单片机处理的数字信号。
ra6m5 有2个adc单元,每个adc单元有12位、10位、8位读取数据的格式可以选择,在单元0上有13个adc通道,而在单元1上有16个adc通道。 adc单元具有三种扫描方式分别为:单次描模式、连续扫描模式和分组扫描模式, 对于ra6m5来说adc单元具有强大的功能,具体我们可以通过adc特性和adc的结构框图中分析每个部分的功能。
25.1.1. adc特性2 个adc转换单元。可以进行trustzone安全设置。支持内部温度检测,内部参考电压。逐次逼近型adc,支持的分辨率:12-bit, 10-bit, 8-bit。转换时间短:0.4 μs/每通道(12-bit adc、时钟pclkc (adclk)等于50 mhz的条件下)。可启用a/d 数据存储缓冲区是一个环形缓冲区,由16个缓冲区组成,用于顺序存储a/d转换后的数据。自诊断在每次扫描开始时执行一次,在adc执行生成中的三个参考电压值中选择一个a/d转换值。25.2. adc的结构框图### 25.2.1. 电压输入范围
adc输入范围为:vrefl- ≤ vin ≤ vrefh+。 ra6m5的参考电压是由vrefl、vrefh 、avcc0 、avss0 这四个外部引脚决定,且每个单元可以设置不同的参考电压,具体我们可以通过设置不同通道的vrefl、vrefh进行改变。
我们在设计原理图的时候一般把avss0和vrefl接地,把avcc0和vrefh接3v3,得到adc的输入电压范围为:0-3.3v。 如果我们想让输入的电压范围变宽,可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路, 把需要转换的电压抬升或者降压到0~3.3v,这样adc就可以测量了,为了测量的准确性我们还可以加上磁珠进行滤波。
25.2.2. 工作模式在adc单元0中有多达13个模拟输入通道,而在adc单元1中有多达16个模拟输入通道以及内部的温度传感器输出, 两个adc单元加起来总共就拥有了29个adc通道,这么多的adc通道我们该如何使用它们呢? 在这里我们就可以引入工作模式的概念, 我的单片机上的adc处在什么样的工作模式进行adc转换以及我们该如何进行设置。
单次扫描模式:在单次扫描下,一次扫描一个或多个指定通道。连续扫描模式:在连续扫描下,一个或多个指定的通道被重复扫描,直到软件设置寄存器adcsr.adst位为0。分组扫描模式:将所选择的模拟输入通道上分为a组和b组,然后按组对所选择的模拟输入通道进行一次a/d转换。 a、b组可独立选择扫描启动条件,可独立启动a、b组的a/d转换。在单次扫描模式下和在连续扫描模式下,都会从最小的扫描通道开始从低到高进行a/d转换。 如果开启了自诊断模式,在每次扫描开始时执行一次, 并转换三个参考电压中选择一个。 每一种转换都有着它的优点和缺点,但具体使用什么模式进行adc转换,就需要通过我们的项目的需求需要什么样的效果来决定。
25.2.3. 转换过程顺序有三种扫描转换模式分别为:单次扫描模式、连续扫描模式、组扫描模式。 在扫描中,a/d转换是按顺序对指定通道的模拟输入进行的。
单次扫描模式 :
在单次扫描模式转换期间,我们可以通过adst为来判断adc是否处在工作状态,在adc转换的期间adst为将一直保持为1,当所有选定通道的adst转换完成时,将自动设置为0。 然后adc将进入一个等待状态。
当adcsr.adst位通过软件触发器、同步触发器输入(elc)和异步触发器输入被置1的时候,adc转换开始。 对在adansa0和adansa1寄存器中选择的ann通道进行a/d转换,从编号最小的n的通道开始。每当单个信道的a/d转换完成时,a/d转换结果都被存储在关联的a/d数据寄存器(addry)中。当所有选定通道的a/d转换完成时,将生成一个adc12i_adi(i = 0,1)中断请求。连续扫描模式 :
在连续扫描模式下,对指定信道的模拟输入重复执行a/d转换。 这里的adcsr.adst位不会自动清除,只要adcsr.adst位保持1时就会一直的重复步骤2、步骤3、步骤4,直到adcsr.adst位通过软件被置0时adc单元转换才会停止,之后adc单元进入等待状态。
当adcsr.adst位通过软件触发器、同步触发器输入(elc)和异步触发器输入被置1的时候,adc转换开始。 对在adansa0和adansa1寄存器中选择的ann通道进行a/d转换,从编号最小的n的通道开始。每当单个信道的a/d转换完成时,a/d转换结果都被存储在关联的a/d数据寄存器(addry)中。当所有选定通道的a/d转换完成时,将生成一个adc12i_adi(i = 0,1)中断请求。对在adansa0和adansa1寄存器中选择的ann通道进行a/d转换,从编号最小的n的通道开始。组扫描模式 :
在群组扫描模式下,请选择a、b两组,分别选择a、b两组的开始扫描条件,并在不同的时间开始扫描。 另外我们还可以设置优先级,假设我们设置a组优先级高于b组优先级操作时,就可以在b组a/d转换时打断它, 使得a组进行a/d转换,而b组暂停a/d转换。
我们以elc为列例子:使用gpt作为a组的触发源,并使用a组作为b组的触发源。
当elc0上的gpt触发elc_adc(a组)时,a组的adc开始转换。当组a扫描完成时,将生成一个adc12i_adi(i = 0,1)中断。b组的扫描由elc_adc(a组)开始。当b组扫描完成时,如果adcsr.gbadie位为1时将生成一个adc12i_gbadi(i = 0,1)中断。25.2.4. 触发源通道选好了,工作模式也设置好了,那么接下来就需要设置我们的触发源了。 我们可以设置软件来触发adc、或者通过使用elc进行触发、甚至我们还可以使用外部中断进行触发。 最终我们的目的是为了使得adcsr.adst位被置1,以至于我们可以使用不同的方式进行触发。
下图为我们可以在fsp里选择的模式:
25.2.5. adc转换时间25.2.5.1. adc时钟adc输入时钟(转换时钟)adclk由pclkc经过分频产生,最大值是四分频50mhz,adc允许的最大值是50mhz,当我们使用50 mhz的时候12-bit转换时间为0.4 μs。 pclka 和 pclkc (adclk) 的分频比可以设置为 1:1, 2:1, 4:1, 8:1, 1:2, 1:4。
25.2.5.2. 采样时间扫描转换时间(tscan)包括:扫描开始时间(td)、断开检测辅助处理时间(tdis)*1、自诊断a/d转换处理时间(tdiag和tdsd)*2、a/d转换处理时间(tconv)、扫描结束时间(ted)。
a/d转换处理时间(tconv)由输入采样时间(tspl)和逐次逼近转换时间(tsam)组成。 采样时间(tspl)用于在a/d转换器中对采样和保持电路充电。 如果由于模拟输入信号源的高阻抗而没有足够的采样时间,或者如果a/ d转换时钟(adclk)很慢,可以使用adsstrn寄存器来调整采样时间。
由逐次逼近(tsam)转换的时间如下
12位精度需要13个adclk状态10位精度需要11个adclk状态8位精度需要9adclk选择通道数为n的单次描模式下的扫描转换时间(tscan)可确定为:
连续扫描模式下第一个周期的扫描转换时间为单次扫描减去ted的tscan。 连续扫描模式下第二次及后续周期的扫描转换时间固定如下:
25.2.6. 数据寄存器在ra6m5的adc中的数据寄存器有很多种,用来保存不同描模式下的数据 比如:addrn寄存器是16位只读寄存器(n=0~15),用来存储a/d转换结果、adtsdr寄存器用来保存内部的温度传感器数据寄存器、 adrd寄存器是用来自动诊断数据寄存器、adocdr寄存器是adc内部参考电压数据寄存器。
我们还可以通过一些寄存器来设置数据的格式比如: adc转换精度选择由adcer.adprc[1:0]位设置(12位、10位、8位可选)、 adc数据寄存器格式选择位adcer.adrfmt位设置(左对齐或右对齐)
25.2.7. 电压转换模拟电压经过adc转换后,是一个12位的数字值,如果通过串口以16进制打印出来的话,可读性比较差,那么有时候我们就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(用万用表测)对比,看看转换是否准确。
我们一般在设计原理图的时候会把adc的输入电压范围设定在:0~3.3v,因为adc是12位的,那么12位满量程对应的就是3.3v,12位满量程对应的数字值是:2^12。 数值0对应的就是0v。 如果转换后的数值为 x ,x对应的模拟电压为y,那么会有这么一个等式成立: 2^12 / 3.3 = x / y,=> y = (3.3 * x ) / 2^12。
25.3. adc程序设计25.3.1. 硬件设计adc引脚 [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter25/chapter25.html#id22 永久链接至表格)| adc引脚 | p000 |
| ----------------- | ------ |
25.3.2. 软件设计25.3.2.1. 新建工程因为本章节的 adc 相关实验例程需要用到板子上的串口功能,因此我们可以直接以前面的“19_uart_receive_send”工程为基础进行修改。
对于 e2 studio 开发环境:拷贝一份我们之前的 e2s 工程模板 “19_uart_receive_send” , 然后将工程文件夹重命名为 “25_adc” ,最后再将它导入到我们的 e2 studio 工作空间中。
对于 keil 开发环境:拷贝一份我们之前的 keil 工程模板 “19_uart_receive_send” , 然后将工程文件夹重命名为 “25_adc” ,并进入该文件夹里面双击 keil 工程文件, 打开该工程。
25.3.2.2. fsp配置我们先打开e2 studio软件里面的 smart configurator 配置fsp。
双击 configuration.xml 打开配置界面: 然后点开依次点击 stacks -> new stack -> analog -> adc(r_adc) 来配置adc模块。
adc页面的属性介绍
adc 属性介绍 [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter25/chapter25.html#id23 永久链接至表格)| adc属性 | 描述 |
| - | - |
| ----------------------------- |
乌因特指定要使用的adc单元
再接 指定转换分辨率
对准 指定转换结果对齐方式
阅读后清除 读取转换结果后自动清除
模式 模式
双扳机装置 双触发
正常/a 组触发器 a的触发模式
回调 回调函数
扫描结束中断优先级 扫描完成中断优先级
模数转换器环形缓冲器 adc环形缓冲区
配置完成之后可以按下快捷键“ctrl + s”保存, 最后点右上角的 “generate project content” 按钮,让软件自动生成配置代码即可。
25.3.2.3. 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);}r_adc_open()为整个外设设置操作模式、触发源、中断优先级和配置。 如果启用了中断,该函数将注册一个回调函数指针,以便在扫描完成时通知用户。r_adc_scancfg()配置adc扫描参数。 通道特定设置是在这个函数中设置的。25.3.2.4. adc回调函数volatile bool scan_complete_flag = false;void adc_callback(adc_callback_args_t * p_args){ fsp_parameter_not_used(p_args); scan_complete_flag = true;}在fsp配置页面注册回调函数以及优先级,我们就可以使用来自adc的中断回调函数了。
注解
我们通过adc的中断回调函数来判断adc是否转换完成。 我们需要定义了一个布尔类型的数据scan_complete_flag来当做adc读取完成的标志位。 当没有转换完成的时候scan_complete_flag的值一直为false,单adc触发中断的时候将scan_complete_flag的值变为true。
25.3.2.5. 如果未启用中断如果未启用中断,则可使用r_adc_statusget() api 用于轮询 adc 以确定扫描何时完成。 读取 api 函数用于访问转换后的 adc 结果。 这适用于支持校准的mcu的普通扫描和校准扫描。
25.3.2.6. adc读取转换后的数值adc读取思路,我们在这里调用r_adc_scanstart触发相应的adc通道转换,当adc转换完成之后会将scan_complete_flag标志位变为true。 当我们判断到标志位变为true后我们使用r_adc_read()或r_adc_read32()读取转换完成的数值。
double adc_read(void){ uint16_t adc_data; double a0; (void)r_adc_scanstart(&g_adc0_ctrl); scan_complete_flag = false; while (!scan_complete_flag) { ; } r_adc_read(&g_adc0_ctrl, adc_channel_0, &adc_data); a0 = (double)(adc_data*3.3/4095); return a0;}r_adc_scanstart()启动软件扫描或启用扫描的硬件触发器,具体取决于触发器在r_adc_open调用中的配置方式。 如果该单元被配置为elc或外部硬件触发,那么该功能允许触发信号到达adc单元。 该函数不能控制触发器本身的生成。 如果该单元被配置为软件触发,则该功能启动软件触发扫描。r_adc_read()从单通道或传感器寄存器读取转换结果,返回的数据为uint16_t型。r_adc_read32()从单通道或传感器寄存器读取转换结果,返回的数据为uint32_t型。25.3.2.7. hal_entry函数void hal_entry(void){ err = r_sci_uart_open(&g_uart4_ctrl, &g_uart4_cfg); printf(开始读取adc的数值\\r\\n); adc_init(); while(1){ printf(a0=%f\\r\\n,adc_read()); r_bsp_softwaredelay(1000,bsp_delay_units_milliseconds); //大概1秒钟读取一次 }#if bsp_tz_secure_build /* enter non-secure code */ r_bsp_nonsecureenter();#endif}25.3.3. 下载验证用usb线连接开发板“usb to uart”接口跟电脑,在电脑端打开串口调试助手,把编译好的程序下载到开发板。 在串口调试助手可看到adc引脚读出的模拟数值。
柔性制造专家低压电器LN极电工插座解决方案
怎样用HT12E和HT12D制作射频发射器和接收器
金士顿推出Canvas Select Plus系列microSD存储卡,进一步提升用户的体验
如何衡量一款气体报警器的好坏
管道风速传感器功能特点有哪些?
ADC——电压采集
广东联通近期升级了 B 端的服务体验
三极管放大电路的三种组态 放大倍数应该怎么算?
基于无人驾驶飞机系统(UAS)设计的卫星通信解决方案
苹果手机系统iOS 17遭用户质疑
乐视超级电视X65S评测:对比创维65G9200,65寸大屏电视 你选谁?
科创板西部超导独立董事闻海虎介绍、履历信息
温度传感器大力提高了食品加工行业生产效率
详细解释三类TN式供电系统
化妆镜也能变得很智能,未来试妆将更智能更简单
同价位之争:荣耀9、坚果Pro、金立M6谁更有性价比?荣耀9、坚果Pro、金立M6对比评测
华为海外新品发布会定档9月14日,将发布华为WATCHGT 4系列
三星或将要开发嵌入式GPU图形处理器
三星Galaxy M02已于2·2在印度上市 售价不超过620元
US-DAS1,US-DAS2比例阀控制放大器