单片机学习小组
直播中

恩可口

8年用户 720经验值
私信 关注

如何利用基于STM32F407的单通道ADC去读取电压呢

ADC的功能有哪些?
如何利用基于STM32F407的单通道ADC去读取电压呢?

回帖(1)

李艳

2022-1-25 14:44:18
(本文基于STM32F407,部分参数说明参考标准库)
ADC功能框图


我们按框图标号来了解ADC
1.电压输入范围

ADC的输入范围:Vref- < Vin < Vref+ (由图中标注的引脚决定)
一般是把Vssa和Vref-接地,Vdda和Vref+接3.3,这样得到的ADC电压输入就是0~3.3V
(这些都是设计原理图时需要考虑的,现成的板子都是设定好的)
若要增大ADC的输入范围,需要外加电压调节威廉希尔官方网站 ,将目的电压范围变换的0~3.3伏后再输入。
2.输入通道

STM32的ADC有19个通道,其中前16个通道(0~15)对应的是外部IO口,分为规则通道(最多16路)和注入通道(最多4路)。
规则通道是我们常用的通道,也是用的最多的,注入通道类似于中断,注入通道有输入时,会打断规则通道的转换,先转换注入通道,转换完成后再切换到规则通道的继续转换。
ADC1的通道ADC1_IN16连接的内部VSS,IN17连接的内部参考电压,IN18连接的芯片内部的温度传感器或者备用电源Vbat
ADC2、3的三个通道全部连接内部VSS。
3.转换顺序
规则序列。规则序列寄存器有三个:SQR3、SQR2、SQR1。

如果通道16 想第一次转换,那么在SQ1[4:0]写16 即可。
如果通道1 想第8 个转换,则SQ8[4:0]写1即可。
如果通道6 想第10 个转换,则SQ10[4:0]写6 即可。
具体使用多少个通道,由SQR1 的位SQL[3:0]决定,最多16 个通道。
注入序列。注入序列寄存器JSAR只有一个,最多支持四个通道

具体多少个由JSQR 的JL[2:0]决定。
注意:
JL<4时,第一次转换的不是JSQR1[4:0],而是JCQRx[4:0] ,x = (4-JL),跟SQR 刚好相反。(即。如果JL=00(1个转换),那么转换的顺序是从JSQR4[4:0]开始)
JL=4时,和SQR顺序一样。
4.触发源

ADC转换由ADC控制寄存器2:ADC_CR2的ADON这个位来控制,置1时ADC从掉电模式中唤醒,SWSTART或JSWSTART位置1时启动AD转换。ADON置0时ADC进入掉电模式,此模式下功耗位几微安
同时ADC支持外部触发 ,包括定时器触发和IO触发。触发源由ADC_CR2的EXTSEL[2:0](用于规则通道)和JEXTSEL[2:0](用于注入通道)位来控制。
选好触发源后激活由ADC_CR2的EXTTRIGJEXTTRIG来控制激活。如果使能了外部触发事件,我们还可以通过设置ADC 控制寄存器2:ADC_CR2 的**EXTEN[1:0]JEXTEN[1:0]**来控制触发极性,可以有4 种状态,分别是:禁止触发检测上升沿检测下降沿检测 以及 上升沿和下降沿均检测
5.转换时间

ADC时钟
ADC输入时钟由PCLK2经过分频产生,最大值是36MHz,分频因子由ADC_CCR的ADCPRE[1:0]设置,可以设置的分频系数由2、4、6、8
采样时间
ADC需要若干个ADC_CLK周期完成对输入电压的采样,采样的周期数可通过ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2 中的SMP[2:0]位设置。ADC_SMPR2控制的是通道是0-9,ADC_SMPR1的控制的通道是10-17。每个通道可以用不同的时间采样。采样周期最小是3个,及最快的采样速度就是用3个采样周期(1/ADC_CLK)
ADC总转换时间公式:T=采样时间+12个周期
也就是说如果我们要最快的采样周期,也就是三个采样周期,那么ADC的转换时间就是15个周期,也就是15个1/ADC_CLK
需要注意的是,采样越快,采样周期越小,精度越低。
6.数据寄存器

规则组的数据放在ADC_DR寄存器
注入组的数据放在JDRx
如果使用双重或三重模式那规则组的数据是存放在通用规则寄存器ADC_CDR的。
规则数据寄存器ADC_DR
该寄存器只有一个,32位,只有低16位有效且只是用于独立模式存放转换完成数据。ADC最大精度12位,ADC_DR是16位有效,因此可以设置数据左对齐或右对齐,对齐方式由ADC_CR2的11位ALIGN设置。(设置左对齐,则数据在DR寄存器[4:15]位,如果设置右对齐,那么数据在DR寄存器[0:11] 位)
注意:通道有16个,但是DR寄存器只有一个,所以会导致数据的相互覆盖。最好是一个通道转换完之后立刻读取出来,或者存放DMA。如果不用DMA,一般需要ADC状态寄存器ADC_SR获取当前ADC的进度状态来进行程序上的控制。
注入数据寄存器ADC_JDRx
最多4个通道,有4个寄存器,每个通道对应着自己的寄存器,不会产生数据覆盖问题。也是32位寄存器,低16位有效,数据同样可以左右对齐,由ADC_CR2的11位ALIGN设置
通用规则数据寄存器ADC_CDR
适用于双重或三重模式。双重指的是ADC1和ADC2同时使用,三重指的是ADC1、2、3同时使用。此情况一般需要配置DMA一起使用。
7.中断

转换结束中断
数据转换结束后产生的中断
模拟看门狗中断
开启该中断后,当ADC转换的模拟电压低于低阈值(由ADC_LTR设置)或者高于高阈值(由ADC_HTR设置)时,就会产生中断
溢出中断
如果发生DMA 传输数据丢失,会置位ADC 状态寄存器ADC_SR 的OVR 位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。
DMA请求
规则和注入通道转换结束后,除了产生中断外,还可以产生DMA 请求,把转换好的数据直接存储在内存里面。
8.电压转换
我们一般在设计原理图的时候会把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。
以上即对框图的解释,下面看一些函数参量
ADC函数参量解释(标准库)



  • ADC_Resolution:配置ADC分辨率,即精度。有12、10、8、6位。精度越高,装换时间越长
  • ScanConvMode:单通道选DISABLE,多通道选ENABLE
  • ADC_ContinuousConvMode:ENABLE是使能自动连续转换;DISABLE是单次转换,转换一次后需要手动控制才能重新启动转换。
  • ADC_ExternalTrigConvEdge:外部触发极性选择,如果使用外部触发,可以选择出发极性。可选的有:禁止触发检测、上升沿触发检测、下降沿触发检测、上升沿和下降沿触发检测。
  • ADC_ExternalTrigConv:外部触发选择,也就是触发源。一般我们使用软件自动触发。
  • ADC_DataAlign:转换结果数据对齐模式
  • ADC_NbrOfChannel:AD转换通道数目
  • ADC_Mode:工作模式选择:独立、双重、三重
  • ADC_Prescaler:时钟分频系数,ADC由PCLK2分频而来,分频系数决定时钟频率,可选的数有2、4、6、8,ADC最大时钟配置是36MHz
  • ADC_DMAAccessMode :DMA模式设置,只有在双重或者三重模式才需要设置,
  • ADC_TwoSamplingDelay:2个采样阶段之间的延迟,仅适用于双重或三重交错模式。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分