当前位置:首页 > > strongerHuang
[导读]对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了。本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理、与常规看门狗的异同点,以及工程应用价值。


关注、星标公众,不错过精彩内容

作者:逸珺
转自:STM32


对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了。本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理、与常规看门狗的异同点以及工程应用价值。


啥是看门狗?


一般来讲,单片机的看门狗可简单看成相对独立的两部分,即计时单元和监控单元。计时单元实现计数与重装。在计数过程中,软件可以适时对计数器的初始值进行重装,以防溢出。监控单元监视计时器的溢出事件,若计数器因未被软件适时重装而发生溢出,看门狗通常会执行复位动作,比如复位处理器。 

以STM32F4系列单片机独立看门狗IWDG( Independent watchdog)为例,看看其计时电路的功能架构:


我们再结合STM32的复位逻辑模块,来大致看看IWDG的复位控制过程。



当IWDG看门狗模块监测到计数溢出时,IWDG reset信号输出低,经过与逻辑电路触发脉冲发生器,产生一个正向窄脉冲以控制MOSFET在该脉冲宽度期间导通,并经由滤波电路产生系统复位事件信号,进而触发STM32复位。

上面大致介绍了常见的独立看门狗的功能及工作流程。那么STM32芯片的模拟看门狗是又怎么回事呢?跟上面提到的独立看门狗有关系吗?它是怎么工作的?


请继续阅读.....

模拟看门狗

模拟看门狗跟上面提到的监控微处理器是否正常运行的独立看门狗没有关系,它是基于ADC外设应用的一个功能模块。它以类似于独立看门狗的方式进行工作, 只不过它监视的是模拟通道输入信号幅度,当监测到输入异常时会触发模拟看门狗事件。软件上基于模拟狗事件再进行相应的处理。
当我们在对模拟看门狗做初始化配置时,需事先设定看门狗要监视的模拟输入通道的输入阈值,即上下门限值【被监测模拟信号幅度对应的ADC值】。当模拟看门狗监测到输入信号电压超过阈值时,它将产生看门狗事件,并可以触发中断以运行相应处理代码。


如果说没有这个模拟看门狗,而我们又需要对模拟输入信号幅度做实时监测,往往会有两方面的方案。其一,我们通过软件方式,对ADC采样值进行代码轮询。显然,这会大大增加CPU的负荷,而且实时性也难以保证。其二,我们可以考虑额外设计硬件监控电路。比方,将模拟输入外接两个比较器,将模拟信号与外部产生的上下边界比较阈值进行比较(如下图),从而产生中断信号给单片机也能实现类似的实时功能需求。



那么,此时需要更多的外围器件并占用单片机额外的中断请求引脚。

不难看出,对于模拟输入信号幅度的监测,借助于STM32片内模拟看门狗可轻松实现硬件监测,既无须外扩硬件电路也无须软件轮询信号的合法性或安全性。同时,又大大减轻了CPU的负荷,并保证了对输入异常的实时响应。

模拟看门狗在哪里?

既然模拟看门狗是ADC模块的一部分功能单元,我们不妨以看看STM32F4系列的ADC框图。对于如何使用一个外设模块,首先浏览其功能框图无疑是个不错举措。我们可以从ADC模块的功能框图中找到模拟看门狗功能单元之所在。

有啥工程应用价值?


到此,我们知道模看门狗可监控模拟信号是否超界,据此我们可以想到这样一些应用场合:
  • 供电电源超界检测。在产品开发中,常常需要实现较为智能的电源诊断。在一个产品的关键功能链中,电源是否异常往往需要格外关注。通常需要相应的诊断检测电路,以检测设备电源电压是否超出限定值,如超出限定值需做出诊断报警。这在工业产品、汽车电子、医疗器械中都有明确强制要求。

  • 实现控制环路fail-safe模式。比如一个控制系统根据采集到的传感器信号来控制阀门的开度,以实现流量控制。或者一个速度控制系统,如果传感器信号异常,需要马上将设备置于功能安全状态,以避免造成经济损失或者带来人身伤害。还比如一个电机转速控制系统,如果电流传感器值超限,需要马上让电机停机等。


其实,需要做模拟监测的场合还很多,这里不多做列举。


代码怎么写呢?


