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

【经验分享】STM32 ADC 模拟看门狗及其应用

[复制链接]
STMCU小助手 发布时间:2022-2-23 19:05
前言
& H' b/ q7 y6 |- F9 ?* d模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高低阈值,用户可以预先设定个模拟看门狗的上下限电压值,一旦采集到的电压超出该上下限,将会触发模拟看门狗中断。模拟看门狗一般用于检测单个的常规或注入转换通道,或同时检测所有的常规和注入通道。1 w6 n5 t3 b# k  D; p' G4 M! N) v
模块框图
, D" j+ d8 r5 X( R; q, D2 v0 ], t1 z+ d8 Q0 R- I  w
PQL7CUA})XMG1WU}O`IIZSX.png
  ^9 ]& |9 `7 q) a) t6 r模拟看门狗可以预先设置 ADC 转换的高低阈值,ADC_HTR 寄存器来配置 ADC 转换的上限阈值,ADC_LTR 寄存器用来配置ADC 转换的下限阈值。  o+ S6 h5 h$ \

6 F0 p( J1 f2 K$ j0 [. ^应用示例2 Y' m6 Q& i! k
ADC 配置代码
+ a% z& X5 [# z+ `; V
  1. /**
    ! b, T1 \7 K8 D6 V( H# V0 i

  2. " D6 Z5 M* s0 m6 q" j8 E. a
  3. * @brief ADC configuration) Q# ], l7 z3 a8 G, M
  4. * @param None+ }6 c0 r$ s7 V3 o( q. ~0 D6 ?4 g: `
  5. * @retval None+ v. H# N+ \* |; S6 c7 H/ ^
  6.   */5 n  q8 D: X9 R9 a8 e
  7.   static void ADC_Config(void)
    4 u: n; J& E0 n2 Q, F0 B
  8.   {
    9 m- ]: p. v: u  w
  9.   ADC_ChannelConfTypeDef sConfig;
    $ M4 Q- Z+ F/ ~- R$ U
  10.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig;4 |) u0 D& }$ N& H
  11.   U% X! O4 D1 [+ Q
  12. /* Configuration of ADCx init structure: ADC parameters and regular group */' f8 f( O, \0 q8 {! h, G! v
  13. AdcHandle.Instance = ADCx;, K% O" K% B7 G* \+ i  b/ P7 s
  14. AdcHandle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; /* Asynchronous3 K: V5 z; w5 w
  15. clock mode, input ADC clock not divided */
    ( R# k8 a6 f& I- @
  16. AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit0 d  Q8 w5 _- S: V$ K: x. k
  17. resolution for converted data */- d; o4 [6 L# R* U# T8 ?. w+ S% o7 g
  18. AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Rightalignment for converted data */# E* c& e  U% H! a9 M, u
  19. AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer
    ( c6 {1 W$ P% n) ~
  20. disabled (ADC conversion on only 1 channel: channel set on rank 1) */; O0 Z/ y1 P+ E6 q  m+ C/ n8 h& z4 f  Y
  21. AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag
    ; N. a* B2 j) v% D
  22. picked-up to indicate conversion end */
    , N9 _- X" g  L& Q3 F  Y7 E) o
  23. AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed3 H7 @/ R3 B4 P
  24. conversion feature disabled */; ]) Y6 g9 D) k* ?# k* `4 m
  25. AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous# C, ]7 v: M: Y+ ^* c  q  M) n
  26. mode disabled to have only 1 conversion at each conversion trig */
    9 ]0 U9 Z5 b( B
  27. AdcHandle.Init.NbrOfConversion = 1; /* Parameter
    1 [, I3 |' W% b% a2 X: {, s
  28. discarded because sequencer is disabled */
    5 O# O/ @8 u( Y7 i& l1 K  o: `
  29. AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter7 H: i* D3 h: L  s
  30. discarded because sequencer is disabled */
    9 H0 f  N9 s) D9 ^' S2 z
  31. AdcHandle.Init.NbrOfDiscConversion = 1; /* Parameter' a( I; }: P! d  e/ q
  32. discarded because sequencer is disabled */. o; Y5 M8 p+ b* C- Q: B1 \, x5 ?
  33. AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO; /* Timer 3
    ; J7 ~( g9 {  _$ B( P8 F% }
  34. external event triggering the conversion */
    3 Q3 c0 ^+ i: E4 D: h
  35. AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* Parameter6 z# Z( I6 {$ ?( l' ]+ Q( s
  36. discarded because software trigger chosen */
    ' d8 o! ~% I2 b# B, Q! y* O! K2 k2 X  j
  37. AdcHandle.Init.DMAContinuousRequests = ENABLE; /* DMA circular
    " W5 B* q. R, x+ n$ d( ]
  38. mode selected */
    ' B3 s5 c6 I$ A! X1 O
  39. AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is/ F6 E) g6 N3 Z' m' h: V
  40. overwritten with the last conversion result in case of overrun */
    - B9 E, |3 U* p7 v
  41. AdcHandle.Init.OversamplingMode = DISABLE; /* No( C6 u7 G; C: K1 t: p+ ~. R% M; g2 T
  42. oversampling */8 y' _/ y- i$ }: i6 f
  43. if (HAL_ADC_Init(&AdcHandle) != HAL_OK)2 a5 x* I/ n& y! E: q% d4 Q
  44. {1 L& G6 _8 P2 U
  45. /* ADC initialization error */+ F& p4 v1 V) q' G
  46. Error_Handler();, Y% e; ]  m  Z. a8 V, ?
  47. }- w/ X1 n* {2 D' ~
  48. /* Configuration of channel on ADCx regular group on sequencer rank 1 */; @! q! g( |& y$ m+ L
  49. /* Note: Considering IT occurring after each ADC conversion if ADC */
    7 N2 e3 B$ s0 G0 }) U
  50. /* conversion is out of the analog watchdog window selected (ADC IT */# S3 I; ~! F  i+ h; _' D
  51. /* enabled), select sampling time and ADC clock with sufficient */
    1 [% k% y! s) _4 Y9 {8 r
  52. /* duration to not create an overhead situation in IRQHandler. */  j0 P0 O& f5 a) E" `! j
  53. sConfig.Channel = ADC_CHANNEL_5; /* Sampled channel number */9 H# d: t, d. I/ s* o& W
  54. sConfig.Rank = ADC_REGULAR_RANK_1; /* Rank of sampled channel number
    1 u  A3 J+ K0 H! J/ i" {0 [7 B
  55. ADCx_CHANNEL */
    ) A2 c9 r  G  Q; T
  56. sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5; /* Sampling time (number of clock: O2 @6 }$ C% {0 a- r2 ~
  57. cycles unit) */$ X7 A6 G( j2 w; }% @7 f
  58. sConfig.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */
    2 M  q3 M, {3 H! D! u8 `
  59. sConfig.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */" o7 u" a; F* Z3 x
  60. sConfig.Offset = 0; /* Parameter discarded because* [; v3 _( n( \6 S2 ~' Y# c0 f
  61. offset correction is disabled */
    " v- }1 j, k7 L- R* u: ]# D6 ]
  62. % W$ v/ E/ E. ]; s6 a6 c0 s2 ~
  63. if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
    - V0 ?4 f8 }% A! Q1 A
  64. {
    6 C* n( h, I, G* B- M6 N4 {
  65. /* Channel Configuration Error */
    + c) ?# t* N8 J
  66. Error_Handler();
    ( C3 X; d" I' Z, Q, _5 u
  67. }$ G2 k$ T4 Q0 l& Q; K9 U' N

  68. ' \/ p, N+ Z6 c
  69. /* Set analog watchdog thresholds in order to be between steps of DAC */6 E8 L/ K! @/ j; d8 C8 ~" Q( p8 ]
  70. /* voltage. */6 N2 V, A' |8 s  [
  71. /* - High threshold: between DAC steps 1/2 and 3/4 of full range: */
    9 \1 T) f# Y) w( G& \; Y+ Z2 C
  72. /* 5/8 of full range (4095  Vdda=3.3V): 2559 2.06V */8 q( p& _/ w* G8 n% V) P
  73. /* - Low threshold: between DAC steps 0 and 1/4 of full range: */! r9 x/ O$ _7 M
  74. /* 1/8 of full range (4095  Vdda=3.3V): 512  0.41V */
    * i- }+ }' f4 r% ]$ k) W4 C4 c
  75. /* Analog watchdog 1 configuration */3 [: p: d9 s2 o' x7 I; e# J
  76. AnalogWDGConfig.WatchdogNumber = ADC_ANALOGWATCHDOG_1;
    . u( e2 ?" B0 F- M  n
  77. AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_ALL_REG;
    ; x6 {$ D7 {4 c) W" i5 ^3 U
  78. AnalogWDGConfig.Channel = ADCx_CHANNELa;4 n8 J% d8 i5 j/ w! _% b
  79. AnalogWDGConfig.ITMode = ENABLE;! Q; {9 y  ]0 W* J  |
  80. AnalogWDGConfig.HighThreshold = (RANGE_12BITS * 5/8);
    , i  e* x9 q8 B7 y. ^
  81. AnalogWDGConfig.LowThreshold = (RANGE_12BITS * 1/8);; m% [' N- t1 a: [
  82. if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &AnalogWDGConfig) != HAL_OK)
    % {. p. d7 p- ?, E  W9 k9 ?& H
  83. {9 Y  }* O. C& ~/ |& m
  84. /* Channel Configuration Error */  j5 f4 ^9 w. n# z) r, w
  85. Error_Handler();! W. a! C, D$ t2 J' \
  86. }7 u, w# w4 z. M/ Q( E( o& {- w. Z

  87. 6 }& Z. q/ j3 L4 v: v
  88. }
复制代码
% L/ }# h) h* s7 t4 n) ~
如上图所示,AnalogWDGConfig 结构体中分别使能了模拟看门狗及中断,设置了电压的上下阈值 HighThreshold 和LowThreshold。模拟参考电压为 3.3V,以上代码设置的下限电压阈值为 3.3*1/8=0.41V,上限电压阈值为 3.3*5/8=2.06V。5 B8 |$ B2 S  q

2 p4 k) q0 R  I' T' B模拟看门狗中断服务程序8 X% Y4 J* G1 @( d' u7 K% }$ ]
  1. /**4 z( M! R4 _/ n6 g2 @9 r7 n

  2. + B# F) h+ _$ u1 o5 x+ x& u
  3. * @brief Analog watchdog callback in non blocking mode.
    # w, {0 y5 H3 P
  4. * @param hadc: ADC handle# w( ]: I) X" H. ?) }# w
  5. * @retval None( z, P/ {6 H) a% g
  6.   */
      o; p  s) Y/ L+ ]- z
  7.   void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)9 a' c; N3 O- u3 V  y
  8.   {
    0 }8 f( L% d, m9 e
  9.   /* Set variable to report analog watchdog out of window status to main */( R1 o  D6 |  X
  10.   /* program. */
    ; P% u& `/ _0 q4 A( v9 h; w
  11.   ubAnalogWatchdogStatus = SET;
    + _% d- p: [/ g4 |$ Z4 b
  12.   }
复制代码
1 [! _! G/ e6 n: N
  当模拟看门狗检测到电压高于上限或者低于下限时将会产生看门狗中断,中断服务程序触发后,可以做出一些应对措施。这里置了 ubAnalogWatchdogStatus 标志,然后由主程序去根据标志的值去执行相应处理程序。2 y9 e4 M- d! ?% @9 @1 d, F
  1.   /* Infinite loop */
    ) t4 r0 G( q1 Q% t+ a
  2.   while (1)
    - h+ A% Y) |! |, G8 Q' h
  3.   {
    ) Z2 J6 k4 X2 D! E+ k$ ^, q
  4.   /* Turn-on/off LED1 in function of ADC conversion result */2 N! Y2 G5 z( q; l" @' X
  5.   /* - Turn-off if voltage is into AWD window */
    ( d+ \' I! |! r
  6.   /* - Turn-on if voltage is out of AWD window */2 w) w* B) U6 N7 ?' ~' d! r$ b$ G
  7.   /* Variable of analog watchdog status is set into analog watchdog */# I- y$ i  M; H! Z$ U4 v! f7 Y
  8.   /* interrupt callback */
    ! l9 D7 I+ ~6 F$ f  }
  9.   if (ubAnalogWatchdogStatus == RESET)! x6 q0 `# h5 G; J) S' I
  10.   {
    * y5 q* I9 b9 V% q0 B
  11.   BSP_LED_Off(LED1);
    1 {7 Y. \9 u7 U
  12.   }. k, |. d2 `3 U# _; P$ \1 r
  13.   else
    % }7 F% \+ f' w8 m  y
  14.   {1 j" u$ o9 E4 n9 E" N
  15.   BSP_LED_On(LED1);
    + L. E! Y/ r  f; o
  16. + h; _3 e& A# D: [) ^
  17. /* Reset analog watchdog status for next loop iteration */
    ( g  L( ~" y0 A& S
  18. ubAnalogWatchdogStatus = RESET;
    ' a* H6 D0 D% L; R/ m9 V
  19. }- N" }( F' h( J- d- l  {
  20. }
复制代码

' ?: F7 c' @' }9 L( v, b& y, S+ i; {启动 ADC 转换代码2 w& d% m0 T; V
  1. #define ADCCONVERTEDVALUES_BUFFER_SIZE 256 /* Size of array+ N* K( \  U" j0 u0 c& Z
  2. aADCxConvertedValues[] */: T' H% j. E+ ^6 t: M: _
  3. /* Variable containing ADC conversions results */, s; U, Y4 Z+ U/ z- v8 u
  4. __IO uint16_t aADCxConvertedValues[ADCCONVERTEDVALUES_BUFFER_SIZE];
    ( d% c9 k# u2 P4 Z) }! |1 D
  5. /* Start ADC conversion on regular group with transfer by DMA */
    : m1 R* R: L' a
  6. if (HAL_ADC_Start_DMA(&AdcHandle,
    ) E+ _, {* ~  A) M
  7. (uint32_t *)aADCxConvertedValues,
    , x4 W& K/ r9 d( |5 y9 P
  8. ADCCONVERTEDVALUES_BUFFER_SIZE
    0 F' n. M4 r  \' R! y
  9. ) != HAL_OK)
    7 }& x7 E2 i0 e; f; o8 H5 G( n
  10. {! r; f' U+ p/ f& c9 J3 [4 F& Q0 l
  11. /* Start Error */
    , |% M+ s- A8 Q' l: O
  12. Error_Handler();
      t/ F9 c$ T% V2 X
  13. }
复制代码

. ^3 \% n) U; j0 t2 G7 n7 D4 V使用循环模式 DMA 启动 ADC 转换,DMA 可以降低 CPU 负载。( G  Z# c& b0 Q
- g" S& @' g8 ~) v, g8 w
结论, l( S6 ~; E+ [1 U
控制系统中,需要测量严格电压、压力、温度等范围的信号,使用模拟看门狗能够快速地检测到异常状况,并做出相应的应对措施,以确保设备安全。9 J- {7 k3 @6 `- [2 V

! n/ [+ i5 V( U' z" X" |
赞 收藏 评论0 发布时间:2022-2-23 19:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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