STM32学习笔记【江科协】【7-1】ADC模数转换器

电位器事实上就是滑动变阻器

STM32的ADC是12位的,所以AD结果最大值是4095,也就是2^12-1

使用ADC可以对高电平和低电平之间的任意电压进行量化,所以ADC其实就是一个电压表


ADCAnalog-Digital Converter)模拟-数字转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

*数字电路只有高低电平,没有几V电压的概念;ADC是模拟到数字,DAC、PWM是数字到模拟;同时PWM只有完全导通和完全断开两种状态,这两种状态都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量,是比DAC更好的选择;DAC则是在波形生成领域应用更多,比如信号发生器、音频解码芯片;STMF103C8T6也没有DAC的外设

  • 12位逐次逼近型ADC1us转换时间
  • *分辨率,一般用多少位来表示,12位的表示范围就是0~2^12-1,位数越高,量化结果越精细,对应分辨率就越高;转换时间,也就是转换频率,1us表示从AD转换到产生结果,需要花1us的时间,对应AD转换的频率就是1MHz,如果需要转换一个频率非常高的信号,则需要考虑转换频率是不是够用
  • 输入电压范围:0~3.3V,转换结果范围:0~4095
  • 18个输入通道,可测量16个外部和2个内部信号源(对这个系列来说)

*外部信号源就是16个GIO口,在引脚上直接接模拟信号,不需要额外的电路,引脚直接能测电压,2个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的。如果芯片的供电不是标准的3.3V,那测量的外部引脚的电压可能就不对,这时可以读取这个基准电压进行校准,这样就可以得到正确的电压值了

  • 规则组和注入组两个转换单元

*这个是STM32ADC的增强功能了,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值。而STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,规则组用于常规使用,注入组用于突发事件

  • 模拟看门狗自动监测输入电压范围

*ADC一般用于测量光线强度、温度这些值,有些时候要求是,当光线强度或者温度高于或者低于某些阈值时执行某些判断,那么这个判断低于或者高于某阈值可以交给模拟看门狗来自动执行。模拟看门狗可以检测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,就可以在中断函数里执行相应的操作

  • STM32F103C8T6 ADC资源:ADC1ADC210个外部输入通道

ALE锁存信号,上面对应的通路开关就可以自动拨好了,左边部分相当于可以通过模拟信号的数据选择器

因为AD转化时间很短,只有几us,所以有多路信号时,只需要一个AD转换器,然后加一个多路选择开关,想转换哪一路,就先拨一下开关,选中对应通道,然后开始转换,这个AD0809只有8个输入通道,STM32内部ADC有18个输入通道

通过逐次逼近的方法,一一比较得到电压对应的编码数据

电压比较器,可以判断两个输入信号电压的大小关系,输出一个高低电平,指示谁大谁小,输入端一个是未知编码待测的电压,另一个是已知编码DAC的电压输出端(DAC内部是使用加权电阻网络来实现的转换)。如果DAC输出的电压比较大,就调小DAC数据,如果DAC输出电压比较小,就增大DAC数据,知道DAC输出电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据。这个电压调节过程就是这个逐次逼近SAR来完成的,一般会使用二分法进行寻找未知编码的电压

EOC是End Of Convert,转换结束信号;START是开始转换,给一个输入脉冲,开始转换;CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程;VREF+和VREF-是DAC的参考电压,如一个数据是255,对应5V还是3.3V,由这个参考电压决定;DAC这个参考电压也决定了DAC的输入范围,所以它也是ADC参考电压;最左边是整个芯片电路的供电,VCC和GND,通常参考电压的正极和VCC、参考电压的负极和GND是一样的,会接在一起,所以一般情况下,ADC输入电压范围就和ADC供电是一样的

STM32的ADC

这里模拟至数字转换器就是执行上张图所说的逐次比较功能,结果会放在注入通道数据寄存器里

规则组虽然有16个通道,但只有一个规则通道数据寄存器,为了避免数据被覆盖,可以配合DMA(数据转运小帮手)来实现

注入组有四个注入通道数据寄存器,就不用担心数据被覆盖的问题了

左下角是触发转换的部分,也就是上张图的START的部分。对于STM32的ADC,开始转换的信号有两种,一种是软件触发,程序中手动调用一条代码,就可以启动转换了,另一种是硬件触发,就是这些触发源。上面一部分是注入组的触发源,下面这些是规则组的触发源,这些触发源最主要来自于定时器,有定时器的各个通道,还有TRGO定时器主模式的输出。之前介绍过,定时器可以通向ADC、DAC这些外设,用于触发转换

ADC经常需要过一个固定时间段转换一次,这里如果用定时器频繁进中断(可能因为优先级还得不到及时响应),会阻碍主程序的运行。这里可以给TIM3定一个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC这里,选择触发信号为TIM3的TRGO,这样TIM3的更新事件就可以通过硬件自动触发ADC转换了,整个过程不需要进中断,节省了中断资源,这就是这里定时器触发的作用

还可以选择外部中断引脚来触发转换

VREF+和VREF-是ADC的参考电压,VDDA和VSSA是ADC的供电引脚,在现在所用的芯片上,没有VREF+和VREF-的引脚,在内部VREF+和VREF-就已经和VDDA和VSSA接在一起了