下面给出大致参考例程,主要演示实现的基本思路和框架,细节根据项目相应需求完善。 顺便提醒,尽量基于 STM32CubeMx 来着手我们的 STM32 软件开发。

static void ADC_Config(void){ ADC_ChannelConfTypeDef sConfig; ADC_AnalogWDGConfTypeDef AnalogWDGConfig;   /* 初始化 */  AdcHandle.Instance = ADCx;   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_ASYNC_DIV1;          /* 异步时钟模式,时钟不分频 */  AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12位 */  AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 右对齐模式 */  AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer  disabled (ADC conversion on only 1 channel: channel set on rank 1) */  AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC标志指示转换结束 */  AdcHandle.Init.LowPowerAutoWait = DISABLE; /* 自动延迟转换功能禁用 */  AdcHandle.Init.ContinuousConvMode = DISABLE; /* 禁用连续模式,单次模式 */  AdcHandle.Init.NbrOfConversion = 1;  AdcHandle.Init.DiscontinuousConvMode = DISABLE;  AdcHandle.Init.NbrOfDiscConversion = 1;  AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO; /* Timer 3 触发 */  AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* 软件触发 */  AdcHandle.Init.DMAContinuousRequests = ENABLE; /* DMA 循环模式使能 */  AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* 如溢出DR寄存器将被最后的转换结果覆盖 */  AdcHandle.Init.OversamplingMode = DISABLE; /* 禁用过采样 */  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)  {  /* 初始化错误处理 */  Error_Handler();   }  /* 如ADC转换超出所设模拟看门狗窗口,则考虑到IT在每次ADC转换后发生,*/ /* 请选择足够长的采样时间和ADC时钟,以免在IRQHandler中产生开销。*/  sConfig.Channel = ADC_CHANNEL_5; /* 通道选择 */  sConfig.Rank = ADC_REGULAR_RANK_1; /* Rank 选择 */  sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5; /* 采样时间 */  sConfig.SingleDiff = ADC_SINGLE_ENDED; /* 单端输入模式 */  sConfig.OffsetNumber = ADC_OFFSET_NONE; /* 无偏移 */  sConfig.Offset = 0; /* 偏移禁用,该值无用 */  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)  {  /* 通道配置错误处理 */  Error_Handler();  }   /* 设置模拟看门狗阈值 */    /* Analog watchdog 1 模拟看门狗配置 */  AnalogWDGConfig.WatchdogNumber = ADC_ANALOGWATCHDOG_1;  AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_ALL_REG;  AnalogWDGConfig.Channel = ADCx_CHANNELa;  AnalogWDGConfig.ITMode = ENABLE;  AnalogWDGConfig.HighThreshold = (RANGE_12BITS * 5/8);  AnalogWDGConfig.LowThreshold = (RANGE_12BITS * 1/8);  if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &AnalogWDGConfig) != HAL_OK)  {  /* 配置错误处理 */  Error_Handler();  } void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc) {  /* 看门狗错误处理,这里可以实现fail-safe需求*/ /* 1.比如关闭关键电路 */ /* 2.设置报警标志 */ /* 3.代码尽可能运行短 */ ..... ubAnalogWatchdogStatus = SET; #define ADCCONVERTEDVALUES_BUFFER_SIZE 256 /* 数组aADCxConvertedValues[]大小 */ /* ADC转换结果 */ static __IO uint16_t aADCxConvertedValues[ADCCONVERTEDVALUES_BUFFER_SIZE]; static void start_adc(void){ /* 启动ADC以DMA模式运行 */  if (HAL_ADC_Start_DMA(&AdcHandle,  (uint32_t *)aADCxConvertedValues,  ADCCONVERTEDVALUES_BUFFER_SIZE  ) != HAL_OK)  {  /* 启动错误处理 */  Error_Handler();  } 


总结

这里针对STM32芯片模拟看门狗的概念及原理做了较为清晰的介绍,它也算是STM32一个具有特色的功能模块。对于产品开发中需要进行模拟输入幅值监控的场合,使用它会非常便利。

推荐阅读:
什么是Cortex-M内核的MPU
线程、进程、多线程、多进程 和 多任务  
ELF相比Hex、Bin文件格式有哪些与众不同?

关注 微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。


长按前往图中包含的公众号关注


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