1. ADC 窗口监测功能简介
MG32F02A 系列 MCU 内置的ADC(模数转换器)支持窗口监测功能(Window Monitoring),可以在采集模拟信号时自动监测输入值是否超出预设的上下限范围,并触发相应的事件或中断。该功能适用于:
电池电压监测(检测电压是否过高或过低)
传感器阈值检测(温度、压力、光照等)
电机控制保护(防止电流过载)
2. ADC 窗口监测功能原理
窗口监测(AWD,Analog Watchdog)在 ADC 采样过程中自动比较转换结果,当 ADC 采样值超出或进入预设的上下限时,可触发中断或事件,无需 CPU 参与,从而提升系统效率。
窗口监测的关键参数:
ADC_THL (Threshold Low):ADC 采样值的下限,低于该值时触发事件。
ADC_THH (Threshold High):ADC 采样值的上限,超过该值时触发事件。
ADC_WM0 (Window Mode 0):
0: 仅在超出窗口范围时触发(默认)
1: 仅在窗口范围内时触发
3. 配置 ADC 窗口监测
(1)初始化 ADC
c
复制
编辑
#include "MG32x02z.h"
// 设置 ADC 窗口监测阈值
#define ADC_LOW_THRESHOLD 1000 // ADC 低阈值
#define ADC_HIGH_THRESHOLD 3000 // ADC 高阈值
void ADC_Init(void) {
// 使能 ADC 时钟
APB1CLK |= (1 << APB1EN_ADC);
// 选择 ADC 通道(例如 AIN0)
ADC0->CR0 &= ~ADC_CR0_MDEN; // 关闭深度模式
ADC0->CR1 = (0x01 << ADC_CR1_SEL_Pos); // 选择 AIN0
// 设置 ADC 采样时间
ADC0->CLK = (3 << ADC_CLK_DIV_Pos); // 分频设置,提高转换速度
// 设置 ADC 窗口监测上下限
ADC0->THL = ADC_LOW_THRESHOLD; // 低阈值
ADC0->THH = ADC_HIGH_THRESHOLD; // 高阈值
// 使能 ADC 窗口监测中断
ADC0->INT |= (1 << ADC_INT_WDTF);
// 使能 ADC
ADC0->CR0 |= ADC_CR0_ADEN;
}
(2)配置中断
在 ADC 采样时,若数据超出阈值,则会触发 ADC 窗口监测中断(ADC_WDTF)。
c
复制
编辑
void ADC_WDT_IRQHandler(void) {
if (ADC0->STA & (1 << ADC_STA_WDTF)) { // 确认 ADC 窗口监测中断
uint16_t adc_value = ADC0->DATA; // 读取 ADC 数据
if (adc_value < ADC_LOW_THRESHOLD) {
// 低于下限值,执行低电压保护
} else if (adc_value > ADC_HIGH_THRESHOLD) {
// 高于上限值,执行过压保护
}
ADC0->STA |= (1 << ADC_STA_WDTF); // 清除中断标志
}
}
(3)主循环读取 ADC
c
复制
编辑
void main(void) {
ADC_Init(); // 初始化 ADC
while (1) {
ADC0->CR0 |= ADC_CR0_ADST; // 启动 ADC 采样
while (!(ADC0->STA & (1 << ADC_STA_ADIF))); // 等待转换完成
uint16_t adc_value = ADC0->DATA; // 读取 ADC 值
if (adc_value < ADC_LOW_THRESHOLD) {
// 低电压报警
} else if (adc_value > ADC_HIGH_THRESHOLD) {
// 高电压报警
}
}
}
4. 结论
MG32F02A MCU 的 ADC 窗口监测功能可以实时监测输入电压,当信号超出设定范围时自动触发中断,从而实现低功耗、高效的自动监控系统。适用于:
电池电量检测
过流/欠压保护
温度监测
环境监控
通过本教程,你可以灵活运用窗口监测功能,提高系统响应速度,降低 CPU 负载。
|