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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
硬件原理图4 ?. k# U. ~2 o, j

% F# A# x8 a# u1 K4 e2 N
20201216095853276.png

0 u; P: J$ o/ q/ m) I, H' h
' I( a+ V+ }7 B3 P程序:
; e8 }4 B5 C0 k/ p0 a4 e7 L2 \. O) f$ |& d( s
  1. int main(void)7 ]8 o7 v) Y* e7 ^; u3 _/ a
  2. {
    ( `) m, j* h+ v
  3.     //Flash_EnableReadProtection();//RDP设置 使能读保护
    ( n$ Y! I9 T. k' x* B5 G+ ?9 [
  4.     HAL_Init();
    4 V; Y% L( |. {4 C% n2 d, Z
  5.     SystemClock_Config();
    * |: `# T  t8 P4 G
  6.     MX_GPIO_Init();
    ) d6 P1 R0 z" Q' b3 {
  7.     MX_DMA_Init();
    # e, C) N" {3 a2 V& j  |. ^
  8.     MX_I2C1_Init();
    : _% Y' d, z: A
  9.     MX_ADC1_Init();
    / P+ w, N+ |' {7 X- w/ N# d
  10.     MX_TIM2_Init();5 H5 l% t5 M! Q; K, v6 Z
  11.     MX_NVIC_Init();; F/ d: A2 H1 G. c2 k, _' P2 q( O
  12.     HAL_TIM_Base_Start_IT(&htim2);4 V" _1 r' m# I0 o/ ?* u- V5 J
  13.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);: A! @3 M: D* [2 O3 Z& y. q
  14.     while(1)
    , J" T9 b- [" f7 u, M( G0 J7 ]
  15.     {# s0 G; ?1 T/ R! \/ H  K

  16. 1 z3 c3 l% H3 G- }

  17. " q1 b" ^/ y3 P. B5 L) \. U
  18.     }* ?) }4 g" k" C2 u: |
  19. }
    7 m' u3 N' R# _7 y  F( w
复制代码
$ p' C2 C! _: \( o
6 H+ }9 n  w& `8 ^& o; ?
  1. void MX_DMA_Init(void)
    8 t$ H- a9 R3 {% v) ?% _
  2. {3 i6 q7 n6 x: U+ X
  3. - z* z1 t1 R  O: i) O
  4.   /* DMA controller clock enable */
    4 F1 ?8 p6 E: {2 [7 G0 A2 {
  5.   __HAL_RCC_DMA1_CLK_ENABLE();8 B9 J' i* J( H) @
  6. , V2 ~9 B  b- B. A% E
  7.   /* DMA interrupt init */7 k- w) L! V3 K' Z2 _
  8.   /* DMA1_Channel1_IRQn interrupt configuration */
    2 q" E  P+ y5 a/ Z+ @) P
  9.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
    0 U" `0 M! o% V. x0 S2 Y3 Z
  10.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);: w, Z5 h5 F. g2 w7 P! d1 F
  11. : W6 S) J9 S$ Y3 C8 S
  12. }. Z. i  Y) x' C* f0 c5 l
复制代码

