|
问题 今天在使用 STM32F407 的 ADC 时遇到一个问题:ADC 的参考电压都是通过 Vref+ 引脚提供的并作为ADC转换器的基准电压(部分 MCU 没有 Vref+ 引脚)。当我们使用的 Vref+ 是直接取自用 VDD 电压时,当 VDD 电压波动比较大时或稳压性能比较差时,转换结果自然就不准确了! 0 [- h5 L" t! N( o; C9 v) G! J1 K 供电方案 MCU 的参考手册都会有一章节单独介绍 MCU 的电源管理,针对不同的 MCU(封装不同等)其外部电源如何连接也是有要求的,我们在 MCU 上一般都会发现如下引脚(注意不同 MCU 是有区别的): VDD / VSS: VDD is the external power supply for the I/Os, the internal regulator and the system analog such as reset, power management and internal clocks. It is provided externally through VDD pins. VDDA / VSSA: VDDA 是A/D转换器,D/A 转换器,参考电压缓冲器,运算放大器和比较器的外部模拟电源。 VDDA 电压电平与 VDD 电压无关。 不使用这些外设时,最好将 VDDA 连接到 VDD。7 H6 S/ z2 u4 z( t8 ~6 d" g) Y VBAT: 当不存在 VDD 时,VBAT 是 RTC,外部时钟 32kHz 振荡器和备用寄存器(通过电源开关)的电源。 对于没有专用引脚的小型封装,VBAT内部连接到了 VDD/ Q. v8 [2 S/ Y& ~5 G/ H8 t! L, [ VREF+ / VREF-: VREF+ 是 ADC 和 DAC 的输入参考电压。 使能后,它也是内部参考电压缓冲器的输出。当不使用 ADC 和 DAC 时,VREF+ 可以接地。VRE- 必须始终等于 VSSA。 VREF- 和 VREF+ 引脚并非在所有封装中都可用。 如果封装上未提供它们,则它们在 MCU 内部分别与 VSSA 和 VDDA 相连。 下面以 STM32F1 和 STM32F2 的 MCU 比较来具体看看。供电架构如下图所示:- E) z3 s+ o, p
不同的供电所管理的供电域
# v3 `( B3 l, W" |& Y 供电电压范围 , K G9 m+ g2 V
VCC: C=circuit 表示电路的意思, 即接入电路的电压 VDD: D=device 表示器件的意思, 即器件内部的工作电压; VSS: S=series 表示公共连接的意思,通常指电路公共接地端电压1 P T2 Y* P( x8 ?( i STM32 的 VDDA 和 VSSA 不能悬空,复位模块和 RC 振荡器需要 VDDA 和 VSSA。否则无法下载程序! 电源引脚连接9 R$ | p5 N4 H& S, z6 I% ^ VDD 引脚外接去藕电容连到外部稳压源1 N I" f: o: t; V$ t 一个最小值4.7uF、典型值 10uF 的钽电容或陶瓷电容 每个 VDD 引脚再接一个100nF 的陶瓷电容 VBAT 引脚外接电池。若没有电池,推荐通过100nF的陶瓷电容连到VDD引脚 VDDA 引脚外接两个去藕电容 一个 100nF 的陶瓷电容% n# c. p; r; I3 H, B 一个 1uF 的钽电容或陶瓷电容7 C7 ~' O1 G+ v) K1 ^9 Z8 G0 q VREF+ 引脚连到 VDDA 若有单独的参考稳压源连接一个100nF 和 1uF 的电容 VCAP1 和 VCAP2 通常只各连接一个 2.2uF 的电容 特殊封装上,可外接 1.2V 电源来旁路内部主电压调节器
; f3 c. }2 A5 y6 I * d! q7 D+ F ~% j% G/ W ADC的参考电压 ADC 可以主要有连个电源: 供电电源 和 参考电源 。参考电源就是在转换数值时候的基准。在部分 MCU 的封装中,会有单独的一个 Vref 引脚,这个引脚就是提供参考电源的
我们可以把外部基准电压芯片(例如REF3133,输出的电压是标准的3.300V)连接到 Vref 引脚。一般 100 脚的 STM32 MCU(如上图STM32F4)都有 VREF 引脚。对于 100 脚以下的芯片,STM32 没有把 VREF 引脚引出来,而是直接在内部连接到了 VDDA 引脚。这样就导致了 ADC 的供电电源和参考电源实际是一个。$ y8 y* c, V8 e 注意,STM32 单片机上面有好多电源引脚,其中有若干 VDD 引脚,只有一个 VDDA 引脚,VDDA 引脚就是模拟供电引脚。不过,需要注意,VDDA 的电压不是随便定义的。例如,STM32F051 系列单片机就规定,VDDA 必须要大于或者等于 VDD 才可以正常工作,所以这时候,最好是给单片机 3.0V 供电,再给 VDDA 采用一个 3.3V 的基准电压芯片供电。 0 p) @1 _0 y3 N' v! c/ G1 _
" b& B4 h5 u8 @4 R 为啥会要求 VDDA 必须要大于或者等于 VDD?这是因为在 MCU内部 VDDA 和 ADC 的参考电压有联系。( P3 o% Y* N& g. O5 e/ Y 7 Q4 }$ p" h- S) m- u 内部参照电压 以上两种方法都需要外加基准电压芯片,在实际应用中,往往是 VDDA 引脚和 VDD 引脚连在一起,而没有 VREF 引脚的片子,内部 VREF 有是和 VDDA 接一起的,这就到了整片子都是由电源芯片供电。这个时候如果要提高 ADC 转换准确性该怎么办呢? 1 K9 S9 d8 s% l: S 针对上面这种情况,在每个 MCU 的内部,都有一个叫内部参照电压的东西。更关于该部分的介绍,位于对应 MCU 的 数据手册 中(不同MCU的 数据手册 介绍有多又少,同样是 STM32F0 的 数据手册 介绍更为详细),如下图:
但是这个值有可能也是不准确的,那怎么办呢?ST 提供了一个方案:STM32 可以通过配置将 VREFINT 接入到 ADC 内部的通道,然后我们就可以测量 VREFINT 到底是多少。MCU 不同具体链接的 ADC 引脚也是不同的。下面是 STM32F4 芯片的参考手册的说明:2 ?# E5 r$ j @$ L
在 MCU 出厂测试的时候,ST 为我们提供了一个校准值,校准过程是在外部供 3.3V 电源,将采样内部参考的 ADC 值写入到 MCU 固定的内存中去的
这样我们就可以用 ADC 实际采样,得到 VREFINT 的采样值,然后使用上面的校准值进行计算即可!- I/ v/ K, i) o, c' z2 q 关于使用内部参照电压的具体方法,只有部分芯片的参考手册中才能找到( 如下图是 STM32F0x ),其他 MCU 的参考手册都是很简单的几句说明。 ( d0 j1 G/ m" q( M
5 ]/ n4 C2 G/ A6 B 更进一步,在计算其他通道的时候,我们就可以使用以上计算的 VDDA 来作为基准了!. ` [: C7 r# m: U S# T$ L * Q% r8 Q) `) }5 `# o
+ H3 Q, d9 p! j( c 需要特殊注意的是,在不同系列的芯片中,以上是有区别的,例如以下是 STM32L476 系列的 ( z$ {$ d( u/ L- j3 [
那么,VDDA = 3.0V x VREFINT_CAL / VREFINT_DATA 这个公式是咋么来的的呢?下面我们以上 STM32L476 这个图为例来推导一下。1 l- ~ j9 M8 P9 } 1.ST 通过配置将 VREFINT 连接到 ADC 后,则有:VREFINT = 3.0V * (VREFINT_CAL / 4095); VREFINT_CAL 就是校准条件下的 ADC 采样值& }" U$ Z$ o7 _: L 2.我们自己通过配置将 VREFINT 连接到 ADC:VREFINT = VDDA * (VREFINT_DATA / 4095);8 k# q; r. r h' W5 G 3.因此,VDDA * (VREFINT_DATA / 4095) = 3.0 * (VREFINT_CAL / 4095); 4.VDDA = 3.0V x VREFINT_CAL / VREFINT_DATA ADC转换时间 在使用上面的方法时,必须要特殊注意ADC转换时间。否则采样值将出现较大偏差!先看看每个通道的总转换时间公式:每个通道总的转换时间 = TSampling + Tconversion4 t$ T1 b: U2 i" U# r4 e$ l: g 2 E% r- E4 Y4 p9 k7 O TSampling可配置:SMP@ADC_SMPRx,需要和外部电路的输入阻抗匹配(在对应的数据手册中会有详细说明) 6 E/ [4 ? ~8 J2 i
Tconversion取决于转换精度:RES@ADC_CR1,降低转换精度可提高转换速度' B# t+ K* l$ v! }/ V) w% f / R" }3 T: f2 c
5 c7 _% F# B+ v* T" _% D* g ADC总转换时间为:Ttotal = (SMP + RES) * ADCCLK/ \ i! |: L% I* r SMP:采样时间,需要和外部输入阻抗搭配: x; p3 j1 K( N5 w: l) r! ]' U RES:转换精度,降低精度可提高速度 ADCCLK:ADC模块工作时钟, r! @' x! ]9 B" v5 K ADCCLK = APB2时钟分频(2,4,6,8) ADCCLK最大值还受限于工作电压4 c1 ?/ N5 @8 N: m- ~. ~; X& f VDDA=1.8~2.4V fADCmax = 15MHz$ E8 l0 z4 Q r* m+ `$ s' l1 s VDDA=2.4~3.6V fADCmax = 30MHz# I2 `8 Y4 O/ r! s0 L/ \& w+ U/ d: F# }8 l * u5 Q, t; Y( s 8 d' ?8 z$ j9 M3 _6 M- k' J 为什么要说ADC采样时间?因为上一节所讲的方法,对于采样时间是有限制的!!! l$ K. v; D: Z& d# d% Q# G 1 k7 a5 L- [ ?5 f+ T5 b; E o 温度传感器
Vbat
& _5 z" g; b$ J. r1 j VREFINT2 P' R: l1 m9 B4 D' V+ |
& g C; k4 o8 w 关于采样时间需要和外部输入阻抗搭配,参看下图和对应的 数据手册
————————————————8 ?# u- B$ z/ U$ F$ @ 版权声明:IT 之道 / k2 V4 e! |% P( d! F: r( a |
【STM32H5 评测】ADC 电压表
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
STM32H563 ADC+TIM+DMA应用演示
经验分享 | STM32N6 ADC DMA 传输失败案例分享
实战经验 | MC SDK V6.x软件HSO功能ADC采样设计说明
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | STM32 ADC过采样话题
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版