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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图
& Z$ z; c( h$ o# r
' ^6 P' w! m9 ?5 O
20201216095853276.png
: E! \6 {: Q0 ^9 R# ~8 Y

$ q' |: O6 ~! S% q. k( p2 F- s- J程序:
5 D8 X' `7 B! E0 R% I+ |
6 p9 I: O2 m/ `) R+ t& I
  1. int main(void)7 v) q$ _( C5 ^1 B. K# Q
  2. {
    . m& I' {& _  @4 D% }; Q
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护; o7 o. L/ ?# J1 I, Q3 L7 A1 X& U  R
  4.     HAL_Init();
    2 _+ |& D' `" M! Y# i2 n, ~7 k$ R7 `
  5.     SystemClock_Config();
    7 G" t* ^4 w2 W$ W
  6.     MX_GPIO_Init();
    9 J8 n5 t1 Q( g- Q5 A2 a; k) |$ M
  7.     MX_DMA_Init();6 Z6 ?( }8 @4 m  \4 s8 ]
  8.     MX_I2C1_Init();
    / J! b' K3 g/ {' J5 o9 I
  9.     MX_ADC1_Init();$ f, }& {* @4 d& o. m( I
  10.     MX_TIM2_Init();7 ?" O" S9 Y9 g: F
  11.     MX_NVIC_Init();* {/ N* x$ e  |2 w5 a2 H
  12.     HAL_TIM_Base_Start_IT(&htim2);
    # J# r. v/ V% R' b  O. @
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);  k. [' R; ~. H" M
  14.     while(1)
    / ~2 \  ~: b! c" A/ N' i
  15.     {
    ) h5 U$ Q, G. {& n
  16. : S. w6 F. ^& K2 b8 ]3 p

  17. & q) a" m2 z' ^4 z; R! ?
  18.     }- F# G" @- G4 T$ Z5 g( ~
  19. }' @! z2 R: U/ U! V
复制代码
) K  T4 c  P+ e* m% l, x% j

% k4 c6 ?2 `) j. l, p" L) Y. o
  1. void MX_DMA_Init(void) : K  ]& M: Z, H
  2. {
    . R- C1 ?1 Y  m* P9 ~
  3. " `8 ^" [* l$ W) p5 [# g7 ]
  4.   /* DMA controller clock enable */, m* I4 M- U/ z2 z+ B
  5.   __HAL_RCC_DMA1_CLK_ENABLE();' ~: W5 T, ~$ M

  6. / }7 [' Y# M/ m
  7.   /* DMA interrupt init */
    : d: Z5 s9 x8 a
  8.   /* DMA1_Channel1_IRQn interrupt configuration */
    1 X; W! }( }9 R! q2 [3 i) M! E/ Z$ {
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
    # Y5 a: B- i! w1 z
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);! g8 U# b* Z  H

  11. / ?* I- W# b8 N) ~* z5 j0 G
  12. }1 e  I7 |* m5 W: X1 q+ i; E
复制代码