' N4 f$ a7 Z: l5 U- x
) W' O$ X6 E: ?& d$ U% D
  1. uint16_t adcbuf[2];//0,电池电压, 1,温度ADC
    + g& Z& e7 h2 t6 @  J
  2. ( w( K5 \: b' W7 i2 ?& c1 O8 Y5 L
  3. ADC_HandleTypeDef hadc1;
      I8 a# v; E4 C$ T) Z
  4. DMA_HandleTypeDef hdma_adc1;1 i/ D2 a& t3 u& M8 n  c9 Z

  5. , _, X5 F% D; P8 w! ^' I/ |
  6. void MX_ADC1_Init(void)
    & v% p0 O5 z/ d8 s- z( N
  7. {
    0 J8 x, [  r. P; P8 @
  8.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};) b+ X/ o3 g; |: g  |  {/ R. n
  9.   ADC_ChannelConfTypeDef sConfig = {0};0 z7 w8 d2 W% r$ f- t* O% b0 q* c
  10. 7 z9 A9 S$ g7 c$ u0 y
  11.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    2 p$ }7 u3 Y6 ?8 B
  12.   */
    * {+ }2 Y( g4 I& t) S% W- U
  13.   hadc1.Instance = ADC1;. j5 w2 K" G, D6 u) j+ J
  14.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;) O# l/ ~% W3 M. I1 L. V$ }
  15.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;0 ]6 j" h/ m+ M2 [
  16.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    5 p3 J( b9 H9 a% S
  17.   //hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;$ i& e3 C0 e% [; I$ B8 B
  18.   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
    & R6 a. X% e; {) B
  19.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    4 Y9 _/ I4 ^  I
  20.   hadc1.Init.LowPowerAutoWait = DISABLE;0 F- k  g( g. K2 V" L7 Z! `* k7 Q
  21.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    + I; F& f* ?! }. J
  22.   hadc1.Init.ContinuousConvMode = ENABLE;
    ' _# D" M/ k( x( L: [  S* u; }
  23.   hadc1.Init.NbrOfConversion = 2;% [. K9 r9 F0 R, K: b" j/ t- l
  24.   //hadc1.Init.DiscontinuousConvMode = DISABLE;//STM32CubeMX生成,只能使用通道 0-14,不能使用通道 15,16,17,18;- g- O; k" ?; b
  25.   hadc1.Init.DiscontinuousConvMode = ENABLE;! z" b& {; {2 u" k: X
  26.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;  R% f5 N, D4 K  u
  27.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
      y( q8 X& I5 k( C4 r
  28.   hadc1.Init.DMAContinuousRequests = ENABLE;7 d: n: Z* U+ R7 \
  29.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    , e) L! _# p+ p0 ]9 y# y: N
  30.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;3 a* W" m  G2 F2 [$ N+ o
  31.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
    * m" C4 L! {& {
  32.   hadc1.Init.OversamplingMode = DISABLE;
    + R( }; |; q0 x! R+ i+ F; q- f% c
  33.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    * f3 s* f' t. N! D
  34.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    4 H) f( Y+ Y2 ^1 _8 Y& e8 o
  35.   {$ U" T- ~# Z4 I
  36.     Error_Handler();
    9 K4 E# F# ^9 w2 h( q( A) Q! m
  37.   }" l+ Y# w, q7 G9 }, ?4 k
  38.   /** Configure Analog WatchDog 2 ' m# B5 h; ~! }8 O
  39.   */
    2 Q3 }+ F. E. [  T
  40.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    9 I2 ]( d2 }' R# I
  41.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)) P/ ]- ?9 n% n7 }+ s$ o! W% @1 I
  42.   {! O% |+ J. ?& ^4 [
  43.     Error_Handler();/ k7 T; I2 W0 z
  44.   }7 e- P( o. f. F( n# m9 O3 ~) A
  45.   /** Configure Regular Channel 9 N2 }) y, h  Q3 s4 `8 }/ @+ l
  46.   */& T. }/ q, d3 P* ^7 z' h
  47.   sConfig.Channel = ADC_CHANNEL_8;( z, \5 i- w- t9 P" z; j- e
  48.   sConfig.Rank = ADC_REGULAR_RANK_1;
    4 o, A/ Q* e4 X1 H1 P0 }0 X9 E
  49.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;; ^& O% y0 V. r) P5 ^4 X) g+ F) |' Q
  50.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)/ v. Z/ @0 ~: H+ s1 i( Y- H( u
  51.   {
    * Q+ s$ S( Q& \( X7 Z9 `
  52.     Error_Handler();
    $ R2 N2 R% Z4 V5 g  J, f7 P
  53.   }
    1 d8 f+ P. g( z1 `/ {, `
  54.   /** Configure Regular Channel
    5 {/ a$ u) H9 z5 H8 N$ |1 T
  55.   */. K6 F! x6 j( J  }. X- V. |
  56.   sConfig.Channel = ADC_CHANNEL_15;
    2 o( f0 X' i0 j8 a, Y6 d$ {7 S2 Y
  57.   sConfig.Rank = ADC_REGULAR_RANK_2;
    , k  M$ [0 J$ f5 p: L7 B3 O+ M
  58.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;4 [$ v: \8 ~; C$ i' p
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK); v; }' H! z! {
  60.   {
      A4 a1 H/ Z: Z/ Y+ c7 W4 T# X
  61.     Error_Handler();+ H! O$ U4 D6 T: p2 f* A  l
  62.   }
    9 ~1 ]+ D) @1 W& V- Q0 S) F

  63. ! t  K2 g+ O" T$ \) {
  64. }
    : o2 y9 A6 D, p

  65. , |' ~4 q' j4 Q$ h& @0 C2 N
  66. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)9 {' s) l/ w7 G. H  ]. ^9 N8 g" f
  67. {: h7 p, t9 q; R& u% `7 ^5 v

  68. 6 \7 _+ T0 f9 N' P+ I& H3 b
  69.   GPIO_InitTypeDef GPIO_InitStruct = {0};( ]' T% e) b- R9 Q; L) q9 s
  70.   if(adcHandle->Instance==ADC1)
    , m. x' Z( r1 F
  71.   {. c5 F: ?6 z$ W
  72.   /* USER CODE BEGIN ADC1_MspInit 0 */
    9 U& Z: I+ G. d. q! C
  73. ! z* r# v: a2 D  p& W/ q- n
  74.   /* USER CODE END ADC1_MspInit 0 */
    1 ]5 _% q4 l( ]
  75.     /* ADC1 clock enable */+ q" g4 c% D- s3 C
  76.     __HAL_RCC_ADC_CLK_ENABLE();
    # Z9 _, e4 M% }" o/ i4 w  D

  77. - ]/ W; G; [: a- _( s
  78.     __HAL_RCC_GPIOB_CLK_ENABLE();8 _, D. L5 ^5 l$ }. a* \
  79.     __HAL_RCC_GPIOA_CLK_ENABLE();. E) a* Z, Q' C3 |3 [
  80.     /**ADC1 GPIO Configuration   
    3 k" l% l+ d0 K! v8 E
  81.     PB0     ------> ADC1_IN8
    3 H4 i, X; V7 M: z. q$ X
  82.     PA11 [PA9]     ------> ADC1_IN15
    3 p: n1 i- ^; \1 J/ H
  83.     */; Z% |: l+ k7 Z$ [: l/ r0 H
  84.     GPIO_InitStruct.Pin = GPIO_PIN_0;: ?7 M1 P: B  ]7 b* j& N4 S- B8 C
  85.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    ) H9 |6 T" N  v/ p/ C& n; V, j
  86.     GPIO_InitStruct.Pull = GPIO_NOPULL;# o. \8 x4 ]9 o7 g7 l( j* E, ]
  87.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);+ f/ g: W0 b/ Y' I6 a9 Z8 K
  88. . \# Z8 U+ Q8 D2 E5 ^2 _; |; w- ]
  89.     GPIO_InitStruct.Pin = GPIO_PIN_11;, ?+ Q" v4 v6 L
  90.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;% C% k7 L, {, m& Q. }+ D
  91.     GPIO_InitStruct.Pull = GPIO_NOPULL;* K, B' w. d/ S0 [
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    9 @7 O& [7 M( L3 z$ j1 R

  93. 5 x  ~+ p3 N$ e. a
  94.     /* ADC1 DMA Init */
    8 c* ~0 Z2 |" D4 _
  95.     /* ADC1 Init */
    7 c- m2 X' N5 B
  96.     hdma_adc1.Instance = DMA1_Channel1;; h8 ?2 V) U  x$ {7 _
  97.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    7 b' I( @# c, J1 {2 D- c# J
  98.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;1 T3 r/ l0 {; R  u
  99.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;9 M! B% f2 E7 }. S) K  a
  100.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    $ y' @* D8 w# L
  101.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;/ P) N7 O& `" G3 R
  102.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;  J4 O( G4 g0 K- g% Z$ P/ z
  103.     hdma_adc1.Init.Mode = DMA_CIRCULAR;/ e( T/ N2 I, j! R; r: o7 k9 S8 W
  104.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;3 _" [% s4 j0 e6 T% _; ^2 i1 T2 I
  105.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)5 e; k+ }' }% z; ~8 K
  106.     {
    8 h+ f7 {* T" V! v7 U9 x
  107.       Error_Handler();" D) E' `6 y: v; M6 M. ^
  108.     }
    9 `; i+ K8 z1 j+ }" V) H
  109. . H) }$ r" `8 h6 Z0 v) f
  110.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);0 G" e* T2 R+ l: f  W; K1 ?
  111. 1 A+ |  h) l& E4 U8 r
  112.   /* USER CODE BEGIN ADC1_MspInit 1 */) d8 u" ]) y9 l7 ~" L- F, f

  113. 3 v0 E) h2 u% R3 h2 l+ D
  114.   /* USER CODE END ADC1_MspInit 1 */  I6 B+ W! g5 P7 s. [3 D. K3 W5 ]
  115.   }
    & ?& A7 W9 ]+ _0 Z2 x5 M6 v
  116. }
复制代码
9 t+ p" ]' |& Q& i# c3 }  |& Z
分压公式:U1/U2=R1/R2
5 F  d2 y2 u5 l. \" h( u8 A, J; b' o* i( z0 [
  1. #define R0  220//分压电阻阻值
    ; ~/ a$ Z" F- G3 o9 w4 G  O1 q
  2. #define R1  100//分压电阻阻值
    ' G6 L' T& T& ~% Q
  3. #define ref_vol 2800//参考电压
    % R8 K+ D! d. r6 [; _7 I5 }
  4. % c% l) D/ l. ]& {$ ^

  5.   J5 ]3 _& o8 N: j
  6. static uint16_t get_volt(uint16_t advalue)
    ) p9 H" f8 S1 u! X
  7. {
    * Z: y; S1 y3 l
  8.     return advalue * ref_vol / 0xfff * (R0 + R1) / R0;
    8 Q) A, i: F' I* |% G/ n
  9. }
复制代码
; \  ]1 o" d3 l5 d
  }7 X5 L4 N: j$ o" O& W

; ]' C  n6 n7 v! Q" x" s7 X
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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