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

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

[复制链接]
STMCU小助手 发布时间:2021-11-15 22:02
AD转换即模拟信号转换为数字信号,一般在单片机中模拟信号对应电压,通过ADC口将相应的电压转换为二进制的数字信号,从而推算出测得电压。下面我介绍下STM32中L0系列调用库函数来实现AD转换。
0 M- G5 }- b7 r9 s. |
  |; l( c9 ~* V$ O( A: y( u        首先最基本的AD转换模式,即单次单通道检测,且不用到DMA。L0系列一共有19个AD口对应19个AD通道,其中16到18为检测内部模拟信号的通道。下面代码中用到是PA0即对应通道0,具体代码如下图:1 |1 H  |4 Y- k3 S" p
7 T& Q# e  r3 f" F5 {: ]' h
     
  1.   Adc_init()( h( V8 q9 @% h' G& c
  2. 2 m) [0 t# h; v: _5 {+ L' T* T
  3. {
    3 ?1 Z- {9 J  T! w: l5 [/ n
  4. __HAL_RCC_ADC1_CLK_ENABLE();5 D( w; k: _& d$ F
  5.     AdcHandle.Instance = ADC1;
    4 G- ~4 T* S, h9 t; E' O& [

  6. % @8 P' B  W  W, Q, ~  S6 Y
  7.   AdcHandle.Init.OversamplingMode      = DISABLE;: F" P9 Y, B3 i0 o+ g- v4 n1 l

  8. . L- X2 P# \( K$ C$ K
  9.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;. i8 _$ i; d# r9 c6 b# l# x  }
  10.   AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;2 J+ i( ~. J. ^* C+ h5 \: A
  11.   AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
    % J* c2 C/ H2 C* l1 b
  12.   AdcHandle.Init.LowPowerAutoWait      = DISABLE;; T3 @! e& U% `! T$ }8 L4 W7 M
  13. ; |2 d) [: O& A" `! a
  14.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;. v) n6 t6 `7 ~: P$ `/ \1 X7 Y7 h( A; c
  15.   AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
    8 }" S' n/ O9 t* y5 J. q5 s
  16.   AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
    6 y: ~& T& x# l" {0 O( v* V+ [) F* C+ W
  17.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;9 h2 W  m- k* |5 n" R* n. _" Z
  18.   AdcHandle.Init.ContinuousConvMode    = ENABLE;* D& c* S4 _% b* I5 q
  19.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;- k" v/ v' e7 B+ t. Y0 a
  20.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;2 p1 ~6 O8 z( ^
  21.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
    ( y( s7 W3 a! N0 o2 L5 o3 y9 D
  22.   AdcHandle.Init.DMAContinuousRequests = DISABLE;. Y( ]/ T6 }+ y- }0 k" ~; i- {
  23. ; W  S& W' S" o5 F% j& [
  24.     HAL_ADC_Init(&AdcHandle);
    ( v% _/ ~1 v: {: T
  25.     HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);
      B, G4 O( G+ V) Z' Z; |/ F
  26. $ T# F' z' a+ N& Z7 {/ u& }4 i
  27. }
    4 n1 b, K* ~9 c& A# c; `; t& T5 O: W

  28. , o/ }& c( v  `! s6 v: a4 I( U- q" W0 d
  29. //配置ADC初始化
    . y; f( z& M, C: \! A  S1 g. R

  30. , Y& o  l: ^+ T( Q5 I
  31. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)0 ^! g- c. y: b  w: M  T
  32. {
    . V6 {& @; V! H6 e
  33.   GPIO_InitTypeDef                 GPIO_InitStruct;
    7 a' n3 ~/ ^% h6 H
  34. ( Q7 T; Q9 `2 Z8 a
  35.   /*##-1- Enable peripherals and GPIO Clocks #################################*/% N% @+ n, {5 Z$ y; a7 Z5 Q' Y
  36.   /* Enable GPIO clock ****************************************/+ Y+ J3 Y5 `% F# ]- q' h: N
  37.   __HAL_RCC_GPIOA_CLK_ENABLE();
    4 H- \$ g; @2 z- u
  38.   /* ADC1 Periph clock enable */+ D) Z) N4 B; a( f7 j
  39.   __HAL_RCC_ADC1_CLK_ENABLE();7 {; Q, b/ i3 k  J* R! _
  40. - N5 k+ b( Q: c. N* S( F! w5 E5 |: a
  41.   /*##- 2- Configure peripheral GPIO #########################################*/
    ! Z6 Z1 {3 @0 r, t0 R  Q0 J
  42.   /* ADC3 Channel8 GPIO pin configuration */: l+ I6 {: }) f2 k( p
  43.   GPIO_InitStruct.Pin = GPIO_PIN_0;4 w! E% k6 M) e9 G
  44.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;  ?0 A/ {1 ^' x% \8 b) s+ p& I
  45.   GPIO_InitStruct.Pull = GPIO_NOPULL;" C3 M9 X* t- [0 S
  46.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);: b2 l$ V4 B! c& V( ]; F' m
  47. }: s2 U9 I6 A$ E5 y) _

  48. , n# ?; H2 ~2 R( |5 Y  N
  49. //初始化ADC引脚PA0,开启时钟
    * @0 W$ u6 C4 Y7 L: a. i) _! Y

  50. 6 _; j+ L6 ?4 N- a
  51. void get_voltage(void)
    7 X& D) Y$ |2 P
  52. {4 h5 p" O7 y" O! F! v2 A, h1 b
  53.           bsp_adc_init();
    5 S6 s4 u1 i# l# W/ |' J% [$ k
  54.           HAL_ADCEx_EnableVREFINT();
    + F, b- L9 W9 H- X
  55.           HAL_ADC_Stop(&AdcHandle);
    7 a: U' ^9 U  L8 a! j1 m" w5 Z
  56.           AdcHandle.Instance->CHSELR=0;
    & M  ?2 G  Y8 q9 k+ p0 z- E7 T
  57.           sConfig.Channel = ADC_CHANNEL_17;         //通道17专门测内部电压值- @4 m$ p, _6 R. S3 E6 Q1 [
  58.            HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);: i4 `7 s" ^$ |6 M* i/ G$ b4 I3 i
  59.             HAL_ADC_Start(&AdcHandle);1 r$ c& w0 A0 y8 B" W
  60.             HAL_ADC_PollForConversion(&AdcHandle, 10);    9 R# z7 f% E5 z& E+ _
  61.             /* Check if the continous conversion of regular channel is finished */" ?$ I9 b- Q4 z0 K
  62.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)8 U1 F+ ]0 I$ U+ ~' e( ?
  63.             {: Y* R+ p* H6 K" _3 `& T0 `" @
  64.                 /*##-6- Get the converted value of regular channel  ########################*/3 `. Q8 @5 ^% R( t- G- a+ p! j# u4 F
  65.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);8 ^3 b8 Z$ t$ z/ w4 S
  66.             }
    7 a; O  M4 q) s; B! b! J) w) Z( g
  67.   c; }; I1 b/ B1 r  d
  68.             vdd_value=VREF_IN_VALUE*FULL_ADC_DIGTIL_VALUE/uwADCxConvertedValue;    //内部电源电压/ x' K) |& I3 P. P% I
  69.             HAL_ADCEx_DisableVREFINT();( y, r# Q2 q" Z8 c0 p6 T9 H
  70.             HAL_ADC_Stop(&AdcHandle);0 K" [8 N' Z: k/ F2 W5 d
  71.             AdcHandle.Instance->CHSELR=0;2 d% v: g; D) h; ?* }# p0 ~' t
  72.             sConfig.Channel = ADC_CHANNEL_0;             //ADC0,去测外部PA0口接的电压
    ( t( ^# ?3 g4 j& }  @9 L
  73.           HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
    % R0 s) r! w# f" [6 o6 z  ~$ N
  74.             HAL_ADC_Start(&AdcHandle);
    . ~4 n. f$ ?  O6 N3 f& G$ n
  75.             HAL_ADC_PollForConversion(&AdcHandle, 10);   
    2 N2 }6 {/ f9 Y! J2 j. Q
  76.             /* Check if the continous conversion of regular channel is finished */
    & Y5 C. V6 h/ O. p! O
  77.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)* ], O, J5 g  J7 s  C6 r
  78.             {. L+ a6 Z2 l, |  z
  79.                 /*##-6- Get the converted value of regular channel  ########################*/2 D- o9 H, I9 X4 x; M- V3 f; _& h1 P3 Z
  80.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);9 V& P; e8 Q. |: f2 ~" G
  81.             }
    2 l9 r) q. s2 P5 m7 S
  82.               //直接获取的是二进制码,14位对应最大值4095,内部电压为vdd_value通过比例计算得到电压数值
    6 |* d/ Q6 H7 X& e% T; a4 Y' Z
  83.             temp_voltage=(float)uwADCxConvertedValue*vdd_value/4095;
    0 V6 P" Q$ H8 J; ?& v9 E
  84.              //得到浮点型电压值            是乘了1000倍的            
    & @3 Z- d* J) Z5 P& D5 d$ d
  85.             HAL_ADC_Stop(&AdcHandle);
    , T. r/ n$ {, ]4 I' N/ O
  86.             //HAL_ADCEx_DisableVREFINT();
    $ Z+ Y8 o5 ~  L/ J& `
  87.             __HAL_RCC_ADC1_CLK_DISABLE();
    * ?# o* F4 \/ f8 n0 n' s
  88.    }4 a! R/ ?' r8 `3 }
  89. }
复制代码
7 E4 {9 y2 r' w5 K8 x
8 C% Z$ `, {9 w0 t7 N' b# z" x
  以上ADC检测,相当于一次连续检测了两次,第一次为内部电压用的特地通道17,第二次检测的是外部电压对应硬件连接的PA0对应通道0# ?2 D* o5 a" @/ W
5 |+ F% g1 K- O/ W

' L  `7 j0 m$ T
收藏 评论0 发布时间:2021-11-15 22:02

举报

0个回答

所属标签

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