好的,信息已经齐全了。下面我来做完整的分析。
掉电检测比较器电路分析
一、电路工作原理
您设计的电路是一个经典的掉电检测电路,其工作原理如下:
分压网络计算:
- 上拉电阻 R4 = 200kΩ
- 下拉电阻 R6 = 24kΩ
- 分压比 = R6 / (R4 + R6) = 24 / (200 + 24) ≈ 0.1071
掉电阈值计算:
- 比较器负极(-)为内部 1.19V 参考电压(BandGap)
- 当 P5.1 电压 < 1.19V 时,比较器翻转,产生中断
- 对应的电源电压阈值 = 1.19V / 0.1071 ≈ 11.1V
- 这与您图中标注的 11.2V 基本吻合
工作逻辑:
- 当 24V 电源正常(>11.2V)→ P5.1 电压 > 1.19V → 比较器输出高电平
- 当 24V 电源跌落(<11.2V)→ P5.1 电压 < 1.19V → 比较器输出翻转,产生中断
- 在中断服务程序中保存关键数据到 EEPROM
二、关键配置分析(基于您的代码)
对照手册(STC32G 第20章 比较器),您的配置是正确的:
| 配置项 |
代码 |
说明 |
| 比较器正极(+)选择 |
CMPEXCFG |= 0x02 |
CMPPS[1:0] = 10,选择P5.1 为 CMP+ |
| 比较器负极(-)选择 |
CMPEXCFG |= 0x04 |
CMPNVS = 1,选择内部 1.19V 参考电压 为 CMP- |
| P5.1 模式 |
P5M0 &= ~0x02; P5M1 |= 0x02 |
配置为高阻输入模式(重要!) |
| 迟滞设置 |
CMPEXCFG |= 0x40 |
10mV 迟滞,防止电源噪声引起误触发 |
| 中断优先级 |
PCMPH=1; PCMP=1; |
最高优先级,确保掉电时能及时响应 |
三、电路设计的优点
- D2(4.3V 稳压管)的钳位保护作用:当 P5.1 电压异常升高时(如 24V 上电瞬间),D2 将 P5.1 电压钳位在约 4.3V + 0.7V ≈ 5.0V,保护单片机 I/O 口。手册规定 I/O 口对地电压不得超过 VDD+0.3V(最大 5.5V),此保护非常必要。
- R5(1kΩ)的限流作用:在 D2 导通时限制电流,防止损坏稳压管和 I/O 口。
- 分压电阻取值合理:200kΩ + 24kΩ 的总阻抗约 224kΩ,静态电流仅约 11.2V / 224kΩ ≈ 50μA,功耗极低。
四、注意事项与潜在问题
⚠️ 问题1:P3.6 必须空置(您图中已标注)
手册明确指出,当比较器负极选择内部 1.19V 参考电压时,P3.6 引脚必须悬空,不能做其他用途。您的代码中已将其配置为准双向口模式,但建议改为高阻输入且悬空:
P3M0 &= ~0x40; P3M1 |= 0x40; // P3.6 高阻输入
// 且外部不要连接任何电路
⚠️ 问题2:有源晶振与比较器中断的潜在冲突
您在论坛帖子中提到"使用外部有源晶振作系统时钟后,比较器中断出现问题"。这可能是由于:
- 时钟切换时序问题:从内部 IRC 切换到外部有源晶振时,如果比较器正在工作,时钟切换瞬间可能导致比较器误触发
- 建议:先完成比较器初始化并稳定后,再切换系统时钟源;或者在时钟切换前暂时屏蔽比较器中断
⚠️ 问题3:掉电检测的响应时间
- 比较器从输入变化到输出翻转有约 0.1μs ~ 0.5μs 的响应时间(取决于配置的迟滞)
- 加上中断响应和 EEPROM 写入时间(约 5
10μs/字节),建议在掉电检测电路中增加 储能电容(如 100μF470μF 电解电容在 24V 输入端),确保掉电后有足够时间完成数据保存
五、完整的比较器初始化参考代码
// 比较器初始化函数 - 掉电检测
// 正极(P5.1)接外部电阻分压,负极接内部1.19V参考电压
void CMP_Init(void)
{
P_SW2 |= 0x80; // 使能访问XFR
// --- 引脚配置 ---
P5M0 &= ~0x02; P5M1 |= 0x02; // P5.1 高阻输入(比较器正极输入)
P3M0 &= ~0x40; P3M1 |= 0x40; // P3.6 高阻输入(必须悬空!)
// --- 比较器扩展配置 ---
CMPEXCFG = 0x00;
CMPEXCFG |= 0x40; // 10mV迟滞,防噪声误触发
CMPEXCFG |= 0x04; // 负极选择内部1.19V参考电压
CMPEXCFG |= 0x02; // 正极选择P5.1
// --- 比较器控制寄存器 ---
CMPCR1 = 0x00; // 先清零
CMPCR1 |= 0x80; // 使能比较器
CMPCR1 |= 0x40; // 使能比较器输出
CMPCR1 |= 0x10; // 下降沿中断(掉电时电压下降)
CMPCR1 |= 0x08; // 使能比较器中断
// --- 中断优先级(最高级) ---
PCMPH = 1; // 比较器中断优先级高位
PCMP = 1; // 比较器中断优先级低位
EA = 1; // 开启总中断
}
// 比较器中断服务函数
void CMP_ISR(void) interrupt 21 // 比较器中断号21
{
if(CMPCR1 & 0x40) // 判断是否比较器中断
{
CMPCR1 &= ~0x40; // 清除中断标志
// 保存关键数据到EEPROM
// IAP_EraseSector(...);
// IAP_Program(...);
// 掉电前准备
// 关闭不必要的外设...
}
}
六、总结
| 项目 |
结论 |
| 电路设计 |
✅正确,分压比合理,阈值约 11.1V |
| D2 保护 |
✅必要且正确,4.3V 稳压管保护 I/O 口 |
| 比较器配置 |
✅正确,P5.1 正极 + 内部 1.19V 负极 |
| P3.6 处理 |
⚠️必须悬空,不能接任何电路 |
| 有源晶振冲突 |
⚠️ 注意时钟切换时序,建议先稳定比较器再切换时钟 |
如果您能具体描述一下"比较器中断出现问题"的现象(如误触发、不触发、程序跑飞等),我可以进一步帮您排查。
🔍 搜索 "比较器 采样电压 P5.1 4.3V稳压管 1.19VREF"
⏱️ 查找用时 7.9s | 总回答用时 28.0s