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

【经验分享】STM32L0系列的ADC用法

[复制链接]
STMCU小助手 发布时间:2021-11-15 22:02
AD转换即模拟信号转换为数字信号,一般在单片机中模拟信号对应电压,通过ADC口将相应的电压转换为二进制的数字信号,从而推算出测得电压。下面我介绍下STM32中L0系列调用库函数来实现AD转换。
  i  O2 P) z1 Q, }+ Q7 z4 w3 G# T/ `6 O- ?; t
        首先最基本的AD转换模式,即单次单通道检测,且不用到DMA。L0系列一共有19个AD口对应19个AD通道,其中16到18为检测内部模拟信号的通道。下面代码中用到是PA0即对应通道0,具体代码如下图:! Q+ @. F9 \& v+ v  m
% H# p7 C* o5 u0 E
     
  1.   Adc_init()  d: R$ o1 a  B

  2. " G3 `- W# U# o
  3. {+ x5 K( [% t/ C0 ^) g
  4. __HAL_RCC_ADC1_CLK_ENABLE();# J# M- M9 H- |$ D
  5.     AdcHandle.Instance = ADC1;
    % ]% M1 M; l  t8 j

  6. * N3 y/ K" X+ k; a- k: v& [7 D
  7.   AdcHandle.Init.OversamplingMode      = DISABLE;$ k5 D8 q- k: F4 C

  8.   s, ]+ r+ d: |: N
  9.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;
    4 ~; g! w5 o6 R2 J' o6 @  ^# M
  10.   AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
    " @6 B' \& j$ A$ B$ c+ n4 D, s% z
  11.   AdcHandle.Init.LowPowerFrequencyMode = ENABLE;& H7 [9 Q4 ]# N$ U
  12.   AdcHandle.Init.LowPowerAutoWait      = DISABLE;
    2 I" k% J0 ^7 \0 w/ Y! j

  13. 8 Z2 D8 U' i, x8 Q7 d+ [9 Z$ i  g
  14.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
    7 u' K: x: O' D" t
  15.   AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;8 Q9 L% O8 {; `
  16.   AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;. ^7 D% B* I6 u- A! k/ O
  17.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;# F( S8 I& C$ n% \  I3 r! b
  18.   AdcHandle.Init.ContinuousConvMode    = ENABLE;; Q& F  m7 T# V3 \- v% a" F
  19.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;
    ( B8 j# X% o( a" h
  20.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
    ! [, G% J% S4 T3 j- ?* x. y5 L; N
  21.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
    ; r  h" [( t& U; R3 t- Z
  22.   AdcHandle.Init.DMAContinuousRequests = DISABLE;$ j  W% i  i3 c* [
  23. & H* f/ m) }+ Q+ E6 x* Q$ P
  24.     HAL_ADC_Init(&AdcHandle);# g$ t2 `: G) M9 _7 v6 i: y
  25.     HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);; _; l% e$ i  ^4 `' Y- T, v

  26. 8 _$ Q; j! q" O( L  ?/ }  B
  27. }" G% ^- Q1 W9 x
  28. / B4 v+ B7 u+ F
  29. //配置ADC初始化' m( `  ^* f& i+ E; r) c& P
  30. 2 Z0 \3 Y8 Y' g8 B: d; G" }; X8 K
  31. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
    ) \/ C& \1 t4 }* P% q
  32. {& ]; T" x, Z$ p9 H2 f
  33.   GPIO_InitTypeDef                 GPIO_InitStruct;
      \* l  z" D# Y$ t9 M/ M; n

  34. 0 \, ~' s* _& V$ c. [  Y4 o
  35.   /*##-1- Enable peripherals and GPIO Clocks #################################*/; Q' v! D0 P% b5 Z/ U( Z
  36.   /* Enable GPIO clock ****************************************/
    ( @" H3 K1 |# d0 J) {4 ^* u4 T
  37.   __HAL_RCC_GPIOA_CLK_ENABLE();8 W/ e5 {+ o/ Y- {. n0 c
  38.   /* ADC1 Periph clock enable */
    : V5 p9 R" [0 \' w
  39.   __HAL_RCC_ADC1_CLK_ENABLE();6 A. H6 |: b7 j2 ^$ L2 E+ \7 X

  40. ( O% |; |+ u5 _! u; _
  41.   /*##- 2- Configure peripheral GPIO #########################################*/
    ' B3 Q8 r8 ]/ ]+ T
  42.   /* ADC3 Channel8 GPIO pin configuration */
    " F. w; s6 ?0 @( c; Q3 Q! p
  43.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    * Y0 Q) S/ y7 y- x' X: `. D
  44.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    & C7 y- W- `' |
  45.   GPIO_InitStruct.Pull = GPIO_NOPULL;8 f- O. U! o& c0 s; }# x
  46.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    $ X9 j9 V" R7 b- Z+ f
  47. }
    3 C3 g. W$ E% p0 Q7 Z0 Y1 P  _
  48. & R8 F- f0 ^' D( \6 T
  49. //初始化ADC引脚PA0,开启时钟/ s, a# U! E9 h* ?
  50. 4 Z* |" U5 P* Z5 D9 j2 |- S, W5 j
  51. void get_voltage(void)* r  j0 X/ N! s- e" k/ L
  52. {
    2 Y, ^0 x+ \2 g0 s  T' V% B
  53.           bsp_adc_init();" P& M/ ]( j$ `9 z
  54.           HAL_ADCEx_EnableVREFINT();) j; ?. C$ a: C: r
  55.           HAL_ADC_Stop(&AdcHandle);5 q. @, b+ w9 M# S8 e
  56.           AdcHandle.Instance->CHSELR=0;
    ( e1 ^- y6 z  k4 N4 j- B- v
  57.           sConfig.Channel = ADC_CHANNEL_17;         //通道17专门测内部电压值9 s6 h* B* l) q; U+ \7 N+ L9 B
  58.            HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
    # |6 X* N  ]* a6 [) m7 J
  59.             HAL_ADC_Start(&AdcHandle);
    7 @4 C1 C6 [; S$ E( |# D/ c1 u
  60.             HAL_ADC_PollForConversion(&AdcHandle, 10);    7 w1 p- s! `/ r0 F. a
  61.             /* Check if the continous conversion of regular channel is finished */
    3 ^5 Y+ @3 U0 G2 _" s
  62.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)/ @; }; [* l3 ^# T  M
  63.             {9 g+ k: [+ ^& J
  64.                 /*##-6- Get the converted value of regular channel  ########################*/8 o3 _9 z+ q7 L
  65.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);2 B0 ~6 V, B: e% m& j' a
  66.             }
    % n8 ^. X1 N3 M$ H) I& z4 e5 o

  67. # x0 |; d0 }: l* l7 L7 t
  68.             vdd_value=VREF_IN_VALUE*FULL_ADC_DIGTIL_VALUE/uwADCxConvertedValue;    //内部电源电压5 C9 ^4 Q* g9 a- O2 }1 H( K
  69.             HAL_ADCEx_DisableVREFINT();( D. a# j: d& C1 [/ ~
  70.             HAL_ADC_Stop(&AdcHandle);
    ; m! e  u: L6 b" |& T0 e
  71.             AdcHandle.Instance->CHSELR=0;
    & s  o$ L# [2 G6 a! h
  72.             sConfig.Channel = ADC_CHANNEL_0;             //ADC0,去测外部PA0口接的电压) v; a6 l2 a4 B; ~! v' U
  73.           HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);4 ~* S" ?1 e$ t& I  y) J+ }2 C
  74.             HAL_ADC_Start(&AdcHandle);
    ( C5 z% D) B" H) P2 P! X
  75.             HAL_ADC_PollForConversion(&AdcHandle, 10);   
    : k/ t% P" q4 _6 ?* P0 P
  76.             /* Check if the continous conversion of regular channel is finished */6 {; P* q! ^/ I1 v+ v$ Z
  77.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)* y( m+ E: Y: b) q# O) V* ?# x
  78.             {
    # F  @/ r7 p0 B' f5 z7 `
  79.                 /*##-6- Get the converted value of regular channel  ########################*/
    # A/ e7 s8 m4 p0 K' I
  80.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
    ( \/ _: r( ?1 o; ?& e5 Y. V8 q6 G$ N
  81.             }# v, R+ i- F9 q* i
  82.               //直接获取的是二进制码,14位对应最大值4095,内部电压为vdd_value通过比例计算得到电压数值& O3 l3 W, y$ f# y# s# }8 U* B
  83.             temp_voltage=(float)uwADCxConvertedValue*vdd_value/4095;
    9 L) f: G/ f4 ~
  84.              //得到浮点型电压值            是乘了1000倍的            " D! w3 h# }& B$ M5 t( U
  85.             HAL_ADC_Stop(&AdcHandle);
    6 X) D3 {% o6 K( \+ T2 e. o, U' k
  86.             //HAL_ADCEx_DisableVREFINT();7 I) k: Z! i' R6 i! Z
  87.             __HAL_RCC_ADC1_CLK_DISABLE();
    3 b( x' w. d9 `' e* T) c- y: G# a, j
  88.    }9 N2 ?* X. \1 h' H1 h
  89. }
复制代码

. E" \9 r# z8 q, o: ?- v/ |& }
- Z: S2 l/ G" G" v) ~  以上ADC检测,相当于一次连续检测了两次,第一次为内部电压用的特地通道17,第二次检测的是外部电压对应硬件连接的PA0对应通道0
2 J: U: {" g0 r0 O! V0 @
  z9 T  E1 i$ ^' v6 \0 D( m; Q+ C# M7 v2 ^* J' L- \3 r
收藏 评论0 发布时间:2021-11-15 22:02

举报

0个回答

所属标签

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