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

【经验分享】STM32G031 HAL库adc+DMA采集电压

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图. a& u6 _5 m& O9 ^

2 _8 f  C' x0 g7 r
20201216095853276.png
# x4 G7 @- f: t( j! e0 p8 I% F
! D/ C0 x8 Q. N5 j
程序:$ C, _  ~: i* _7 E

- f( o: }, ?# `7 z0 K5 F0 G
  1. int main(void)
    3 k" l# I0 O. b4 S+ f% n- G- @+ z
  2. {* l! O9 a. g+ C8 g* _# O5 e2 K
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护8 Z. {3 P/ V. d' ]: h. v/ Z0 S9 j
  4.     HAL_Init();
    / _$ x* F, K3 m+ L1 v: F# U
  5.     SystemClock_Config();
    3 G4 W% }+ B1 `5 h; i5 M
  6.     MX_GPIO_Init();
    + s5 q: ~/ V3 {: o. t& |
  7.     MX_DMA_Init();
    / U* _1 v9 B1 L% y7 E" b8 T: H
  8.     MX_I2C1_Init();
    3 T2 w8 D4 Z, w! y2 P) [1 r9 q0 L! y
  9.     MX_ADC1_Init();4 R# a# v  w: I" |% |2 T
  10.     MX_TIM2_Init();
    # ]; V' A! ^# ]8 Y4 }
  11.     MX_NVIC_Init();
    & w: w4 \) w- ]$ j
  12.     HAL_TIM_Base_Start_IT(&htim2);6 s) E: N" k) d7 ?# l5 v4 a
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);
    ! ~, }) X9 X, h, E
  14.     while(1). |7 P6 w1 x  ~7 T
  15.     {
    9 h/ c8 N4 i# \
  16. : f% J. `! }% @6 D6 _2 o7 J
  17. ( e0 t+ r' W* T+ F* y
  18.     }8 M# X" Z5 b1 `9 X% a
  19. }  u# d$ M5 [, ~  c( I! X
