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

STM32之ADC配置,ADC_Mode模式理解

[复制链接]
STMCU小助手 发布时间:2021-7-13 14:01
对于STM32,在使用ADC的时候需要配置几个参数。, J9 h" `5 d6 Y6 h( r, Q4 w$ X
7 {* o  H/ d# v6 R! |" S( e$ t3 i

4 H2 T! F/ h: h- Q, c9 n: p1. 第一个参数是ADC_Mode,这里设置为独立模式:/ H# O  W& ^% y
  1. <font face="微软雅黑" size="3"> ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;</font>
复制代码
在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。
# ]/ h) a% T3 p9 x+ o& D4 ~2 j. \8 j! Z1 c) M8 t- N( C, Z; h0 x2 G

, x! n8 v: P2 l3 h! |2. 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。
9 U3 t1 |  x/ }; ]# ~2 B
  1. <font face="微软雅黑" size="3">ADC_InitStructure.ADC_ScanConvMode = DISABLE;</font>
复制代码
如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENABLE。5 ~4 `. A( U! D, z
4 s7 ~8 k0 d% p6 j2 Y% Q( ?

7 G. ]8 D5 s' m2 l- \5 ^3. 第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。
9 @) Y  ?( V$ H: N; ^8 p( b7 x. i& p. v9 ?) \+ S9 _
0 P* ^  D# {1 {, _: g6 L( q& x
4. 第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。这里只讲三种:+ I* r5 b: O4 ~3 @3 \0 Y2 p
第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记得调用库函数:
( d% C+ K% o: W  u. v. x. g
  1. <font face="微软雅黑" size="3">ADC_SoftwareStartConvCmd(ADC1, ENABLE);</font>
复制代码
这样触发才会启动。
  F" V( R7 K. v( d1 Q, R3 E第二种是定时器通道输出触发。共有这几种:
% [+ Z/ Q3 ?% s8 u) m/ V1 H4 Z- D' H5 @  U
  1. <font face="微软雅黑" size="3">ADC_ExternalTrigConv_T1_CC1、
    8 p/ d( a1 H+ i* m/ ?$ h" |
  2. ADC_ExternalTrigConv_T1_CC2、
    - I2 p- c1 N( J2 V
  3. ADC_ExternalTrigConv_T2_CC2、7 B8 W! x" S: [4 ^8 ], k
  4. ADC_ExternalTrigConv_T3_T 、. o. v6 Q( }6 L  g  J9 j& l
  5. ADC_ExternalTrigConv_T4_CC4 、</font>
复制代码
定时器输出触发比较麻烦,还需要设置相应的定时器。ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:* J+ y7 ^7 ^7 I0 C
  1. <font face="微软雅黑" size="3">void TIM2_Configuration(void){. k& M; V- }( y1 G2 Q. \* V! }4 U

  2. 1 q! b6 h" o1 i# }
  3.                 TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    * J' u# H/ E% i* A0 G7 g
  4.                 TIM_OCInitTypeDef         TIM_OCInitStructure;
    ( v0 @4 o9 b/ D. ^/ |, l
  5.                 $ f8 ~4 q6 ?. N( g, {. ]" T7 g" Q7 |: o0 m
  6.                 TIM_TimeBaseStructure.TIM_Prescaler = 4;  h* w7 d3 u7 [; z; s
  7.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;& n1 q9 t7 N% X* e+ a
  8.                 TIM_TimeBaseStructure.TIM_Period = 0XFF;
    / S! Z9 A* x2 m- \) ^1 |2 m
  9.                 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    " ]& b7 o# X* q9 f1 A! _5 G) S
  10.                 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;. P& Q9 e$ J3 g& _( u0 c
  11.                 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);0 c7 O% [6 l8 [. c3 j! z' }
  12.                
    $ j/ N( R4 C) ^8 n0 k  e
  13.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    & A: B* b4 L. y. @9 E- _
  14.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;9 J9 ^  F' ~# \9 {4 F
  15.                 TIM_OCInitStructure.TIM_Pulse = 0X7F;, h2 L9 O0 U$ n1 v- h" c
  16.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    9 t0 \* f! p! x5 r6 W
  17.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;        9 I4 {$ Q, e$ N2 k. h1 J  u
  18.                 TIM_OC2Init(TIM2, &TIM_OCInitStructure);
    9 {, [2 `9 h% x' ]0 x  R/ w3 {. J
  19.                 . l& W' N( l' u2 e8 K' `
  20.                 TIM_Cmd(TIM2, ENABLE);
    # b" e0 K+ N6 ?7 O1 M' y
  21.                 . Y$ T. X( S0 b5 t- U  @: G1 ~( S( x
  22.                 TIM_CtrlPWMOutputs(TIM2, ENABLE);
    ' n3 Y" e- {, i5 s* s
  23. }</font>
复制代码
这样设置之后就可以用定时器2的输出触发了,至于触发的周期,设置TIM2的时间即可。这里不再赘述。, g8 J5 l, `$ w5 A
9 x) l  I3 e' n; S3 O0 p0 c

" Z0 E5 L% C- V' P5 v( g第三种是外部引脚触发,对于规则通道,选择EXTI线11和TIM8_TRGO作为外部触发事件;而注入通道组则选择EXTI线15和TIM8_CC4作为外部触发事件。1 B+ A( K9 n* N9 v  y
- ]% E, D. f' D1 k% O( ^, a- y
5 u* s( V  x0 p8 a& X
5. 第五个参数是ADC_DataAlign,这里设置为ADC_DataAlign_Right右对齐方式。建议采用右对齐方式,因为这样处理数据会比较方便。当然如果要从高位开始传输数据,那么采用左对齐优势就明显了。  f% o- h; [, P4 G$ C
6 A; S( o+ \. E' @# H

  J. {: q' v3 g) a( z6. 第六个参数是ADC_NbrOfChannel,顾名思义:通道的数量。要是到多个通道采集数据的话就得设置一下这个参数。此外在规则通道组的配置函数中也许将各个通道的顺序定义一下,如:% t$ m  }' o: \/ A
, J2 l" Q7 b) ~# m
  1. <font face="微软雅黑" size="3"> ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5);! A5 D+ P( Q& ]8 ~# i
  2.       ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);</font>
复制代码
多通道数据传输时有一点还要注意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转换结束后,ADC_ValueTab[0]和ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]和ADC_ValueTab[3]存储的是通道2的数据。如果数组容量大则依次类推
4 J1 n7 p/ I0 o4 p7 b% T: z4 |1 d* @: k) p0 ~
" y0 ?9 T! G1 {8 v

& g6 A" u) s6 I# q* Y9 V5 s1 {
赞 收藏 评论0 发布时间:2021-7-13 14:01

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版