你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103ADC的工作模式和触发方式的探索与理解

[复制链接]
STMCU小助手 发布时间:2022-1-10 22:00
前段时间做开发用到了STM32规则通道的ADC,因为需要定时采集,所以使用了外部触发方式。初次接触到STM32的ADC感觉还可以驾驭,但随着开发的推进,发现自己对于STM32ADC的不知之处还有好多,现将开发过程中的心得与大家分享。. h0 H6 ]5 q. |4 u! `
1、STM32F103中不足100脚的芯片ADC参考电压在芯片内部接到Vadd管脚上,这个是无论如何都不能通过设置寄存器更改的。那么STM32内部有没有参考电压呢,答案是否定的,参考电压是没有的,参照倒是有一个1.2V的。说实话,一开始我也以为这个参照电压就是参考电压,但是随着学习的跟进,发现这个参照电压的作用仅仅是可以”参照“而已,前面也讲了参考电压Vref已经接到Vadd上了,那么这个参照电压和Vref不是一回事了。只是用于修正你所读到的ADC值而已。举个例子吧:假设Vref=Vadd=3.3,在AD采集的时候要一次读取ADC通道的值和通道17即参照电压的值,假设此时读到的AD值为2000,读到通道17的值为1500。此时如果参照电压是准的,Vadd是波动的,那么Vref实际的值应该是4095*1.2/1500=3.27V,那么AD值2000对应的电压应该为2000/4095*3.27V=1.597V。这样大家就可以理解参照电压的作用了,如果大家还不满足内部参照电压的精度的话,可以再开辟一个AD通道,外接外部基准电压芯片。AD采集之后的计算方式与内部参照电压是相同的。
" g* L$ ?1 F# p; ]! T2、STM32F103ADC通道转换模式的问题:+ L. q. E0 l' U" Y! ~, K
STM32的ADC有单次转换和连续转换2种模式,这两种模式又可以选择是否结合扫描模式。6 j3 Q  F5 h) a* d* ?* `. E9 `4 r
CONT=0,SCAN=0    单次转换模式(Single conversion mode)单次扫描1通道: ?* p2 y8 p; K' Y& O
CONT=1,SCAN=0    连续转换模式(Continuous conversion mode) 连续扫描1通道
& w/ k0 C1 S5 m5 e; ~CONT=0,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组)6 O1 T7 k; o) w( w
CONT=1,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组
" {/ T0 n" m5 M/ p, |( o
+ J+ E( B4 p% B5 ]; Y$ ^/ ?9 w$ L需要注意的是,如果你的转换序列当中有超过一个通道需要转换的话,那么必须要开启扫描模式,否则的话,始终只转换第一通道。, G4 ?% ~, t+ ^: c# o
. D% x2 u" |- N& O  Q
- `: b, h9 P+ ^8 |# B
用ADC1,Regular通道的顺序为Ch0,Ch1,Ch2,Ch3,启动Scan模式
6 B% i: v2 r& \4 m* F在单次转换模式下:9 J% ?2 s, B, c4 r" A7 S9 x
启动ADC1,则
2 _, C5 D1 l# e6 E$ i1. 开始转换Ch0
/ E  [5 y# m2 Z5 O3 q5 N& S2. 转换完成后自动开始转换Ch1
( O' g  T# q1 r, M  P! C3. 转换完成后自动开始转换Ch2, u  l& `7 P% [- V
4. 转换完成后自动开始转换Ch3
2 O: o) X6 h" W' g8 Z5. 转换完成后停止,等待ADC的下一次启动。下一次ADC启动从第一步开始8 b: e+ C% g7 P, l, @& b  H2 a/ B
在连续转换模式下:( p% J( q* N) l$ X- j& z; `
启动ADC1,则
# L2 t$ ]/ ~* z# T; l1. 开始转换Ch0( P1 |' F2 P% v& p0 f
2. 转换完成后自动开始转换Ch1
3 Z# s/ d; t1 w) w% n: E3. 转换完成后自动开始转换Ch2/ o6 p4 y$ W# L9 ?% H
4. 转换完成后自动开始转换Ch3: s& {0 ^) ~7 x1 {4 m. r
5. 转换完成后回到第一步
8 P# F5 {' y6 ~/ s! c; H# g如果没启动Sacn模式则上述过程中没有2、3、4这三个步骤
; i( M1 t" s$ k$ ^& `) T上述前提是Discontinuous模式没有启用。
, @) o6 C$ g5 `
2 B' F8 }4 f4 u9 |) D
9 R; W9 j- U9 i2 k0 j- H" Q: a关于这个扫描模式,着实让我纠结了好久,一开始,根据中文手册上的来。咱玩包含两个通道的规则通道采集,完了还不带DMA的。
7 P$ u; x& ]8 I: w9 p- a: x: i
  C% h1 r; Z0 w
  n1 N) k0 k9 y2 ?3 O7 F+ y5 G

" D( M% L3 I7 b9 ]! W7 i手册说了每一个规则通道转换完毕都置位EOC,那就是每转换一个通道都可以进中断喽,那这样的话,咱还用啥DMA啊,直接中断吧,好吧。就这么办,程序写好了,跟踪调试发现,中断虽然进了,但是只有第二组数据。为什么不行呢,手册中讲的好好的,怎么就不行了呢,带着这个疑问,楼主开始了探索之旅; q9 b& u2 E+ j0 d2 e
首先继续不用DMA,在主函数中采用以下语句读取ADC数据。
  1.     while (1)' }  O9 P5 t# {8 A; @- d
  2.     {
    ; Q" j+ u9 c8 S$ ^
  3.                 if((ADC1->SR)&0x02)//读取判断EOC位! ?" w7 Y/ H, `$ R% C
  4.                 {
    & H  d3 d- I. B. P3 j  V
  5.                         adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
    & V. f# ]* B+ v3 R- p
  6.                         Filter_Table[ Filter_Tab_Count++ ] = adcx;6 a# j9 V& P1 F2 u4 ~; [, [
  7.                 }
    * y  ?; e% e4 l, ^+ J7 o$ P; t
  8.     }
