STM32芯片的ADC模块往往都支持模拟看门狗功能,即可以对单个或多个通道开启模拟转换值的监测。当模拟通道ADC值超出设定的阈值时可以产生模拟看门狗事件并可触发看门狗中断。【注:下面截图或数据都是基于STM32L4系列芯片的,其它STM32系列与其类似。】
结合上图,当选定的ADC通道的转换结果比设置的阈值上限还高或比设定的阈值下限还低时都可以通过硬件触发模拟看门狗事件或中断。
假设现有STM32用户有这样一个应用需求,他希望STM32的供电电压低于一定程度时就提示低压报警,然后软件将进行相关处理。
关于这个应用需求,我们就可以利用片内的一个参考电压和模拟看门狗来实现。
我们知道,STM32芯片内部都内置了一个比较稳定的内部参考电压,即VREFINT。它的电压值一般在1.2v上下,每颗芯片之间可能存在差异。该电压信号固定与某ADC通道在片内相连。ST公司在芯片出厂时对所有芯片的这个内部参考电压都做了ADC转换值的准确测量,得到一个校准值。测量是在常温条件下,ADC参考电压vdda=vref+为3.0V的条件下进行,结果存储在特定地址。
下图是STM32L4系列芯片的数据手册中对VREFINT的ADC校准值的测试条件及其存放地址的信息。
我们通过读出芯片特定存储地址的VREFINT转换值,进而可以求算出它的具体电压值。我从手边一块STM32L4开发板读取相应地址的内容,如下面截图所示:
我们从图中可知VERFINT的ADC值为0x067c,据此可以反求出它的电压值:【这里是12位ADC分辨率,据资料可知校准测试时的VDDA=3V。后面都以该芯片数据展开】
0xfff:3.0 = 0x067c:VREFINT
根据上式可以得到该芯片的VREFINT为1.216v。
在较宽泛的芯片供电范围内,该内部参考电压值是个比较稳定而准确的数据。现在假设目前的应用场景满足VDDA=VDD,VDD在使用过程中会随时间慢慢下降,当VDD低到一定程度时需告警并需软件提前做些处理。
尽管VDDA/VDD在变,但VDDA始终是ADC模块的基准电压,它对应的ADC值始终是满量程值【0xfff】,另外VREFINT的电压值也没变,不过随着VDDA的变化,VREFINT所对应ADC值会一直在变化。但在任一时刻下面的关系式总是成立的【当然,电源电压至少要保障芯片能正常工作】:
VDDA:4095 = VREFINT:Adc_vrefint
上式中的Adc_vrefint为VREFINT在当前VDDA条件下所对应的ADC值,VREFINT为前面计算出来的电压值1.216v.
不难理解,对于同一VREFINT,随着VDDA的不断走低,它所对的转换值则是不断走高。
假设当VDDA低到2.65V时告警,我们可将上式中的VDDA换成2.65v,即可求出VREFINT此时所对应ADC值,经计算此时Adc_vrefint等于1879。也就是说,当VREFINT的所对应的ADC转换值等于1879时,VDDA就降到了2.65V.当VREFINT的转换值大于1879时,意味着VDDA比2.65V还要低。【具体使用时可以考虑一定裕量】
基于上述原理,我们开启VREFINT通道的模拟看门狗功能,拟定出合适的模拟看门狗的阈值。结合刚才的描述,1879就可以做VREFINT通道模拟看门狗的阈值上限,当VREFINT的转换值大于1879时就会产生模拟看门狗事件及中断。
下图是使用STM32CubeMx进行相关配置的部分截图。
上面主要基于STM32芯片和一个特定应用需求,大致介绍了如何使用片内参考电压实现模拟看门狗的基本思路,同时也顺便介绍了基于内部参考电压对芯片电源进行监测的方案。当然,有人可能注意到了,有关芯片电源监测话题前面也专门分享过,但没提模拟看门狗的内容。
相关文章