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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图# B7 |3 w* g( }) y' y$ v) E

8 H6 E* G  d: P, A
20201216095853276.png
8 R% E1 }# r' B" ^2 \
7 Z* I8 r7 i* _, z7 w" R8 A6 K1 \
程序:& K1 j0 ]. o; S$ o

1 C  ~8 g% W* H9 G
  1. int main(void)
    * w/ o6 v* H6 H: U. L( ]' U
  2. {3 j/ ?, i7 G( ^; W
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护5 u) Q. f9 n, _+ {
  4.     HAL_Init();
    4 F4 D, ~. ^1 M
  5.     SystemClock_Config();
    6 ?) m3 a/ C9 S0 a
  6.     MX_GPIO_Init();6 [% H4 H7 U$ D0 T2 F; t
  7.     MX_DMA_Init();# V  n6 v9 B" ]" o" `$ c
  8.     MX_I2C1_Init();
    % m# U$ Y; v& u: s, K! U8 _
  9.     MX_ADC1_Init();
    9 t  l* {4 ?. Y, E
  10.     MX_TIM2_Init();/ X, c' I9 ~. r
  11.     MX_NVIC_Init();
      b; p  Y; k& L8 j, ^, r
  12.     HAL_TIM_Base_Start_IT(&htim2);
    ! o. Y# C! D9 y9 A6 B# V
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);
    3 s+ U" X7 F) o* Q
  14.     while(1)
    5 `$ _' F. N5 E. E! D4 Z; |
  15.     {
    ) n% S/ c0 `2 R6 s
  16. $ C6 {. v0 w" I8 F7 b- n6 v' i& b
  17. 9 \0 y8 M, y. I8 P# F
  18.     }  E+ O& w, x( l8 Y. C) h0 X
  19. }1 o* x- J4 K4 z" X' V! {. ]
复制代码

+ C: f3 g' ]" m9 W8 A2 g+ R; c4 E( t4 K6 U9 Q, z( R- x
  1. void MX_DMA_Init(void) 6 _9 l5 g# D8 M8 O5 {5 ]# W
  2. {
    " N) y8 w0 ~7 I7 o4 ]- W% z9 I! o" c

  3. . k0 o+ h% N. L! |& ~
  4.   /* DMA controller clock enable */4 d0 P; b6 C4 p/ ]: u* q
  5.   __HAL_RCC_DMA1_CLK_ENABLE();% p- R+ S0 ?) Z0 ?, l; Q. m
  6. + W7 J3 U  H2 O3 _
  7.   /* DMA interrupt init */
    ) j' v* }" T% z6 B7 s4 e
  8.   /* DMA1_Channel1_IRQn interrupt configuration */1 \3 G8 w1 O' s3 e, Q3 C
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);& v, }* f0 I8 I2 k6 |( r
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);/ Z; M" R6 p  i3 y) M; q$ F
  11. 6 c4 ?/ O, b* }) u0 k/ t% o
  12. }: Z' E& u( ^; G6 ?
