一、前言
- 在日常的Soc驱动开发中,对于芯片的实际使用者,大多数时间所调试的是外围设备的驱动,或者说是自己新增设备的驱动。
- 本文即介绍其中常用的一个小模组:温度传感器(NTC热敏电阻)的使用方法,关键是搞懂其中的映射关系是否正确:温度值、电阻值、ADC读取的电压值。当映射正确后,我们就可以很快的将它们组织成需要的温度曲线,或者填写各个温控阈值(在什么温度,干什么事情)。
- 中学生略过、在读大学生略过……
二、准备工作
- 温度传感器,常使用的核心器件就是NTC热敏电阻,其特性就是热敏电阻的阻值(欧姆)会随着温度的变化而变化,并且十分灵敏。而对于温度数据的采集,如本文所采用的全志H713 Soc芯片,实际上获得的一般是热敏电阻两端的实时电压(毫伏)。
- 所以,对于软件开发人员来了说,首先要搞懂的就是几个变量之间的映射关系:温度–>电阻值–>电压值。
2.1 NTC规格书
- 拿到设备后,首先需要阅读NTC热敏电阻的规格书,其中最重要的就是其温度-阻值的映射表
- 最要注意的是,注意观察其阻值是不是一个相对线性的,或者说使用过程中给对温度的精度要求不是那么高,那么只要不是个别部分非线性差异过大,就可以接受,或者分段成若干线性的部分。
- 本文针对的设备,是投影仪,对于这类设备,比较关注的是高温,不要因为高温而烧毁了LED灯珠或者LCD\DMD等关键显示器件,所以日常选择的温度区间,基本上,只要涵盖30°~90°即可
- 从本文的NTC规格书中,可以得知30°~90°这个区间基本上是线性的,对于使用方法的讲解,以60°做个例子。
2.2 原理图
- 获得了NTC的规格书之后,下一步要准备的就是温度传感器模块的原理图,下面黑线框部分,是对于软件人员更容易理解的一个电路简化,相关信息也可以咨询下硬件工程师。
- 从这个电路图中,容易干扰的部分,就是R2电阻,它因为连接的是GPADC0(Soc的ADC引脚),这一路向硬件咨询,其实是一个高阻的线路,所以可以将其忽略,因此,继续简化后,就剩下一个R1和Rx(热敏电阻,相当于一个可变电阻器)的串联分压电路。
- Rx两端的电压值Vx,就是ADC读取后反馈的数据,也可以通过实际测量获得(使用万用表的直流电压档位,红黑表笔连接热敏电阻的两端)。
2.3 新手的疑问
Soc的ADC引脚读取的是电压值,而规格书里面列出来的却是温度和电阻值的对应关系,电压值怎么和这个电阻值对应上呢?如何验证算法是否正确呢?这是软件人员经常困惑的地方,虽然物理学了那么多年了,但终归用得少,但通过楼上的简化电路,用初中的电路知识,就可以得出答案。
三、问题求解
此处有两个问题(双向验证,double check):
(1)一个是根据电阻值,算出理论上的Vx应该等于多少?
(2)另一个是,根据实际测量获得的Vx,倒推出理论的Rx热敏电阻的阻值是多少?
最终获得的数值,(1)和 (2)的阻值和电压参数应该基本一致
3.1 知道Rx, 求Vx的理论值
在不测量具体Vx的情况下,通过公式计算出Vx的理论值
查规格书,以60°为例,Rx = 2.4734 KΩ
串联电路的电流相等
Vx/Rx = 1.8/(Rx+R1) ,其中单位:电阻为欧姆,电压为伏特,R1=3000欧姆
即:Vx = 1.8Rx /(Rx+R1)
计算: Vx = 1.8 * 2473 / (2473 + 3000) = 0.813 v
3.2 实测得知Vx,求Rx的理论值
- Vx可以通过测量直接获得,而NTC的规格书上只有温度和电阻的MAP,所以如何确定电压和当前温度的对应关系呢?
- 串联电路的电流相等
- Vx/Rx = 1.8/(Rx+R1) ,其中单位:电阻为欧姆,电压为伏特,R1=3000欧姆
- 即: Rx = Vx*R1/(1.8 - Vx)
- 实际抓打印:zs, gadc_thermal_adc_to_temp temp=60000, val=813
- 实际测量Vx = 0.813v 和=打印的ADC读数一致
计算:Rx = 0.813*3000 / (1.8-0.813) = 2,471.12 Ω
3.3 综上
从3.1和3.2的计算结果可知,60°时候的电压、电阻的映射关系是正确的。后续通过进一步的对其他值抽样,可以做再次的确认。
四、篇尾
每当搞起热敏电阻类似的简单电路器件,写它们的控制驱动时,总会痛心疾首,当年大学为啥不好好学物理,不好好学习模电和数电,……,总算知道啥都有用了吧!书到用时方恨少!