工作日记:NTC

文章详细描述了如何利用NTC热敏电阻监测电池温度,通过ADC进行采样,设置不同的温度阈值来控制充电过程。代码部分展示了在不同温度区间下的处理逻辑和充电控制引脚操作。
摘要由CSDN通过智能技术生成

1、分析

NTC是热敏电阻,随着温度的升高,电阻值会降低,具体看R-T表,不同的温度对应不同的电阻值。根据产品规格书(无图),我们知道产品充电时的动作温度范围是5±5℃~45±5℃,并且要求0℃以下绝对无法充电。 

根据以上RT表,我们可以知道当处于下面这几个温度时NTC的阻值是多少,然后根据电路图知道了基准电阻的阻值,所以NTC在5V电压通过时,它所分得的电压假设是x,

x / 5 =  NTC阻值  /(NTC电阻+基准电阻)

x / 4096 = NTC电阻 / (NTC电阻+基准电阻)

根据以上充电电路原理图以及芯片图,NTC_CE表示NTC的充电控制,它所在的引脚为PB4,那么当温度处于0℃以下时,我们把PB4的引脚置为0,就不能充电了。

2、代码


void fun_read_ntc_adc(void)
{
	unsigned char i = 0;

	gNTCADC = 0;
	for(i=0;i<4;i++){
		_adcr0 = 0b00010000;			// AN0	
		_adstr = 0;						// 启动 AD 转换
		_adstr = 1;		
		_adstr = 0;	
		while(_eocb)					// 等待AD转换完成
		{
			GCC_CLRWDT();
		}
		gNTCADC += (_adrh<<8) | _adrl;	//连续四次采集adc值并且全部加起来
	}
	gNTCADC >>= 2;                 //右移2位相当于除以4 eg:0b0100(4) 右移2位 -> 0b0001(1)
}

#define	NTC_HEAT_THRESHOLD 0x545	    //充电阈值(充电模式)
#define	NTC_COOL_THRESHOLD 0xAAF
#define	NTC_HEAT_THRESHOLD_WORK 0x42F	//放电阈值(工作模式)
#define	NTC_COOL_THRESHOLD_WORK 0xCF9
#define	NTC_TIME 1220
void fun_battery_temp_deal(void)
{
	static unsigned int heatCnt = 0;
	static unsigned int coolCnt = 0;

	// gNTCADC = 0xBFF;	//test
	
	// bTemOverFlag = 1;	//test
	// return;

	if(gNTCADC < NTC_HEAT_THRESHOLD){	// too heat
		coolCnt = 0;
		heatCnt++;
		if(heatCnt > NTC_TIME){
			heatCnt = NTC_TIME;
			_pb4 = 1;    //refuse to charge
			bTemOverFlag = 1;
		}
	}
	else if(gNTCADC > NTC_COOL_THRESHOLD){	// too cool
		heatCnt = 0;
		coolCnt++;
		if(coolCnt > NTC_TIME){
			coolCnt = NTC_TIME;
			_pb4 = 1;    //refuse to charge
			bTemOverFlag = 1;
		}
	}
	else{
		heatCnt = 0;
		coolCnt = 0;
		if(bTemOverFlag == 0)
			_pb4 = 0;    //alowed to charge
	}
}



// -10~55°
void fun_battery_temp_deal_work(void)
{
	static unsigned int heatCnt = 0;
	static unsigned int coolCnt = 0;

	// gNTCADC = 0xBFF;	//test
	
	// bTemOverFlag = 1;	//test
	// return;

	if(gNTCADC < NTC_HEAT_THRESHOLD_WORK){	// too heat
		coolCnt = 0;
		heatCnt++;
		if(heatCnt > NTC_TIME){
			heatCnt = NTC_TIME;
			_pb4 = 1;
			bTemOverFlag = 1;
		}
	}
	else if(gNTCADC > NTC_COOL_THRESHOLD_WORK){	// too cool
		heatCnt = 0;
		coolCnt++;
		if(coolCnt > NTC_TIME){
			coolCnt = NTC_TIME;
			_pb4 = 1;
			bTemOverFlag = 1;
		}
	}
	else{
		heatCnt = 0;
		coolCnt = 0;
		if(bTemOverFlag == 0)
			_pb4 = 0;
	}
}


void fun_battery_temperature(void)
{
	fun_read_ntc_adc();    
	fun_battery_temp_deal();
}

void fun_battery_temperature_work(void)
{
	fun_read_ntc_adc();
	fun_battery_temp_deal_work();
}



  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值