137 CMP比较器

137的和135的是一样的。

#include "bat32g137.h"
#include "cmp.h"


int main(void)
{
	// postive input CMP_PSIDE_VCIN12--P20
	// negtive input CMP_NSIDE_IVREF 内部电压参考源
	// 默认是双边沿触发中断 
	CMP_Init(CMP_CHANNEL_1,CMP_PSIDE_VCIN12,CMP_NSIDE_IVREF);
	// 内部VCC GND 作为 比较器电压
	CMP_VREF_Init(CMP_CHANNEL_1,CMP_VDD_VSS_REFERENCE_VOLTAGE);
	// 启动比较器
	CMP_Start(CMP_CHANNEL_1);
	// 设置以内部电源为参考电压,可以256等级细分
	CMP_VREF_Set_Value(CMP_CHANNEL_1,128); // VCC*128/256,VCC = 3.3,3.3*128/256 = 1.65V

	while(1)
	{
		
	}
}

void IRQ25_Handler(void) __attribute__((alias("cmp1_interrupt")));

/***********************************************************************************************************************
* Function Name: cmp1_interrupt
* @brief  CMP0 interrupt service routine
* @param  None
* @return None
***********************************************************************************************************************/
void cmp1_interrupt(void)
{
    INTC_ClearPendingIRQ(CMP1_IRQn);     /* clear INT
### 51单片机电压比较器CMP)使用方法及电路设计 STC15系列的部分51单片机内置了电压比较器(Comparator, CMP)功能,可以用于模拟信号的比较、掉电检测、电源监控等应用场景。该功能允许用户将外部输入电压与另一个输入或内部参考电压进行比较,并根据比较结果触发中断或其他操作。 #### 比较器引脚配置 在STC15系列中,比较器的输入和输出引脚如下: - **正向输入端(+Input)**:可选为P5.5或P2.0 - **负向输入端(-Input)**:固定为P5.4 - **比较器输出端**:为P1.2(可用于观察比较结果) 此外,支持将P5.5输入与内部BandGap参考电压(约1.27V)进行比较[^3]。 #### 特殊功能寄存器(SFR)配置 与比较器相关的寄存器主要包括: - **CMPCR1(比较器控制寄存器1)**:用于使能比较器、选择比较器输入源、设置中断使能等。 - **CMPCR2(比较器控制寄存器2)**:部分型号支持,用于进一步配置比较器模式或参考电压源。 通过配置这些寄存器,可以实现对比较器的灵活控制,例如选择输入通道、设置中断响应方式等。 #### 应用示例:掉电检测 一个常见的应用是利用比较器实现掉电检测。其原理是将外部供电电压经过电阻分压后送入比较器的一个输入端(如P5.5),并与内部BandGap电压(1.27V)进行比较。当外部电压下降至某一阈值时,比较器输出状态改变,触发中断服务程序,从而执行关键数据的保存操作(如写入EEPROM)[^2]。 ##### 掉电检测电路设计要点: - 使用两个电阻对输入电压进行分压,使得正常工作电压下比较器输入高于1.27V。 - 当电源电压下降到临界值时,分压后的电压低于1.27V,比较器翻转并触发中断。 - 在电源断开瞬间,若需要执行较长时间的数据写入操作,应在电源前端并联一个大容量电容(如1000μF)以提供短暂延时供电。 #### 示例代码(基于STC15W系列) 以下是一个简单的掉电检测中断处理程序示例: ```c #include <stc15.h> void Init_Comparator(void) { P5M1 = 0x00; // 设置P5口为推挽输出 P5M0 = 0xFF; CMPCR1 = 0xA0; // CMPEN=1: 启用比较器CMPIE=1: 使能比较中断CMPIS=0: 选择P5.5为+输入 CMPCR2 = 0x00; // 默认配置 } void Comparator_ISR(void) interrupt 16 { // 执行掉电保护操作,例如保存参数到EEPROM // 注意:此处应避免长时间阻塞 } void main(void) { Init_Comparator(); EA = 1; // 全局中断使能 while (1) { // 主循环逻辑 } } ``` #### 注意事项 - 确保比较器输入电压在允许范围内(通常不超过VCC)。 - 若需高精度比较,建议使用外部低阻抗参考电压源。 - 中断服务函数应尽量简洁,避免影响系统响应其他中断。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值