2022-06-09 RK817 PMU 电池温度检测

一、硬件连接,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 <[email protected]>
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 获取温度值

七、参考文章

RK3566,rk817上TS脚模拟输入功能用作NTC检测_lkdcom的博客-CSDN博客

NTC温度传感器395010k_热敏电阻温度阻值对应表 - 百度文库

猜你喜欢

转载自blog.csdn.net/qq_37858386/article/details/125201716