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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图, S) G1 z" [& B4 H" U; R
6 _$ v* J# u3 q
20201216095853276.png

% }6 ^: H) }( a1 f8 j5 Y. W, k7 \% |& s0 J% T! c
程序:- T( w3 k' X* M+ _! Q3 S$ X0 J$ ?

$ p* [2 }$ w. Q# ~* ?
  1. int main(void)
    ) |6 i* p0 o5 u1 u
  2. {: Z' Y6 a* E% R7 Y2 V" t
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护
    9 X1 q! K' T' t$ P
  4.     HAL_Init();6 ]9 B! W* I6 ], P$ |* o
  5.     SystemClock_Config();
    # U! i' ^) f7 Y6 e0 V# l+ v
  6.     MX_GPIO_Init();
    " r& H8 t  B0 a* S! Z+ q" O- V
  7.     MX_DMA_Init();; ?1 z% P, |& h8 o/ h
  8.     MX_I2C1_Init();
    / i! Z2 b5 r; D+ ^- N+ e
  9.     MX_ADC1_Init();9 I. N% W3 l7 F/ X/ e  ]4 r
  10.     MX_TIM2_Init();
    3 `8 b! R4 I  E4 g+ P% a  g
  11.     MX_NVIC_Init();
    ) K" D, ~. w0 H6 R
  12.     HAL_TIM_Base_Start_IT(&htim2);5 K" f' y" j9 b: Z# J. B5 l9 r9 t
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);" L0 A5 A0 o/ Y
  14.     while(1)
    6 H3 _9 _$ S" _
  15.     {$ V) v- n1 K" @7 p7 k
  16. # a' p9 X* k$ \0 H9 f# _9 g# V

  17. 3 G- I1 g5 @! v# e$ H; `
  18.     }' I! e- Z: `" K% R) M, s# n
  19. }5 \. Y0 p3 w1 w8 j
复制代码

2 `3 @  v6 C; J
7 _! G9 j* @  z' l# i: i
  1. void MX_DMA_Init(void) " w/ X% y! X& I$ M1 f& ]
  2. {9 p+ X( m0 B/ \, V# y

  3. # `, ~* Q, {' o. t
  4.   /* DMA controller clock enable */
    9 ?- i# }. h* R' `4 G  q
  5.   __HAL_RCC_DMA1_CLK_ENABLE();
    2 U, ?2 l7 [/ R1 G8 V' E! Z" k

  6. 5 j8 ~) Z( E1 b. @, j/ c4 j2 K6 X/ ]
  7.   /* DMA interrupt init */2 U8 N5 A8 @5 K9 |2 N
  8.   /* DMA1_Channel1_IRQn interrupt configuration */) p+ ^# b4 Y  L: k$ Q
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);+ f! c8 o/ Q0 B, f" {
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    7 t- A" V, y: d1 H" o" z' ?+ o5 v8 a
  11. 5 }3 X0 L( m+ x: n* X% f, E) Y
  12. }
    - G# E5 O* ~$ v; G( R" [- V  b* g
复制代码

