一、硬件连接,TS/GPIO,接电池的热敏电阻 thermistor
二、热敏电阻(the resistance of the thermistor)大致分为两类:
1、电阻随温度上升而增加,称为正温度系数(PTC,Positive Temperature Coefficient)热敏电阻。
2、电阻随温度上升而减少,称为负温度系数(NTC,Negative Temperature Coefficient)热敏电阻。
三、电池内部原理图
四、 测温型NTC 热敏电阻器阻温特性表
五、获取热敏电阻值涉及的寄存器
1、gas_gauge_ADC_CONFIG0
Address: Operational Base + offset (0x0050),TS_ADC_EN位要配置为1
2、gas_gauge_ADC_CONFIG1 Address: Operational Base + offset (0x0055) VOL_ADC_TSCUR_SEL确保这一位描述了从TS脚输出的电流大小.
3、CODEC_AREF_RTCFG1
Address: Operational Base + offset (0x0017) REF_ADC_SEL 设置ADC 参考电压。
4、gas_gauge_BAT_TS_H 和gas_gauge_BAT_TS_L 获取ADC 值
六、修改的代码,并测试
1、修改的代码
commit b353b70850442863c4b051beb258681c6cd71cdf
Author: xxx.wei <xxx.wei@xxx.cn>
Date: Thu Jun 9 14:09:22 2022 +0800
get battery temperature
diff --git a/drivers/power/supply/rk817_battery.c b/drivers/power/supply/rk817_battery.c
index 32e2d65..4c49a27 100755
--- a/drivers/power/supply/rk817_battery.c
+++ b/drivers/power/supply/rk817_battery.c
@@ -632,6 +632,11 @@ struct rk817_battery_device {
bool change; /* Battery status change, report information */
};
+struct battery_res_temp_data {
+ unsigned long res;
+ int temp;
+};
+
static void rk817_bat_resume_work(struct work_struct *work);
static u64 get_boot_sec(void)
@@ -2095,6 +2100,40 @@ static int rk817_battery_time_to_full(struct rk817_battery_device *battery)
return time_sec;
}
+static const struct battery_res_temp_data bat_temp_table[] = {
+ {324 ,125},{ 371,120},{ 427,115},{ 491,110},{ 567,105},
+ {657 ,100},{ 763, 95},{ 890, 90},{ 1044, 85},{ 1228, 80},
+ {1452 , 75},{ 1725, 70},{ 2058, 65},{ 2466, 60},{ 2968, 55},
+ {3588 , 50},{ 4357, 45},{ 5318, 40},{ 6523, 35},{ 8047, 30},
+ {10000, 25},{12461, 20},{15652, 15},{19783, 10},{25152, 5},
+ {32116, 0},{41306, -5},{53280,-10},{68982,-15},{89682,-20}
+};
+
+#define BAT_TEMP_TEBLE_NUM (sizeof(bat_temp_table) / sizeof(bat_temp_table[0]))
+
+static int rk817_battery_get_temperature(struct rk817_battery_device *battery)
+{
+ int i ,ret = 25 ;
+ unsigned long val = 0 ,res = 0;
+ val = rk817_bat_field_read(battery, BAT_TS_H) << 8;
+ val |= rk817_bat_field_read(battery, BAT_TS_L);
+ res=(val * 12 *10000)/(0XFFFF+1);//res=(val * 12 *1000000)/((0XFFFF+1)*10*10);
+ for( i = 0; i < BAT_TEMP_TEBLE_NUM ;i++)
+ {
+ if ( res <= bat_temp_table[i].res)
+ {
+ if( i > 0)
+ ret = bat_temp_table[i].temp + ((bat_temp_table[i].res - res)*5/(bat_temp_table[i].res-bat_temp_table[i-1].res));
+ else
+ ret = bat_temp_table[i].temp;
+
+ break;
+ }
+ }
+ printk("Negative Temperature Coefficient,val = %lu ,res = %lu ret = %d \r\n",val,res,ret);
+ return ret;
+}
+
static int rk817_battery_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
@@ -2141,6 +2180,7 @@ static int rk817_battery_get_property(struct power_supply *psy,
break;
case POWER_SUPPLY_PROP_TEMP:
val->intval = battery->temperature;
+ val->intval = rk817_battery_get_temperature(battery);
if (battery->pdata->bat_mode == MODE_VIRTUAL)
val->intval = VIRTUAL_TEMPERATURE;
break;
2、cat /sys/class/power_supply/battery/temp 获取温度值
七、参考文章