1.比较强初始化

uint8_t gpc_flag=0;//0,是关闭电量检测,1是开启电量检测

void GPC_Init(void)
{
    /***************************************************
	比较器控制寄存器 CMPCON0(0FH)
	Bit7  CMPEN:  CMP使能位
		1=  使能CMP
		0=  禁止CMP
	Bit6  CMPPS:  CMP正端输入选择位
		1=  CMP+端口电压
		0=  VDD经过内部电阻分压后的电压
	Bit5~Bit3  CMPNS<2:0>:  CMP负端输入选择位
		000=  CMP0- 端口电压
		001=  CMP1- 端口电压
		010=  CMP2-端口电压
		011=  CMP3-端口电压
		100=  VDD经过内部电阻分压后的电压
		101=  BG
		11x=  BG
	Bit2  CMPNV:  CMPO端口输出取反控制位
		1=  CMPOUT在CMPO端口取反输出
		0=  CMPOUT在CMPO端口正常输出
	Bit1  CMPOUT:  CMP结果位
	Bit0  CMPOEN:  CMPO端口输出使能位
		1=  使能CMPO端口输出CMPOUT
		0=  禁止CMPO端口输出CMPOUT
	*****************************************************/
	CMPCON0 = 0B00111000;			//配置比较器正端为VDD分压,负端为BG1.2V,使能比较器输出
	/***************************************
	比较器控制寄存器 CMPCON1(10H)
	Bit7  CMPIM:  CMP中断触发边沿选择
		1=  CMP输出的下降沿触发中断
		0=  CMP输出的上升沿触发中断
	Bit6  ANSEL:  模拟选择位,选择CMP+、CMPX-的模拟或数字功能
		1=  模拟口
		0=  数字口
	Bit5  RBIAS_H:  具体用法参考比较器框图
	Bit4  RBIAS_L:  具体用法参考比较器框图
	Bit3~Bit0  LVDS<3:0>:  内部电阻分压比选择位
	****************************************************/
	CMPCON1 = 0B10010111;			//	测试VDD电压低于3.6V中断,故为下降沿触发
									//Bit5~0对应的电压值可参考芯片说明书
	CMPEN = 1;								//比较器使能
														
	gpc_flag=0;//关闭电量检查标志位
}
//开启比较器检测
void	GPC_ON(void)
{
	gpc_flag=1;
}
//关闭比较器检测
void	GPC_OFF(void)
{
	gpc_flag=0;
}

2.CMPCON1 寄存器,用来改变检测电压值

3.上面初始化我用的的是3.6v

4.检测电池电压函数,将此函数放到主函数while()循环里面。

//检测 GPC 比较器
void    GPC_Compare(void)
{
	if(gpc_flag)//电池电量检查标志位
	{
		if(CMPCON0&0x02)//bit1=1时进入
		{
		}else//低于设置电压进入
		{
            //当电池电压低于设置电压3.6v就会执行下面这两句程序,也可以换成别的
			charge_led_blink_ON();//led闪烁
			GPC_OFF();
		}		
	}
}

5.CMPCON0寄存器,输出比较结果

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