复制代码
6 ~, M" |" g9 e5 c. d  y
9 u4 o$ {$ J& T
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC4 X, _) A# H/ N$ {2 E/ O1 H$ m

  2. 8 v; ~% `/ {- h3 ?* f
  3. ADC_HandleTypeDef hadc1;
    $ f4 _7 E! ^+ w) ^) X& [
  4. DMA_HandleTypeDef hdma_adc1;
    : J; G( \6 h+ w% b0 E

  5. 0 n; K* P" F3 q
  6. void MX_ADC1_Init(void)
    2 f0 L5 I2 y3 A3 {$ D: A7 x
  7. {
    ) Z/ S$ N' }9 h4 v+ v2 K$ c) P
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};- G  Z  N/ E. V5 w0 w$ {* j
  9.   ADC_ChannelConfTypeDef sConfig = {0};* @1 C! e3 r- ^; |5 O* T0 X
  10. & z9 y# l. u" F5 Z
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    5 T4 u( q; t% K' K9 |
  12.   */7 `& ?- L, V" @1 i
  13.   hadc1.Instance = ADC1;- u: B# W; |% D% @  d* d
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;3 U1 T6 h2 @$ B$ z# n' `
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;0 E. h) w0 V- X; q: E
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;# W; K) `* _1 R
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
    - w. D" K# c( b0 v( Z' ~
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;8 v" p& X) T* P8 i! n0 M
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    & s; [  X! ~; K
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;  O  M7 l. x: n: U
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;2 w8 l( q: k2 X8 ~
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    4 Q+ i* g3 H9 D+ f! Q0 i3 p7 J
  23.   hadc1.Init.NbrOfConversion = 2;& R7 `; M& r; O+ ^
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;+ r) _( p8 E% |* Q" |# R
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;
    4 [( E3 h  y7 L+ y4 ?
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    " A4 S' Y2 D% F  r! r4 {1 b+ k
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;2 N) q% R+ c+ Y, }; R. e$ f; V5 \
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;1 \$ ~' \6 {. g- Q6 U
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    ; l& @6 w: o( a  ~  m# e' H
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;
    3 Q7 {" u; W% [' ]
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
    / x. g9 q  F$ u' i2 R( ^  l
  32.   hadc1.Init.OversamplingMode = DISABLE;/ P2 ]* ~- d& ~. t- @% v4 q2 w
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;2 L% P2 R. O4 x9 W
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)" \& s& |9 W7 R; |
  35.   {6 T. ^) s+ t3 l  D- X# k
  36.     Error_Handler();
    , W9 r  t. f6 O- O
  37.   }
    1 S" r$ v$ h) N) I2 z* g
  38.   /** Configure Analog WatchDog 2 , n% `) W( P8 Z% [1 G% b
  39.   */
    . f+ D+ O8 h  o! G
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;+ [5 z. m! o3 Y0 N
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
    4 V3 ]* V& b+ m5 p
  42.   {
    3 o! i  r  x( b7 v6 s
  43.     Error_Handler();- f: @0 x0 Y4 e, V
  44.   }0 i, F, C% k; p7 `
  45.   /** Configure Regular Channel
    7 ^) a( [+ E5 k# `/ F) H
  46.   */
    + O4 y3 u9 b- G! F
  47.   sConfig.Channel = ADC_CHANNEL_8;
    - E$ Y: a& u6 h- o3 _
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;
    2 H- I  U/ Y2 ]) b  _% i. _! ~
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;9 D! {( B0 L( Y# E6 ^4 \
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    1 L" s3 k, q, q5 G7 y! @
  51.   {
    / P: N: `( y3 \8 `2 }, Q/ ]
  52.     Error_Handler();0 F# @7 V( M: @& S# H
  53.   }
    + b+ B; Y- U7 {9 {1 q; S$ p; }
  54.   /** Configure Regular Channel ) S' h9 |$ v' ^  j
  55.   */7 u" ?8 ?" Z8 s5 Q* }
  56.   sConfig.Channel = ADC_CHANNEL_15;7 `( L2 g9 {! [  l& p8 x
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;' r5 s& G  J! ]% J+ `% M
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    0 W& j- J$ T- Z' l1 `0 N
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    " Y" A; q' B% Z
  60.   {! h2 F  t. T0 i$ ?
  61.     Error_Handler();% z) O' }4 h7 @! z* h& y4 ^6 J
  62.   }
    ( ^) ^) s; D/ J

  63. - V8 F' ?. S. C( q) q. \) a: b; r
  64. }
    & x; a, P- G8 u2 Y" ~
  65. ( y& f% v9 g: B. D0 _, l2 H6 L
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
    1 r1 K2 S- Y2 W( Z
  67. {
    & s. I3 j; U+ p+ {9 G7 s

  68. 5 Q8 {" l6 p4 E
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};( k. Y5 ^  t0 x4 Z4 f
  70.   if(adcHandle->Instance==ADC1)
    ' p) o& e% O4 ?
  71.   {
    - O- S7 \. j3 u1 H( F# X
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */
    4 ?/ D+ M7 u- ^$ ?9 j% {! P
  73. 6 M; h# {5 A( {" A) e+ y) }
  74.   /* USER CODE END ADC1_MspInit 0 */1 L) u) g1 P, R" m1 |/ f
  75.     /* ADC1 clock enable */* p& C  z, z" X1 e" }
  76.     __HAL_RCC_ADC_CLK_ENABLE();5 c6 x. c) f) Y, y
  77. & ]5 P' ~1 i6 S) s8 ~- ?
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();
    5 \8 ~" C8 i% t- r" C
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();
    : P8 C4 k! y: Y4 ^4 w/ V  P. a* J4 A
  80.     /**ADC1 GPIO Configuration   
    2 j8 v, C; `( L1 N
  81.     PB0     ------> ADC1_IN8
    1 G! D5 H: r6 s# `
  82.     PA11 [PA9]     ------> ADC1_IN15 ! K, S3 M+ ~0 y1 u- ]
  83.     */6 F2 X, l' N3 j  x3 k* l" n& F
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;
    4 ]/ C- p3 J& O4 t; F2 K$ X
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;4 D8 I4 I' s7 W8 i9 b
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    # ]& G. Y3 r; \" t& k" W5 E
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ; I1 g" |) c) x, x1 J; H
  88. # {4 ]8 R: q( a7 c
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;& k! N4 V( |/ D4 J% o& e/ X7 u0 l
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;! G. I9 w1 @6 H: ?/ c1 d; N
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    : ]% t( S9 `' \2 }
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    , E% q5 Q0 j- V* ]/ `7 n+ \- [! ?

  93. ; E6 f9 n7 w* Y
  94.     /* ADC1 DMA Init */2 X3 r% }  L0 k3 L, b) K" s$ a
  95.     /* ADC1 Init */3 ?+ E4 `* I& i* c% f& U
  96.     hdma_adc1.Instance = DMA1_Channel1;
    2 c8 l1 i2 O7 j! U9 `" |
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;, Y4 K# Z  ^5 r& N4 j1 o3 B/ V4 L
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;* ?. b) ~$ K$ n0 H
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;  @# Z! c4 k/ D( _9 H7 {# I
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    ' j5 S# f! ]' l5 w
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    ! j% S! B6 c: k4 f
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;4 _# ]8 Q: t$ \3 R; |6 H
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
    , F" M8 ?, T+ \+ N
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;( B+ K& z! i) A& X4 N( W  S
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)3 i1 g$ e$ |* c5 I. Y) }" p. L
  106.     {9 d) n: l7 [6 a) {# z6 j
  107.       Error_Handler();; Q9 G0 l9 w" q
  108.     }
    - a2 q, ]% Y: V* z# g  D- \0 l

  109. * F1 ]4 {# M: C0 y
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    . |6 {6 c" a% y1 ?. f; a
  111. 2 K9 I9 |6 Z# F- L# o
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */
    ( `! A4 A9 {' F; f+ [) ]

  113. # g9 a  s: q; y! d/ I
  114.   /* USER CODE END ADC1_MspInit 1 */
    - G# U$ R& ]$ l$ ]
  115.   }) O. `# G! X3 q6 u
  116. }
复制代码

& N1 n6 z$ }+ j( v, Q6 A2 |' V分压公式:U1/U2=R1/R2
5 [& i2 R3 _4 t
8 O0 Z3 m" a9 s
  1. #define R0  220//分压电阻阻值% v- q3 |, z6 Y* ^' i0 c7 R# i3 _
  2. #define R1  100//分压电阻阻值5 G  m# C) t) w8 P- i
  3. #define ref_vol 2800//参考电压
    ; F) |0 ~, _  t& `* T* D, {
  4. 3 \3 o* X: U7 w1 [8 r% D% A
  5. , o2 t4 W2 e" Z5 u( a
  6. static uint16_t get_volt(uint16_t advalue)8 Q! i  a) c, j
  7. {; u; P; F. e: ?' p) U$ T
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;
    8 O  Q/ K- t( \- f$ X" P7 q) e1 P7 h
  9. }
复制代码
: |6 q3 v, b. b

2 Q# E: j5 C2 u( `5 H; D" e( I. N4 Z& v& ~+ ~2 a
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

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