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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图
# p) L9 a2 e0 @' o
5 v& K$ [) i% U" v* m& K
20201216095853276.png
) y% A; z' u' B/ O* I7 m: T1 Y

  {& s$ |3 |) T7 C1 D程序:/ m! }8 ^8 _. G+ _3 U2 p: k- v7 I
8 t7 B9 R) x* Q, ?
  1. int main(void)
    6 o' ^- M  W4 f' a! [9 M' I% G, |
  2. {
    : Q% L1 T. z- p: Z. y, O( _+ _
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护
    5 Z) X5 ^) N2 j# I# N& s5 X
  4.     HAL_Init();: Y8 `; X0 Y* l) \$ R6 f
  5.     SystemClock_Config();
    0 Q7 |% Y0 S* q- m
  6.     MX_GPIO_Init();* I% b4 A( F9 H& N7 S" E
  7.     MX_DMA_Init();
    8 P! c* Z* \( I6 B! Z
  8.     MX_I2C1_Init();
    9 f' q' H1 E, P5 j' K
  9.     MX_ADC1_Init();& R$ i5 D1 q6 ~( @6 {* c' C' h
  10.     MX_TIM2_Init();
    4 T- G$ m( u0 d4 W) X1 P% F( I) }
  11.     MX_NVIC_Init();% n: l7 |1 f  g8 _* G& [& J* }
  12.     HAL_TIM_Base_Start_IT(&htim2);
    ) |# @1 x/ G6 C9 T# k" {
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);
      o/ f) h8 M7 _4 L; D9 v
  14.     while(1)
    8 w$ o4 ^3 {4 Z1 C% |, l& T3 s% J
  15.     {! O2 m- H, u- U4 j- e
  16. 8 p/ ~/ q6 j& v) ~* s" v! z

  17. 2 M& c; a6 R2 s
  18.     }4 h- s" Q- Y4 K$ _
  19. }/ R1 x" j5 g  r4 B9 \5 N
复制代码
: b; ?1 \  I9 Y6 h& C- W( D! p
1 j5 T9 f: ~! }9 I9 b
  1. void MX_DMA_Init(void)
    % o! ]6 W9 y( I% D/ h9 g& K
  2. {
    * w2 H- b- ]) l3 n$ x  {
  3. . r2 B3 a$ t; r+ f# E$ C. a
  4.   /* DMA controller clock enable */5 P5 h% v3 }6 J3 g8 E/ d
  5.   __HAL_RCC_DMA1_CLK_ENABLE();
    # `% G: e6 p7 t) j6 \
  6. 7 k8 w4 N9 Z: Z2 v# k% R( O6 a' Y4 E
  7.   /* DMA interrupt init */
    ( k5 G) z7 @1 T+ N
  8.   /* DMA1_Channel1_IRQn interrupt configuration */: x) V( U/ B) w) n( w6 I
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
    . ]' @' }' n" M! [
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);8 @0 Z$ y9 Q/ {0 u6 o
  11. 4 {2 {  o# W) P9 |
  12. }8 i6 H: d- j5 Z- M' e9 e) F: O, B9 a
复制代码
0 d+ D& n3 \) j6 M* W3 I
* ?; Y5 X% n4 y% F
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC
    , h  E. [2 i# ^

  2. ( C& `1 j, I' }+ ~8 `5 a
  3. ADC_HandleTypeDef hadc1;- b* }; V4 b) s4 L7 u. A5 R" y
  4. DMA_HandleTypeDef hdma_adc1;
    0 `  M% ?' F' X$ _3 _3 i) P2 w

  5.   W% h1 L6 X% ?' `5 b
  6. void MX_ADC1_Init(void)
    ; ~. |4 y8 G$ M& [2 i& m
  7. {2 w: z# E" @; J! S* Y
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
    1 r" o( ?# Z1 U" S  R' Y/ @% i
  9.   ADC_ChannelConfTypeDef sConfig = {0};
    $ A3 q1 l2 d* K8 A
  10. ) n/ B& S% a& a" c8 Y
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 6 V& c& s+ E5 \: F' t' W" U  z
  12.   */" q( X+ U5 C3 y, |1 {
  13.   hadc1.Instance = ADC1;0 a( S( g0 D4 H; w
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    - F6 ]  v  U( e
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;/ S+ E) P" l7 D& t2 D* i2 P
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;$ Q8 E; H5 \+ {+ N# D/ T" o! g
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;
      Q4 e7 @6 c6 g8 }1 R
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
    & g, C; @* I; Y
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;8 O. P* r' r8 y. |; G
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;
    4 S5 m( S- S( S, s
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    ; U8 v& f# V3 K3 W0 _# V
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    * V  k! i) E' K* {5 G6 c
  23.   hadc1.Init.NbrOfConversion = 2;
    ) l2 h( Z8 R8 F5 j; F/ B
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;3 O/ X1 S" h% z; G- `( W2 u
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;
    . w( T0 R8 A2 P/ y. ~; |9 U
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    6 r9 R  J* H  e" u7 ]: F
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;( I+ E; C# r! y" c8 L5 Q  y6 |$ N
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;
    # C* q; s/ A" `! m# H' e# {
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;) `+ \& |6 I* u4 g. c; c* }$ I
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;! W9 n9 M* {- [+ e
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;  S/ _, p! N" r- P9 r; h5 z$ R
  32.   hadc1.Init.OversamplingMode = DISABLE;
    + F4 Q' p% n3 P, i: T
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;# J+ m. _8 }6 `; z
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)& h* _! X. `. X
  35.   {
    " s' u8 c1 H/ ?5 N5 x
  36.     Error_Handler();
    3 e7 o. n  w$ k7 ~: g! n
  37.   }2 \! [, s; U8 \& J
  38.   /** Configure Analog WatchDog 2 8 a0 U( {3 |; Z0 G# n
  39.   */
    8 I2 q1 f! l# c' t4 c2 w
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    / ?- g: V3 o' w. i
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)2 y& U% f- [" r1 h
  42.   {
    ! N  @; l0 ~5 F% X3 i# D
  43.     Error_Handler();5 Z- w+ Q6 m9 _$ g  ^
  44.   }
    9 k1 t$ s# r% ~: W0 q  l: L% b
  45.   /** Configure Regular Channel
    8 O* g  G- V$ E+ [) ]2 `) u) i
  46.   */$ P4 o' L) m3 {' B8 x$ X! Q
  47.   sConfig.Channel = ADC_CHANNEL_8;
    5 t( t% O1 Q! ~6 u4 ]
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;" p" }0 q, \8 ^6 f
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    ( |2 I8 U8 Q; X+ k0 Q9 u6 a
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    2 T: A8 z  f5 ?
  51.   {6 `! P, H* I+ W( @8 s
  52.     Error_Handler();# I. m, }$ C0 \) @
  53.   }9 ^8 g" ?/ P0 c! a" u; T$ o
  54.   /** Configure Regular Channel
    3 \: R5 w; E1 D' K" Z, s/ E4 O
  55.   */
    ; h. H7 \3 S& s7 X9 J
  56.   sConfig.Channel = ADC_CHANNEL_15;0 p+ _7 z+ z; W% E
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;
    ; B/ e7 b* H# u: I# Q
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    6 s% M5 y* N( R' @! ?6 O* z" t/ [$ O
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
      Y- K6 K- A6 [% b
  60.   {. [" @8 K% [0 C9 J5 t
  61.     Error_Handler();
    9 {( ?/ {) p4 K8 a. r9 M+ b6 F- H  T# m
  62.   }
    : k; c, `# M1 w2 }9 I2 d

  63. . L4 Y, Z+ ?0 S0 t
  64. }% E9 `1 i# j# m# r* r9 |
  65. : r2 [, o7 G: S7 b* e* k+ I
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle); @& u" X+ J, Y( d+ {3 z
  67. {
    % n0 L1 v- p7 O' I! G; `9 H
  68. # y$ r  l9 l6 Y( i: F
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};4 j; i5 w5 u6 W8 H4 c6 S7 e, k
  70.   if(adcHandle->Instance==ADC1)
    - ~. Y' b" X$ I. |. d4 m" ?
  71.   {9 ^5 ~! J1 H* L+ H
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */: C1 b9 ^" Q$ ?" N" e& a' A# j! \
  73. 1 ~0 q3 E! n  N7 ]
  74.   /* USER CODE END ADC1_MspInit 0 */
    0 k4 d- Q' v& H7 A* b2 U
  75.     /* ADC1 clock enable */, u; s' [7 P# ]+ J
  76.     __HAL_RCC_ADC_CLK_ENABLE();
    6 {8 b  m2 `2 @" a5 E% W
  77. 4 A3 L1 ^* _3 C1 Q) o0 L6 [* F
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();$ \4 F$ D( ~" Z3 R* W. Q7 s
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();: m+ Z; j- c  S) W
  80.     /**ADC1 GPIO Configuration    + j* V" s, ]) r  o8 M9 h
  81.     PB0     ------> ADC1_IN8
    ( ~. [9 ~- u& G# t% M# A
  82.     PA11 [PA9]     ------> ADC1_IN15 + [4 M7 @. M5 q( ^! y
  83.     */+ L1 E/ K: ?( Q7 h' [( K: }
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;, Q# y' Y, Y# V6 s5 v- E2 {
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;8 n5 p0 l8 v- m0 n1 V4 ]
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;* Z% D& Y& l. t! ]
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ; V4 b& q8 K4 D

  88. ; g; m, h6 J' S9 D" ~. u  h
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;$ O3 `! z! g+ A9 p$ P
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    0 ]  i4 s. N6 k8 l% s  J* n# E4 P
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;; a+ S" U* R0 a/ v3 e
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    " y: F8 v4 ^2 A* m0 ?1 s* e

  93. 9 ~5 f  Z# N% @
  94.     /* ADC1 DMA Init */  B3 v" O0 ^/ g; U" m% p
  95.     /* ADC1 Init */; ^3 d' [# Q6 Q( i% p4 T6 F) U/ r
  96.     hdma_adc1.Instance = DMA1_Channel1;
    * o. B$ ~; m; N
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    8 J) j+ a! d6 P8 H
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    5 p3 j4 Y1 i% I' R. ~( N1 J
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;. n7 ~% i6 q% {
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;: F2 \9 P+ s/ p7 {
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;3 ~  M9 U! v/ ]8 e
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;! L% }4 V" {1 n; @7 V
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;5 J  f5 q- m; V& q# A) n2 M9 E
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;3 @2 Q; }* A* M8 Q. @  I
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    & x& w+ j; c7 R" r$ J5 ?5 p5 e
  106.     {8 |1 H5 u9 f8 @5 Z
  107.       Error_Handler();
    ; L0 ]$ t: L) s6 C( y
  108.     }! R7 C; g. ^5 y" n! F

  109. 1 D; z' M; g+ o, L. {- z! c1 q( M
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    9 d' [* N" k$ F" o' Y# L
  111. $ w8 @7 k1 j3 d$ q  X& w1 W* N( H
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */
    6 P4 @& I6 z4 d$ J  [
  113.   ]8 q5 Y$ [" ^0 L# h  J
  114.   /* USER CODE END ADC1_MspInit 1 */+ K/ P0 j7 {4 b' Y0 k
  115.   }; y5 |3 \$ G" n# l
  116. }
复制代码

* K0 O: n2 k; P6 D( Z9 q# T分压公式:U1/U2=R1/R2/ B( B$ p0 I1 u9 m, A, G
* l5 G* l# g9 O6 e) f3 B( Q
  1. #define R0  220//分压电阻阻值; p' ~5 I$ H8 }6 v& o: M7 p3 ?
  2. #define R1  100//分压电阻阻值: t) L0 l5 U/ A' o- Z
  3. #define ref_vol 2800//参考电压
    5 }% l1 ^7 h- ?
  4. 9 X; i* d1 u# d8 T2 I

  5.   H1 b; r6 e* R( ~
  6. static uint16_t get_volt(uint16_t advalue)3 C, i* C8 B. ]/ k( l3 H3 z$ r
  7. {$ k8 w, D0 v- I# X6 G$ r
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;
    # B& J7 V; Y. K8 E, S
  9. }
复制代码

$ J3 _' _6 Y6 a/ K8 a0 c
9 ~/ ?# ?; k7 P' J
' c1 `. n' U( [5 _1 ]% X6 q- {
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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