VDDA和VSSA是内部模拟部分的电源,比如ADC、RC振荡器、锁相环等

ADC预分频器来自于RCC(时钟树的那张图),只能选择6分频满足后面的ADCCLK,ADCCLK是相当于上张图的CLOCK

模拟看门狗里面可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并指定了看门通道,那么这个看门狗就会关注它看门的通道,一旦超过了这个阈值范围,它就会乱叫,就会在上面,申请一个模拟看门狗的中断,最后通向NVIC

对于规则组和注入组而言,转换完成了之后也会有一个EOC和JEOC的完成信号,这两个信号会在状态寄存器里置一个标志位


 ADC1和ADC2的通道相同,涉及的功能是双ADC模式,ADC1和ADC2一起工作,可以配合组成同步模式、交叉模式等等,比如交叉模式,ADC1和ADC2交叉地对一个通道进行采样,这样可以提高采样率

现在所使用的芯片没有ADC3,也没有PC0~PC5


规则组的四种转换模式

 


 是外部引脚还是定时器需要由外部引脚重映射来决定

这些触发信号怎么选择,可以通过设置右边寄存器/库函数给个参数来完成


目前的ADC是12位的,转换结果就是一个12位的数据,但数据寄存器是16位的,所以存在数据对齐的问题

一般使用的都是数据右对齐,这样读取16位的寄存器,直接就是转换结果

选择左对齐,直接读会得到比实际结果大16倍的数据,因为数居左对齐实际上就是把数据左移了4次,二进制的特点就是数据左移一次,就等效于把这个数据乘2

左对齐的作用是减少精度,比如不需要右对齐0~4095的分辨率,就用左对齐,只取高八位,舍弃了后面四位的精度,那么这样12位的ADC就退化成了8位的ADC


 

AD转换是需要一定时间的

量化编码:ADC逐次比较的过程,一般位数越多花得时间越长

采样保持:在量化编码前,先打开采样开关,收集一下外部的电压,比如用小容量的电容存储一下这个电压,存储好后断开采样开关,再进行后面AD转换。这样在后面量化编码期间的电压始终保持不变,这样才能精确定位未知电压的位置。这收集到断开需要一段时间,叫做采样时间。采样时间可以配置,采样时间越大,越能避免一些毛刺信号的干扰

ADC周期就是从RCC分频过来的ADCCLK(最大14MHz)


 校准模式是固定的,只需要在ADC初始化的最后,加几条代码就行了


ADC的外围电路

第一个是电位器产生一个可调的电压,中间的滑动端可以输出一个0~3.3V可调的电压输出了,这里电阻的阻值不应该太小,至少要接K欧级别的电阻

中间是传感器输出电压的电路,一般光敏电阻、热敏电阻、红外接收管、麦克风等等都可以等效为一个可变电阻,电阻阻值无法直接测量,所以这里可以通过和一个固定电阻串联分压来得到一个反应电阻值的电路

最后一个是电压转换的电路,根据分压公式,中间的电压就是VIN/50K*33K,最后的电压范围就是0~3.3V就可以进行ADC转换了,这里使用的电压范围应该在5到10V左右,高电压采集最好使用一些专用的采集芯片,比如隔离放大器等,做好高低电压隔离保证电路安全

参考手册中,这节对应数字模拟转换

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 ADC数转换实验中,可能会遇到以下问题: 1. ADC采样值不正确 如果ADC采样值不正确,可能是因为ADC参数配置不正确或者采样时序不正确导致的。需要确认以下几点: - 确认ADC参数配置正确,包括采样时间、采样通道、采样分辨率等参数 - 确认ADC时钟已经使能 - 确认ADC采样时序正确,包括采样开始时间、采样保持时间和转换时间等参数 2. ADC采样速率不稳定或者出现噪声 如果ADC采样速率不稳定或者出现噪声,可能是因为ADC参考电压不稳定或者ADC输入信号不稳定导致的。需要确认以下几点: - 确认ADC参考电压稳定,可以使用稳压器等设备来提供稳定的参考电压 - 确认ADC输入信号稳定,可以使用滤波电路等方法来滤除噪声和干扰信号 解决方法: 在使用STM32 ADC数转换时,可以采用以下步骤进行配置和编程: 1. 配置ADC参数 使用ADC_Init函数对ADC进行配置,设置相应的采样时间、采样通道、采样分辨率等参数。 2. 开启ADC采样 在程序中开启ADC采样,使得程序能够读取ADC转换结果。 3. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长时间占用CPU资源,否则可能会影响其他重要任务的执行。 4. 烧录程序 将程序烧录到STM32芯片中,通过读取ADC转换结果,观察ADC采样值的情况和中断服务函数的执行情况。 需要注意的是,在编写程序时需要遵循一些规范和最佳实践,如使用宏定义等方法来定义常量和变量,避免使用硬编码方式;使用滤波器等技术来提高ADC采样值的精度和稳定性等。同时,建议使用示波器等工具来观察ADC采样值的情况和中断服务函数的执行情况,以便进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值