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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图
+ r% H; i$ `, Q# B) g$ a/ e% O5 B  x0 [' D( j4 K+ M1 `
20201216095853276.png

: o2 k% U; e; `4 K6 B$ X- E
6 ^" W. K2 @2 U- W8 k程序:
, u8 {5 |) _! @/ S+ N1 C
/ ?. f  ]; P: U8 E9 v
  1. int main(void)
    2 J& W& V7 N' W/ W/ W" C( @
  2. {
    ( H; z- E; b8 g/ C% Z
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护
    ! k- Z8 |  z% j3 J7 L, _
  4.     HAL_Init();* t; H! X0 |& o
  5.     SystemClock_Config();
    ! n; r& u; \8 I' L% P( D
  6.     MX_GPIO_Init();- ]. l& j' Y, W
  7.     MX_DMA_Init();
    8 h$ ], g5 b6 ]" j
  8.     MX_I2C1_Init();8 u; @  _& d% I8 O9 a
  9.     MX_ADC1_Init();
    * _9 l# P. Z3 [/ L% o8 I
  10.     MX_TIM2_Init();  J; L7 ]' P) b7 E' g; }; e
  11.     MX_NVIC_Init();3 q8 J/ r$ D5 x8 j
  12.     HAL_TIM_Base_Start_IT(&htim2);
    8 s1 g. W, u7 o7 `, n
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);! i- m. d4 ?. e6 A
  14.     while(1)) H3 c. a( v7 z1 G7 H
  15.     {6 \: \6 l- o: X+ a1 K% h
  16. " I* `) @) ]+ r3 ]/ `( @7 r
  17. 9 o5 J. L! A1 x' G  {
  18.     }
    3 R/ B8 C, h, h6 c! [$ I, D
  19. }
    7 F& M! I# e$ ]2 Y, n! z
复制代码
% u' T4 [/ G  D
% L! p8 M3 Y- G* a( P/ k& D% U; \
  1. void MX_DMA_Init(void)
    , B3 r' n6 Q8 Y  p- M
  2. {
    & X8 Q2 |- P; B6 k7 N9 G* U
  3. : @) u4 K7 F" n, w
  4.   /* DMA controller clock enable */
    ! f3 L4 f* |; E8 ^3 N7 `9 U
  5.   __HAL_RCC_DMA1_CLK_ENABLE();8 b, x5 G. K  C8 E
  6. 6 L7 M2 @. v% u8 L4 ~6 {% O( ~
  7.   /* DMA interrupt init */7 D. K" B8 @% W2 D/ p' i9 K
  8.   /* DMA1_Channel1_IRQn interrupt configuration */
    , C- c. ~2 ]  i1 B
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);' a! G* D3 R+ Y$ T
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    " C/ s( g9 M0 |) T
  11. 7 L# B, _" u0 A: z4 h$ L7 {
  12. }; Q- u. F' s: q# o& T% u/ N
复制代码
" |/ q9 s" s; R  W: E
" \9 h1 s' C/ ?) z
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC1 p3 k& U+ N! ^" c% D6 c2 ?. ~
  2. 1 Y* J) c$ m  q$ K  ?# e+ ?. C
  3. ADC_HandleTypeDef hadc1;
    1 ^$ O: k( N$ K8 [# e
  4. DMA_HandleTypeDef hdma_adc1;& f) T# }" N+ Z1 h# @8 r" w* u/ T

  5. , b% h- U' ?! ^' g6 t( x% K
  6. void MX_ADC1_Init(void)
    3 ]! Q! V% C! y, m
  7. {5 x+ J. W; K3 T" n$ L' v9 C) B
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};, a$ o8 ^. m2 e5 P8 U
  9.   ADC_ChannelConfTypeDef sConfig = {0};
    # O3 E6 |6 Y9 Q1 W! p

  10. : T1 _  r. _2 x, C5 {
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    7 J# u! N6 j. d* ?
  12.   */
    + t5 x: o: L9 |3 W% }# z
  13.   hadc1.Instance = ADC1;; x7 j, S' Q) c, f7 o% h) i+ \# {
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    & k; X; I3 a* K( ^1 O& ^
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    9 |; {! ~. P, c$ @8 F% I' |6 s
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;$ s8 i6 g% n! Q
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
    : M* s& s7 R6 f, _- a( N
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
    2 ]2 z2 j7 I8 J+ E( l! z
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    : E! m* z0 n3 c2 u5 j8 v
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;$ h; S0 D# u$ n: _0 P
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    ! e% ^1 V& Y2 o4 v1 m
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    ; ]8 \. s  y4 w/ R- u
  23.   hadc1.Init.NbrOfConversion = 2;; a* Q. _8 R' v- Q4 u# i
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
    - h  r2 M& D' _' Z( `; z
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;0 ]1 J" A0 i. \# p( I4 l2 S
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;; j9 z! j5 R& j
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    / v8 y* s, R& q. }- f7 V# L+ s9 h
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;
    ( F  w% t( U/ c1 v! f8 f
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;# P/ h( z  a5 M9 m
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;, Y3 U# h0 o/ c: M$ [6 l) M  {1 S! |
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
    ) D9 _) y6 ~: D3 r: f
  32.   hadc1.Init.OversamplingMode = DISABLE;
    2 L4 L$ J5 c; |6 C
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    3 H2 Y- H' ?: Z$ `
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    / G$ e. y6 D: W% `' P4 [( t
  35.   {
    # w2 _4 H8 m0 W" K' O: j) i
  36.     Error_Handler();
    ( c8 a6 f8 e( E8 Z% O+ z
  37.   }
    ! L, }$ n- a4 {/ G+ Q8 n' }8 I
  38.   /** Configure Analog WatchDog 2
    ; V" g+ T( n( i" C. \0 J
  39.   */
    * i) V+ j. Q2 A. w
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    ( Z$ O4 d9 [* f! ~
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
    - c3 E( |/ B! w: g- C
  42.   {
    4 h- l6 n6 \& o  q
  43.     Error_Handler();
    6 m$ h, ~3 B: H. Z' c9 D
  44.   }, `( R7 w7 W' |0 ]' i. V% n
  45.   /** Configure Regular Channel
    ( J5 o* D, E! f6 B$ Q
  46.   */
    + {$ G. @" o9 y% g8 {1 ^
  47.   sConfig.Channel = ADC_CHANNEL_8;
      a8 j0 r9 _2 d5 l! u1 h
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;
    ) Q8 Y$ d; A& S/ e
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;0 q0 ]+ C1 ^" {0 T6 C1 B
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    1 }' _6 E0 [, V; s4 b5 W
  51.   {
    $ S2 ^% k: q" r6 @4 x
  52.     Error_Handler();
    : q3 S8 ^% t) l  Q) N
  53.   }
    $ L; ~" s; R# y: f
  54.   /** Configure Regular Channel 5 F# ]& j. |: Q
  55.   */# @% A) ^8 V" _2 R% L  f
  56.   sConfig.Channel = ADC_CHANNEL_15;
    2 ?1 `- u. M: b2 C/ f
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;
    4 _2 a, A3 g8 S$ b) w4 Z" V
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;4 M7 a6 _# h6 }( W
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    4 H% z/ }0 S2 P' p' X0 g. d
  60.   {' k& A2 D; I; I7 P
  61.     Error_Handler();2 L" |$ m2 W# P* d* a
  62.   }$ _) Z2 S, `( A  i- c

  63.   Q% ~) ?: f+ q. D- n
  64. }
    1 R% x6 d! t. x- m6 b1 I

  65. ( w. z! k  c# y* ^) K2 Z$ ^6 n
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
    0 X& ]6 _: x% }8 m! p# D: F  K) \
  67. {
    ! ]( c5 y0 F1 O4 t( b* s' y' |

  68. - ]  x8 Z2 T. E$ X
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    ) i  V' [- Z5 {
  70.   if(adcHandle->Instance==ADC1)2 N% R; F* {8 @) x% {
  71.   {
    # y0 m- ?1 M4 k7 P$ ]9 ^; j  n1 q
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */" N$ b, S+ y8 m1 n6 L! I
  73. 7 J, j! S9 F. f: ^3 o1 @6 i
  74.   /* USER CODE END ADC1_MspInit 0 */) D  u# n$ k+ [8 W
  75.     /* ADC1 clock enable */9 V( d* S0 e: F# K8 w
  76.     __HAL_RCC_ADC_CLK_ENABLE();' x2 s! G: A( j( ^  y& k# e5 v' R
  77. 9 B3 ~! Z0 k% U7 c/ C! R/ J
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();
    4 n; w: @  E& K. }# X% U
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();' n3 W6 F( N& B
  80.     /**ADC1 GPIO Configuration   
    5 B  U7 C7 p) e  x
  81.     PB0     ------> ADC1_IN8/ e0 z. ?5 @5 P: `- e/ w) p
  82.     PA11 [PA9]     ------> ADC1_IN15 1 l! H  i. S9 b$ e! X9 u
  83.     */0 {6 n+ H* G5 v4 e5 M! I
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;
    ) T6 y+ E2 ^% y9 \( m
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;  o) Y, m0 ^" R1 b3 l7 u
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;1 w" O- G( r) S& M$ Y( E: g7 |% T2 v3 [
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);$ U6 }) J# u, E; ]: a- Q8 e
  88. % D9 a. Q  ^# A$ L( N* O
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;
    6 |+ H; _5 V$ F3 s
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    / f2 \& l9 ?: g, w% ]5 {
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;9 u* J/ f/ w: @0 w. I8 S
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);) {5 N% Q- V; \3 N$ @# G

  93. + c3 [. z6 W% S8 l. d& c: M
  94.     /* ADC1 DMA Init */* Y. o' \) Q9 d' m; H
  95.     /* ADC1 Init */8 X9 B+ h5 _. a4 C9 o' q
  96.     hdma_adc1.Instance = DMA1_Channel1;8 F9 b% B. P. y% P
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    $ N! n5 v5 P. l& ^/ u7 X& U
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    / q. U$ L( ^, j9 c
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    , F" [8 O; H3 v
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    - t) _2 n) m( b4 {( h  Z& O( P- c
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    ( t) e1 o7 R6 W$ N
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    * ?1 j' t: P7 N
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
    0 h  H5 A: v. S0 {; J
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    * |) o- A/ O. X1 x; I
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    # z# l7 r- P5 S4 U8 w
  106.     {
    0 e$ Z( q2 i0 {: @1 k# Z6 V) |0 [
  107.       Error_Handler();
    1 _6 P; M/ ?% x( D
  108.     }1 C. Y5 _# k' b

  109. ( T9 d$ x* y5 z# ?0 u! j
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);+ L0 x4 d+ k% Q  H; o

  111. & ?6 m7 C4 t1 |' e6 x3 F/ }% q
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */
    ! e4 ~  e. q, t

  113. 6 T& c4 e! d7 P* v& M8 l0 {* E( R
  114.   /* USER CODE END ADC1_MspInit 1 */* o/ d; d& R& c
  115.   }
    / f1 ]/ L. i& B( i7 P- x
  116. }
复制代码

" V/ z* e% ], r$ w. D6 ]分压公式:U1/U2=R1/R2) o  k0 ]9 z) a; S% N$ T

2 f& v, f6 I0 H+ o7 y: }9 H
  1. #define R0  220//分压电阻阻值/ |2 t1 m* |/ y5 X/ A5 S* M/ x
  2. #define R1  100//分压电阻阻值: F1 w( K) V$ ?* L7 B6 B
  3. #define ref_vol 2800//参考电压
    & N! b, I8 P/ T! s+ j

  4. ' O, n# N3 x2 [. ?9 _' N0 X: }  ]
  5. ! }4 y/ {( P( w; U6 v% X) K
  6. static uint16_t get_volt(uint16_t advalue)
    " f* Z/ u7 S. A# I5 y  O# r
  7. {
    , Q3 Q1 x0 H9 V, J
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;9 @2 ?, D6 ]  F+ Q2 I
  9. }
复制代码

  ?1 C  n, Z  @" B# W
6 C7 h  Q8 X$ }3 \: Q3 h6 q5 {8 {, E5 c
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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