, _5 t3 J& |& m) a" X5 p, p% ]" C. a/ m1 I7 `
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC3 W5 T! h6 j0 w' c
  2. # Z( q7 S0 A# l- H$ |" B
  3. ADC_HandleTypeDef hadc1;* H3 u/ l% a* g
  4. DMA_HandleTypeDef hdma_adc1;' H1 D# `% b+ m3 p3 v3 r* d# Q
  5. 1 ]: ]" V" M7 J8 S9 G" e
  6. void MX_ADC1_Init(void)
    8 Q8 q1 k- k2 e6 G* M! m- Z* q" X0 Q
  7. {; V3 q) r) H2 [3 f9 s- P1 x0 Y2 D1 c
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};/ G0 o3 S2 I$ k5 H3 m8 [$ e% f
  9.   ADC_ChannelConfTypeDef sConfig = {0};
    $ n5 T. ^; B3 l. F8 H9 p
  10.   e+ l$ k& {$ |9 ?/ P3 t
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    2 j" x) F: M: M; b, x+ Z  a
  12.   */2 W1 {$ [- m2 m
  13.   hadc1.Instance = ADC1;
    9 _4 k" D1 B" w- S3 ~+ L
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    + o# w' {  c+ p5 @
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;0 J8 G  H. C) z9 f
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;% Z7 i7 L1 _' Z: q. ^% z
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;. g( m3 a" d( y) R: C3 O5 d
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
    * ~  C4 V% `7 q& B5 e$ h8 W+ A
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
      z" \( v% H1 }1 A- V0 [
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;
    & w- w( m. `5 g0 u
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    $ _% C2 D& F; s* W$ z) Z$ x
  22.   hadc1.Init.ContinuousConvMode = ENABLE;0 y9 b/ J0 x1 i5 x. E4 W) h0 L
  23.   hadc1.Init.NbrOfConversion = 2;2 k7 d; C5 O" x" V% g& u1 k
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;" E& V, R. O4 n) B8 Q  N5 t
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;
    - k, ?+ O* f! @/ d0 t, B
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;6 G3 c% N9 _# u0 `* u- f
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;/ F4 X+ g) @$ N" k+ e
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;
    . F" ?0 W# o0 _& r/ I6 i
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    " D! m9 X( O# I
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;7 e3 [, Q1 D: u
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;8 p. q* Z+ O: `' f! {* p
  32.   hadc1.Init.OversamplingMode = DISABLE;+ s, T* [& m: A- Y1 X% d
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    # o' ~& a1 T0 ^6 O; {0 R, }' X
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)1 `8 j  O, {1 Z. ~+ \7 Y* [  D
  35.   {) ]* }& ]+ i1 @* e2 l, T) S5 j+ U
  36.     Error_Handler();
    6 v$ {" v) d. Z$ b$ Z
  37.   }
    * I. b  j( ^: n. l
  38.   /** Configure Analog WatchDog 2
    ) T: O+ a  J- I3 |* o* T5 X  g
  39.   */' r- {& Z7 H1 P1 X3 R3 V7 w
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    8 a* l; L% i! V. N/ H
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
    1 N+ A$ j3 a" X( a( l6 V
  42.   {% t& h( F, i  {* s6 Y6 x& U3 y
  43.     Error_Handler();' u1 U2 ~1 E8 R: k
  44.   }
      ?4 E. e3 g2 M) G& J9 M2 H
  45.   /** Configure Regular Channel
    8 t; V1 b" M8 M5 q9 m( l
  46.   */, a" i7 r6 k3 D; R* N; l
  47.   sConfig.Channel = ADC_CHANNEL_8;2 ?: e* q0 e5 R- _( {$ M3 X
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;' \& t3 S/ b5 u$ U7 V9 N  G: J
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    # o; B. j" I& s" V* _+ P8 Q
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK). b- p! d' Z6 V5 U
  51.   {1 |( d  E/ ]) G5 c9 }$ k- M
  52.     Error_Handler();
    * d+ ]' ~0 Q% M: P1 M, H2 C! }3 |
  53.   }
    / a1 a7 L& B9 U& k
  54.   /** Configure Regular Channel   z7 {& t2 T* }  d, M9 ?: m
  55.   */+ Z8 H& _) i! ]/ k) @7 \
  56.   sConfig.Channel = ADC_CHANNEL_15;
    0 Z9 I; z6 Z, [% L+ I1 V3 w
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;2 y9 a/ R2 B& d+ Y
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    * Y; I6 b" n3 @* q9 E! ]; X
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
      V# g' q! W7 n+ `7 K! C# \3 L' k
  60.   {
    5 b$ l. R( {2 O
  61.     Error_Handler();
    6 C- ~5 z, G5 A& U) K/ h8 B9 K
  62.   }
    6 |, {! m+ _0 E% ]
  63. ! Y5 o/ p7 b# R  h) @0 {
  64. }
    , Z5 q. Z4 N4 g. |5 ?

  65. % r( b4 o5 D7 d+ O) r6 r/ n" z0 m  D
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)* m/ F# j  K! E* L# ~* i& Q
  67. {- ]; l5 G  |) ~/ P4 P
  68. # ~* H( g. }# G2 D/ Z! z3 T
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    , E5 `- U& W4 C$ c
  70.   if(adcHandle->Instance==ADC1): N6 C$ v4 ~9 A; p  N* T
  71.   {. P% i1 E( Q5 [0 @2 x. G1 J
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */3 z) v% f0 C! k! e

  73. ) y3 ~# z2 n* P$ I$ M
  74.   /* USER CODE END ADC1_MspInit 0 */+ q. E! b" |; G1 ^9 U, a- _' X, J
  75.     /* ADC1 clock enable */% V: y; ?, D- t' \  V! |
  76.     __HAL_RCC_ADC_CLK_ENABLE();
    4 Q; J% A1 ~) _1 r5 L- b

  77. + ^- a9 F5 p) n; C3 x9 {8 \6 b/ J: s
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();& t1 {  p- o, A0 G1 V# _  l
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();  D7 y* ~. x9 p! W3 z
  80.     /**ADC1 GPIO Configuration   
    8 Q0 @; y# O; D- n0 Y  z8 P
  81.     PB0     ------> ADC1_IN8' _% s1 L7 `: P0 l( v5 ]
  82.     PA11 [PA9]     ------> ADC1_IN15
    1 v# u$ H1 _8 |# c1 }1 ]
  83.     */% f8 k7 g: A/ o/ Q
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;, Z; `: m6 w. W" ~/ ~
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;8 `. |5 i3 U  y/ X0 J
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;& [$ D8 n4 g3 m. j0 V5 Y7 c
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);- F7 S" B' C2 p( r; b  C
  88. - j: Y8 T4 k% Q
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;
    + i# c* j  L& W! {4 {& M
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    ( @  L3 b8 A9 U) D1 o) R- I3 }
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;0 y7 L% W3 N9 @7 F0 J; b4 e+ B- i
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);+ }2 j) z/ t0 J9 m8 [2 q4 |

  93. ! e5 Y- w* C+ \3 Z+ Q
  94.     /* ADC1 DMA Init */
    9 A$ o' ?% U  X
  95.     /* ADC1 Init */
    7 d  r8 i/ h  r
  96.     hdma_adc1.Instance = DMA1_Channel1;! _- t4 A4 p$ k
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;- a  M2 X) b! p6 t& d2 N
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    + H5 _* u  T$ |% [1 u( Y+ y/ |: d! P
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    : @6 Z" V! ~7 f) {
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;  n& B1 X- A" p$ p0 y
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;0 z4 b, I; H% l& i
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    8 O0 {" I; [0 a" S3 v1 ^! S; H& C4 C
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
    ( B" ]6 n1 a$ \+ b0 _5 A) A; o8 d( b- n
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;3 B) ]- U& t8 ^, R0 V; }: W3 [
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)' u, h7 k6 R1 j. N0 p, b9 r. L
  106.     {" u- Y" h; U7 ~2 g5 u
  107.       Error_Handler();# U: p( t! q0 r. l6 M% ?/ j
  108.     }
    , W$ o8 ?1 A: p$ P7 M
  109. & Y; \0 c# n, }- k/ p2 N% @
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);; i& i. L( q1 z3 w3 I0 y
  111. / C7 K! I6 A5 q" K' H! F7 n# i
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */8 P/ _. B3 c- G+ Z$ \
  113. " C6 w) ?; P; {2 W% R$ s" L# m
  114.   /* USER CODE END ADC1_MspInit 1 */2 M1 e" ~  z4 \; [$ S
  115.   }
    : s3 b3 x3 M  N
  116. }
复制代码
) y4 t: y: C' u8 H' n2 H# \/ [* S2 C
分压公式:U1/U2=R1/R2
! x; M' d" }" R. y  N5 Z( Z5 t3 e, Z0 I0 C5 u" P
  1. #define R0  220//分压电阻阻值. W" g. T5 \, c$ I" Y) Q2 O
  2. #define R1  100//分压电阻阻值2 o) q8 W/ k( C) C; U+ K
  3. #define ref_vol 2800//参考电压+ U& o+ P: ]  u  x1 ^5 A
  4. * m2 C: t8 H: J- l

  5. ( }6 w( `. F" ^9 E% y4 A9 T5 X
  6. static uint16_t get_volt(uint16_t advalue)1 T. T6 ]- w9 _, Y) z& Z5 {
  7. {* M. Q% l8 d% L; T7 S2 N
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;# N% H- k7 ]; A8 h# P
  9. }
复制代码
' T1 c4 T8 ], ]/ E. W# O# f( E
3 b/ P5 x( a. b' H
8 m7 L0 @9 A2 C0 A8 m; s) R
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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