复制代码
  v  K  J& ]3 W6 ^" i

/ W: s( [1 Q$ T' t3 G! q还是只有最后一组数据。好吧,那这样好了:
6 K" S, Q* |' s' c) r5 R
  1.     while (1)/ \' E2 Z: y, a* y; u
  2.     {0 `( K9 u2 ?7 E2 [  F( Y7 Z
  3.                 adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
    ) [% E2 z3 J, C5 d. b2 g$ a% j
  4.                 Filter_Table[ Filter_Tab_Count++ ] = adcx;
    1 c" ^' z& R  O7 q, k
  5.     }
复制代码

6 U- }& I' {9 j8 Y# P终于凑效了,可以在跟踪的时候,在不同时间停下的时候读到第一组和第二组数据了,这是为什么呢,这说明第一通道也是在转换的,只是在转换完毕的时候没有置位EOC罢了,当然也就不能触发ADC中断了。9 t* ?6 [. |+ Y( U6 U

& \( s# p. m* b5 v( S7 R6 A- A- _3 J( ]& k
看来又被手册忽悠了,多个通道用中断的方式是不行的。PS:手册中的一个规则通道应该指的是一个规则通道组。
" k$ E" w& I9 U3 O4 Q% d+ Y% ~6 ^+ a, Q9 ~- f6 E
- ]% n- K1 Y7 g7 ?+ W8 y* M
好吧,那启用DMA好了,那么问题来了,手册扫描模式中讲到,EOC置位后DMA才来搬运数据,那么岂不是要丢好多数据!当然中文手册也讲了,以英文手册为准,既然有疑问,那咱翻翻英文手册好了
: n) z! M* q7 j- C  H9 ~0 R% o! N( h" F6 ~' b2 r; j( L' \

' e, n+ n+ `% t1 C8 e
& d% e: Z9 N& B% M! h
/ @+ V. N! W# U; z! h

' Y! p) s  R  c* h1 r英文手册中讲到,在ADC_DR寄存器每次更新后,DMA才会搬运数据。总结:ADC在采用规则通道组采集的时候必须启用扫描模式,并且启用DMA传输支持。4 c# Y7 [+ f6 o: z( ~
3 D2 @0 y6 L+ h" x  T$ [

/ y4 W# n' C6 w* _+ U7 Y6 Z
* f0 e5 M" |! `" T
/ Q  I( S6 G" e# w0 K' p) o1 Q/ Y- J5 F% z8 l8 ^, A; Q
收藏 评论0 发布时间:2022-1-10 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版