# w0 M$ \, S1 X3 X2 P6 S) d, ?) z5 E+ D3 I
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC- w& y! F. p7 H+ P
  2. - j1 x, a0 Y, D0 g1 u
  3. ADC_HandleTypeDef hadc1;
    ' O* B1 ~- o/ v# d
  4. DMA_HandleTypeDef hdma_adc1;. {; Q; Y$ S) e/ P0 s
  5. 1 u& ?# U9 g* v$ J- {  l
  6. void MX_ADC1_Init(void). C) G+ T7 q+ B( \
  7. {
    ; B3 D$ ?) p: ]9 D4 @- ]
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};* u# X4 d) O4 N  n3 o7 ]% P
  9.   ADC_ChannelConfTypeDef sConfig = {0};
    ; m  ]) X7 m1 ^
  10. ; s9 V- b: K. w7 z4 _( T
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)   d! U* G; B3 v7 n* A7 p( T8 s; _
  12.   */
    0 K+ m" J! I$ k& n1 [, Y
  13.   hadc1.Instance = ADC1;
      r% X* F: j$ l9 y& v* H# y
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    ' G" z4 m( A4 o9 y6 h
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    ! v* v* D: H6 R
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;: v' P, Z+ v5 h
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
    " s7 T: ?* u. ?8 q
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;: v% \7 Y6 {( h8 y2 h" C
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;/ C2 i; j: H2 m6 u/ |' I: a! l& y
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;
    6 ]- u: O* I. L! b! b
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;& [( ~- A4 Y& Z- C3 B+ U8 ]+ w
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    $ d8 k+ {& C* R& m; V
  23.   hadc1.Init.NbrOfConversion = 2;
      s, _% f7 j9 |2 p
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
    6 _( {/ D$ I2 i
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;
    $ G  v$ i! j6 N6 p- x6 A
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    ) t% D: e( `8 r* O8 L
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;8 ]6 g- p1 R5 j8 _8 J% r
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;
    % A/ H+ O4 @( a' N0 k& _, Y- a
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;4 }' I/ j5 F5 f& S- j3 J
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;
    . R! r  [( [1 e/ B2 H/ e1 \
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
    ! m; i/ Y9 [) Q
  32.   hadc1.Init.OversamplingMode = DISABLE;
    * X  {5 \1 o' r% V" \
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    3 [$ m$ o2 N# h* n
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    ) r0 X9 \4 b  w; Q) U' b$ z0 A
  35.   {
    6 `8 {3 ]/ e, I  w2 f6 C
  36.     Error_Handler();
    * G; b; P6 W( @1 \$ Y& S4 F# Q
  37.   }
    : [$ [* f: l! K4 \5 g. ^) Y: u: k
  38.   /** Configure Analog WatchDog 2 4 P6 f) B- R; e- o. F8 A
  39.   */
    ' h/ O5 n/ H1 _! A
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    : u9 h. M8 H$ _
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)4 N2 m% c- ]# C, h7 G$ n
  42.   {
    ( g9 R3 e/ F9 ^2 U' j
  43.     Error_Handler();. n  x4 p! m+ e7 i9 H% j  D
  44.   }' |7 K  f1 G/ \% F/ h
  45.   /** Configure Regular Channel ! o) u& V. C. u5 n6 U/ ]& F) b* v
  46.   */# t  N7 e" q3 J/ k2 M3 a* k) b
  47.   sConfig.Channel = ADC_CHANNEL_8;
    & c4 C$ a- H& d: P1 W2 D
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;
    " q2 _3 e! S  G8 j$ T
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    ) X6 M1 `" Y# u! f# G7 B3 ?/ p
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)5 L0 E- ^% n2 ^$ U
  51.   {
    2 d& \$ N$ E3 o1 A6 [) V
  52.     Error_Handler();# U+ `9 I! h$ \
  53.   }
    2 x* s' b3 v, ]4 y; k* q
  54.   /** Configure Regular Channel
    ( A) b& C$ ?8 `; C# D
  55.   */
    - U# {, P. o0 \% p& m5 I  S: S
  56.   sConfig.Channel = ADC_CHANNEL_15;. }# Y/ T- c+ D+ a0 F) f) y* n3 B
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;" A3 d& S( \+ T0 W$ H
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;" A, b- X% C) Z* ~- L" F( F
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    ! O6 p' C' P2 J- E# [
  60.   {; O$ e/ f4 t, w+ ~  J8 s
  61.     Error_Handler();
    , e$ u1 s, M+ h" ?- u
  62.   }
    2 f& x  J1 j, l0 {/ K* Z! j

  63. ! |3 I& n3 F5 D: C: B2 h
  64. }: J2 g( U2 l8 e7 Z; v! c; u

  65. 2 ?& Q) ^3 t2 Q. h, C- E& B: o3 N
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)4 }8 S4 B& l9 [% ?6 ?  b' [1 f
  67. {
    ( r- t1 n# q/ g( r

  68. 0 h9 s! S+ C1 N% {9 r
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};1 x/ R2 ~4 I1 B* H
  70.   if(adcHandle->Instance==ADC1)
    7 C3 Q! T2 M2 ^
  71.   {, b7 w8 O7 a6 c/ `
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */
    * f* q' R" R3 u. [7 \5 Q( H

  73. # T' H- a. K7 Q* A+ N0 ]
  74.   /* USER CODE END ADC1_MspInit 0 */$ V# J  V# a2 j0 R
  75.     /* ADC1 clock enable */
    0 V2 L* N7 Z5 r  T+ T' w
  76.     __HAL_RCC_ADC_CLK_ENABLE();2 [2 m5 a3 ~0 \* K

  77. 0 O  N" S% o# z3 Y
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();
    / Q) M' J, X% m" d! H# E. P
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();4 j' d9 _- U* h7 t. x
  80.     /**ADC1 GPIO Configuration   
    3 D4 n1 C9 L# d
  81.     PB0     ------> ADC1_IN8
    $ @5 {9 a- B3 i% _! \! o
  82.     PA11 [PA9]     ------> ADC1_IN15 ! o: Z+ s6 M" s1 i4 }
  83.     */0 h1 i+ v- b$ h  [/ w
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;
    $ I( ]# {8 g6 Y3 @0 n7 k8 c
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;( Y: k" H# O4 G; H
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    " C  D5 M8 k# J; j$ q# D
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    3 B8 B% y' Z8 F1 ^4 B
  88. ! |$ m$ Z  f( }7 v0 x" }
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;
    : n0 n: U3 j$ x. z- \6 P# m: F( Q
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    + M% J, T0 p: z! _' k6 o0 s. ]% Y2 K
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;6 \% @; H- Y5 X: c: c8 k" J, R" m8 c
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);" e; J6 N6 X% C- N! v
  93. / A$ b9 J9 E5 D
  94.     /* ADC1 DMA Init */
    1 z4 e7 N/ N! J  p
  95.     /* ADC1 Init */8 v/ L1 m. z! ~/ E: E
  96.     hdma_adc1.Instance = DMA1_Channel1;
    0 b4 }3 \7 A- R2 @9 N
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;* O0 Y* J  o( N8 k
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    ) n: W2 ]' r1 R& M9 |: `) t2 Y
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    & L3 U$ [% o" A
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;) I7 P  ]+ Z' [; U8 E1 ^$ F" b3 J
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;9 g# G8 w- L2 X  S/ y
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    * Q4 }9 b5 |+ T. V/ E7 r
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;. Q/ h, ^  g; C: \/ ~
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    ! E- N# R+ H, M" q/ ~
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)1 E, C& ^! \( B+ U4 J- I
  106.     {
    . a6 J& J  k' Y2 q7 E
  107.       Error_Handler();
    7 H5 |& u+ Q, z+ |/ N
  108.     }
    9 U& I6 {4 z9 ^* m

  109. % B, f( j$ B% d; b8 l6 c
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    $ T) P6 B+ ]6 T2 C! Q3 x9 s
  111. / R9 K0 u! G, v% z/ i8 b! v' @
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */
    . [: y; l. n5 G+ q! z' e( Z% y
  113. - T' P1 d; K& A8 N+ ?* {
  114.   /* USER CODE END ADC1_MspInit 1 */+ W% n1 d+ d8 J
  115.   }  a" R! V8 F+ g4 {) S+ G
  116. }
复制代码

) [+ H+ F% }/ v2 W  X- ~分压公式:U1/U2=R1/R2
$ p# `  ~0 E) S+ O2 E% A7 a4 P. o0 e
  1. #define R0  220//分压电阻阻值
    % Y7 x6 K; z4 N: Z( K4 X
  2. #define R1  100//分压电阻阻值, }. L) `0 W5 K% f
  3. #define ref_vol 2800//参考电压, x/ |3 g( \5 E7 \* c8 u% [

  4.   ^4 d- T/ g4 n

  5. . E8 N5 m/ R, H; P3 S. O: B
  6. static uint16_t get_volt(uint16_t advalue)  M3 c/ p& m. {9 g7 S
  7. {+ E6 N0 f$ D2 e2 M- _! S0 d& e; T
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;% u8 A, {9 }4 t! L
  9. }
复制代码

* a1 s+ j; l; n% H7 g$ M) [# P' M
% q; x+ k4 x! k- D" f. s( e4 a; g  t  I5 d
% B6 Q+ L/ t0 G# w5 @5 Y5 E
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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