复制代码

) X. Y( q0 W+ V; n% A4 o" \/ l& x5 g  l7 C& k( d  P) J9 n4 T
  1. void MX_DMA_Init(void) 8 m* w0 K  p0 u4 B1 N/ `5 @
  2. {: a& `( {& g3 m( |4 D; Z. `# \

  3. 6 ]7 X/ a% }# B+ D2 q) z
  4.   /* DMA controller clock enable */
    5 g# A6 n/ J5 z4 i/ e
  5.   __HAL_RCC_DMA1_CLK_ENABLE();
    ! @5 R- M9 m* v3 ?5 x3 C* d8 R

  6. & W+ h7 h( Z& p/ k( q: `1 E- h
  7.   /* DMA interrupt init */
    " v% \* m4 _# z- @" M( ~. S
  8.   /* DMA1_Channel1_IRQn interrupt configuration */
    - \/ F1 q. r" f2 `
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
    # ]: k( ?0 ?4 N6 n
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    ; d# M4 d5 ~) l* S, r
  11. : i2 i+ E7 z8 k
  12. }
    , T/ n& e9 M9 C8 U: j4 X
复制代码

7 k: |; B# d  ]0 W6 U! c8 W8 H
% z% \# S6 b, s3 b8 N
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC9 n  m: }. q5 s1 t

  2. + g6 j, V, y. Z7 w4 M1 L0 V
  3. ADC_HandleTypeDef hadc1;
    + I2 S  H: H) N2 h* H* G/ f, d& `
  4. DMA_HandleTypeDef hdma_adc1;& z+ b& C$ y- A# c: t
  5. ( ^3 E2 m8 z. Z' w* R/ {7 _
  6. void MX_ADC1_Init(void)
    % p2 y4 T( l8 }* Z: f, T( f: J  {. K0 f
  7. {
    7 d9 C# Y9 I5 x; |- J8 X! q
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
    9 L/ ]3 S9 U% [. y  C
  9.   ADC_ChannelConfTypeDef sConfig = {0};+ O& F! M% p" j4 {  q: S4 T. e0 d
  10. - D# |# \* y5 B) t$ ]7 C2 J
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    % f7 s: D9 S: L6 i, m
  12.   */; i- f6 d/ X$ M% B9 C
  13.   hadc1.Instance = ADC1;
    " Z, d. v3 _7 L8 Q  p9 s
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;+ _- S" n% e( p; {
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    9 N' C' l( W! w4 s8 x+ E& x
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    0 F% @' A. A7 B
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;( x; d, s+ i  q0 ]( a0 S8 k
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
    : `- K/ [+ t$ |0 I2 C& C4 W
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;- F8 N" f7 U5 t! \  T  N9 n
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;) {3 f+ ^" v' I* d( w) m$ p+ h+ d
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    : F+ u3 k: H! }( J
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    # W  i: \$ m% @: s7 K8 R5 r
  23.   hadc1.Init.NbrOfConversion = 2;1 q6 y% _: `1 Y  @
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;& r  u$ z- q. C) u/ y
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;
    " g/ L; \; k! `* H
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;) a/ G1 y% l! u) n4 M  h
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;4 V4 K! u' V  _4 ^/ _0 s: a; g
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;
    + B4 w8 _, c  E
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    4 e" c+ p; X$ L! L4 M
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;5 M  h8 g0 C# @( z- H
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;& `$ H, \" d* Y. x- ]7 h
  32.   hadc1.Init.OversamplingMode = DISABLE;
    % [) l( d9 H5 j5 F
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;9 e9 s' O: T5 s" ?2 L: r
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    0 J4 g4 d- n: s4 p+ M
  35.   {" \5 S: r& r, }8 _0 ]
  36.     Error_Handler();9 x5 U- S' N2 d# ?, o" K2 J
  37.   }
    ! J2 g' P) l8 F$ f
  38.   /** Configure Analog WatchDog 2 6 w7 p+ C0 X( o# a; D, U( ?  b- h; }
  39.   */0 @" A8 }1 s1 C
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    5 e; _! }; u3 [$ l  U! C
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
    , m( s7 H" p, S  p
  42.   {- F: H6 U. g) M* i- V- w
  43.     Error_Handler();5 B9 O( `  T& J, f3 I+ _+ g
  44.   }9 o: e+ r3 q2 U0 x
  45.   /** Configure Regular Channel
    0 Z0 W) x# Q) y& M* @3 ]* b- m
  46.   */, n4 ^% H5 W  G2 q. w/ g
  47.   sConfig.Channel = ADC_CHANNEL_8;
    * H" }" }: f% Y/ L
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;0 A9 ]3 p# g' C4 i4 J7 K) w
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    ' Z1 u5 e0 W. v& T) Z' R
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    # W" J# q* W: O2 L7 q
  51.   {
    / C3 q. Y7 A1 @- i4 a: p4 N
  52.     Error_Handler();3 F3 I. h7 Z# b( c" q- e$ n
  53.   }
    4 P6 k' _) g; O% [
  54.   /** Configure Regular Channel 7 j, t) ?+ ~! ?4 \; l# n! O) s
  55.   */8 \' r( _6 Q# q2 O- `8 A
  56.   sConfig.Channel = ADC_CHANNEL_15;$ c* [0 r4 t2 m
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;
    2 _& o4 h' v6 t! j, i1 P1 V4 m
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;# @1 V0 F' n, H# {  ^0 g! Z
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    ' @9 [0 @* y+ T" v# Z- w5 o+ p
  60.   {9 d2 ~6 s% V( ]
  61.     Error_Handler();- K# R/ e( j9 k2 e
  62.   }+ t; X: `+ h+ ]% K/ y. Q2 a0 ^

  63. $ _2 F" D- Y) h* N6 t
  64. }
    + [' u" t+ f  @7 m3 v
  65. , k! o. \, o! d4 ^
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
    : ~4 n6 ~2 f/ e3 J
  67. {
    * i+ q8 J+ }$ [5 O, i

  68. 4 @' E$ ~' m5 [
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};7 o- |+ g7 V+ v% x- b+ B8 ~
  70.   if(adcHandle->Instance==ADC1); Y3 O# m4 B# m4 r8 o" ]
  71.   {4 _) g+ }, i/ b) W
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */- G" I- P( S2 Y! p* M0 D1 x

  73. 7 z) \, j) q$ R  A
  74.   /* USER CODE END ADC1_MspInit 0 */* A( ^  L5 D8 N+ @
  75.     /* ADC1 clock enable */
    ' ^) j  g0 w- _
  76.     __HAL_RCC_ADC_CLK_ENABLE();
    ( V+ ~) X& T/ C
  77. % E0 I) L6 e3 L$ I5 ?9 _) Z
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();  j$ p( G! p0 d6 S' e
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();
    1 O: m. W% y9 G1 R/ m
  80.     /**ADC1 GPIO Configuration   
      H; C% D7 E# S
  81.     PB0     ------> ADC1_IN8
    3 g0 [' x  V& N" C# c' |5 ~9 Z+ R$ P
  82.     PA11 [PA9]     ------> ADC1_IN15
    ' W( m# n/ f6 p7 `1 x+ g* s1 Y0 ^% u
  83.     */
    % `1 V8 r0 O4 D; D- s$ u6 R
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;9 C/ F2 U9 L. B+ X, _7 E9 f: l  l
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    9 n7 z7 B8 y8 B1 R
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;1 s# h. u+ T* J) x5 g! v4 R" F
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/ {8 q& g! ?4 `! ]
  88. 6 l& ~0 u! |+ c9 ~1 A! i" _
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;6 K+ i- }+ i% [7 d, O" B
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;. C6 b+ m7 h3 C! V. R$ t0 I
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    # i& m! X6 W) f) B
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    % r0 g# [( x$ h# e

  93. ) s2 J0 O- h$ f1 P4 f
  94.     /* ADC1 DMA Init */
    9 m2 v$ z& y9 T; g* d- f$ u0 b
  95.     /* ADC1 Init */2 E  ~1 Z  B, L
  96.     hdma_adc1.Instance = DMA1_Channel1;+ i* C5 l* K( T! q
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    - z% @; M  h$ r) i7 s8 D
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    9 O, m/ a) R5 ?$ R: k/ O
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;2 u7 M& C" E3 T
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;1 V8 K! ~5 @( Y
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;! Z7 p) r6 M7 e
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    6 ?7 k0 B" @+ F. e0 h* K& `+ u$ h! u
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
    6 {2 _5 n7 }9 p
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    $ w; z( d0 G% x5 R
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    ( G5 W0 p( o. D* A* _3 ]" S7 j5 A, q) ~
  106.     {* L7 I" M& D; k
  107.       Error_Handler();
    ' f6 {- s( ^& N9 {
  108.     }  J( W0 J* Z. d: Q( z- G
  109. / o0 M  `4 B7 r
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    * Y1 @* D! H( a* h* b# b4 a
  111. 5 K. J! x- ^+ g) N
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */
    ( H" d, `$ v$ i0 Y( o/ ^0 D# x' I  K

  113. ! o9 G" k7 V, l" d; }
  114.   /* USER CODE END ADC1_MspInit 1 */( i% H; W( M: W- M& A4 c4 O
  115.   }+ `5 H" p$ Q- f* j% I2 a% O! K6 r
  116. }
复制代码
* F4 k: `+ ~) v5 F( g9 Z( E# K
分压公式:U1/U2=R1/R2. @  b: e* V+ w- n
% x+ P* p8 R; n
  1. #define R0  220//分压电阻阻值% v5 z1 L1 q3 Y/ f/ ]7 Q& ~
  2. #define R1  100//分压电阻阻值
    # j/ @( w# Z* q, I' W3 e
  3. #define ref_vol 2800//参考电压& `  w, b0 b' }& d* t- S9 q& P
  4. 4 j; @& f2 v/ ]2 q, \; A2 o0 i+ ^

  5. - k3 d5 V# x" |" K5 ^  o
  6. static uint16_t get_volt(uint16_t advalue)
    # z$ p! ]2 E# {. i
  7. {. I4 I$ h- |/ G- y. W+ G
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;
    8 z, J$ ^+ L1 J- p
  9. }
复制代码

2 r& k) @0 K* Y5 c; M9 S+ {+ K; B
" l; Y) J) |# a5 g% ]5 O+ r+ q. N- ~9 E
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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