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();
}