电子产业一站式赋能平台

PCB联盟网

搜索
查看: 37|回复: 0
收起左侧

MCU ADC参考电压变化怎么办?

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

积分
8805
发表于 3 天前 | 显示全部楼层 |阅读模式

xfxjf4za4rg64014730425.gif

xfxjf4za4rg64014730425.gif
+ a3 k2 j0 f8 |9 b$ J) A( V7 m
点击上方蓝色字体,关注我们
7 y4 n* R3 S3 v& C8 c$ a  x* F% H& ]1 x& b/ }; Z; ]
然而,很多工程师对ADC参考电压(VREF)的认识仍然存在模糊,尤其是在电池供电电压不稳场景下。
" l1 i4 r9 k, f6 M) l+ D4 @2 F0 \) j6 D- u1 a! Q2 A7 u
ADC参考电压定义了ADC输入电压与数字输出之间的比例关系:  ?. ]# u  O, l$ A

6 l+ \% x2 S! z6 G

3tdk3xbpjlw64014730526.png

3tdk3xbpjlw64014730526.png
( p  x6 \6 d9 T; B
& g1 N# u1 {$ [( J# A/ V
其中 N 是ADC分辨率(如STM32F103为12位)。
5 c1 [& R- o9 w; K
9 q! O! x- y6 Q- \4 |

3go1kd5pqjp64014730626.png

3go1kd5pqjp64014730626.png

+ t" `, x4 |% r6 c$ Y% y5 G/ O4 P; W' C5 D1 @1 F
VREF(即VDDA)稳定时,ADC转换是准确的。  x: J! P, W$ t

. c$ d5 n, l1 _4 {, m/ g但如果VDDA电压波动,比如电池电量下降,而系统仍使用初始VREF假定值去换算ADC结果,则会导致测量误差6 x  K. [4 [* U# R1 {( d" Y

4 k  S  ^5 Y- L( @  i以前我做低功耗设备遇到过的一个现象:初始VDDA=3.3V,测得电压2.0V,对应ADC=2482。后来VDDA降到3.0V,但仍用3.3V计算 → 误差超出9%以上!
  Z' K! c7 n& R8 f# J+ F) `. W7 ~" a1 o- ^) d
所以,在供电电压变化的应用中(如电池供电设备),必须动态感知参考电压变化$ s) W, y' L" B+ m4 e0 c" e
" q" O7 K. w, S1 [5 i
STM32F103内部集成了一个稳定的基准电压源VREFINT,典型值约1.20V。它连接到ADC通道17,可以通过采样通道17的数据推算实际VREF。
+ w  |6 F" f7 o1 B2 a2 ~7 W6 ?& N+ `: Z7 a7 r

0ogltosmxa564014730726.png

0ogltosmxa564014730726.png
4 j0 n/ @) A8 t, B1 v
+ i  W  A; r/ M" X* i
采样VREFINT得到数据 DATAREFINT_DATA ,则有:
- A  Y% c. C( l5 g3 K' l2 Y! Z' g7 V, F# I

2yclfxhg11364014730826.png

2yclfxhg11364014730826.png
  D5 v1 H8 C# |! M2 [9 |( y6 p

" c) M8 w; F. p2 T; L/ ~! w进一步,采样实际通道ADCHX的数据 ADCHX_DATA,可计算实际输入电压:
$ l* G1 O2 w! R- F+ N
  ^2 ^$ R& e+ J, p% u! b

qszge4hmyyu64014730927.png

qszge4hmyyu64014730927.png
1 p$ i* A, T6 e& Y
6 ]8 O/ o- u4 k% j- t' R
简化公式:
. Y2 L8 U, L8 F6 t' o& Y% O
; ]) h2 @* {1 o8 W# w

dwm4mwhsvpx64014731027.png

dwm4mwhsvpx64014731027.png
- H. p1 h, F) z- r) X

2 ~7 S2 o2 k$ f6 L3 N示例代码如下:
2 q! k6 Q& g+ j1 S9 g$ G
( q1 K* T- E9 V
  • uint16_tRead_ADC_Channel(uint8_t channel);#define FULL_SCALE    4095.0f#define VREFINT_TYP   1.20f  // 典型值
    4 N: H& X0 h% }  n# kfloatRead_Actual_Voltage(uint8_t channel){  uint16_t refint_data = Read_ADC_Channel(17);   // 读取VREFINT  uint16_t chx_data    = Read_ADC_Channel(channel); // 读取实际通道  float voltage = VREFINT_TYP * ((float)chx_data / (float)refint_data);  return voltage;}( u! M; Q: Y2 h2 w
    由于每颗芯片的VREFINT存在个体差异(工艺浮动),需要出厂或用户自校准,校准方法如下:0 S; w  X  b# |& @+ c. {5 I
  • 供电稳定(如VDDA=3.3V);
  • 读取VREFINT通道,记录为REFINT_CAL
  • 保存至Flash存储。) t; o! W, m, K+ P: p3 a5 K( [' B) X

    0 ^2 q& }; D4 {$ M. v计算公式更新:0 p. O1 E6 A0 g/ `8 }: f

    7 n; B# f8 r+ F! U6 [- _

    kgrxvrfskqa64014731127.png

    kgrxvrfskqa64014731127.png

    & e4 f* H3 ~5 G4 S3 ^
    9 M4 `9 @' v* G新一代STM32(如STM32L5、STM32G4等)内部集成了VREFBUF模块,支持输出稳定参考电压如2.048V或2.5V,直接作为ADC参考电压源。 1 e/ G% O/ L' }4 o/ I

    fkz3hl2soca64014731227.jpg

    fkz3hl2soca64014731227.jpg

    ! f; F. O! h: p. R* K# p3 C

    pmi1wjqneye64014731327.gif

    pmi1wjqneye64014731327.gif

    ! ?" H/ A0 s& f+ H7 v点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表