FRDM-KL02改变VDD使用内部温度传感器测温例程
1,例程功能描述
本例程旨在使用官方的FRDM_KL02开发板,测试改变芯片VDD电压的时候,利用内部测试传感器测试温度,查看是否能够测准。分享该例程的原因是因为发现还是有部分客户在调试这个功能的时候遇到了一些问题,所以我们飞思卡尔论坛支持小组利用Codewarror的PE生成了一个例程,并编写了这个文档供大家参考。
例程主要是通过ADC读取bandgap的值,计算出当前VDD的值,然后再结合datasheet提供的温度相关参数计算出这些参数在当前VDD值下对应的ADC值,然后最终带入公式计算出实际的温度。
0
|
|
|
|
2,温度计算算法讲解
2.1 温度计算公式雏形
Temp=25-((Vtemp-Vtemp25)/m)
其中,
Temp:当前温度,待计算
Vtemp:当前文档对应的电压,可以通过读取传感器的ADC值结合VDD计算出来。
Vtemp25:25度,VDD=3v时对应的电压,此值由datasheet提供
m:温度相对电压的变化率,这个也是由datasheet提供。
具体的原理,可以参看参考文献[1],第2章。
|
|
|
|
|
2.2 变VDD的温度计算公式
如果改变VDD值,那么就不能用以上公式直接计算,需要找到对应当前VDD值的Vtemp25以及m的ADC值去替换掉原来的Vtemp25以及m。下面直接给出计算公式:
(1) 计算当前VDD
VDD=(ADCRvdd*Vbg)/ADCRgb
大家知道,内部的bandgap是固定的,通过datasheet可以知道,这个值的范围为0.97到1.03,典型值为1V。
所以我们利用内部的bandgap值,读取在当前VDD下的ADC值,结合ADC满量程(比如12位为4095),计算出当前VDD的电压值。
公式中,
ADCRvdd:VDD对应的ADC满量程值,由你所选定的ADC位数决定,比如12位,就是2的12次方-1。
Vbg:bandgap值,1V
ADCRgb:ADC读取bandgap的值,实测。
实际计算,会将VDD放大10倍计算,即公式变为:
VDD*10=(ADCRvdd*Vbg)*10/ADCRgb
VDD*10=VDDconv
|
|
|
|
|
(2) 计算temp25对应的ADC值ADCtemp25
ADCtemp25=(ADCRvdd*Vtemp25*10)/VDDconv
公式中,
ADCRvdd:VDD对应的ADC满量程值,由你所选定的ADC位数决定,比如12位,就是2的12次方-1。
Vtemp25:25度,VDD=3v时对应的电压,此值由datasheet提供
(3) 计算温度电压变化率m对应的ADC值ADCR100m
ADCR100m=(ADCRvdd*m*1000)/ VDDconv
其中,
m:温度相对电压的变化率,这个也是由datasheet提供。
|
|
|
|
|
(4) 最终温度公式
Temp=25-((ADCRt- ADCtemp25)/ ADCR100m)*100
其中,
ADCRt:为实际测试的ADC值。
将1-3计算的结果带入到4中就可以计算出当前的温度了。
更加详细细节,请查看参考文献[1],第5章。
|
|
|
|
|
3,例程硬件配置
主要是断开J4,然后再J4的2脚接上可以改变的VDD,怎么改变VDD呢?
可以使用一个电位器,将3.3V电压分压,然后接到J4的2脚实现。接线如下:
[size=0.83em]1.jpg (164.28 KB, 下载次数: 1)
下载附件
[color=rgb(153, 153, 153) !important]2014-4-15 13:20 上传
|
|
|
|
|
4,例程软件配置
软件配置,是用CW的PE生成,具体配置由于项目较多,可以直接参看附件中的例程。
主要分为四个部分,1:CPU配置,2:串口CSIO1模块配置,3:TPM1用于乒乓触发ADC配置,4:ADC模块配置,选择ADC输入通道为温度传感器以及bandgap。
串口配置是用于打印实时的温度值,以及bandgap对应的ADC值,bandgap对应的ADC值可以结合ADC满量程以及bandgap电压计算出vdd的值vdd_cal。更加详细的配置内容讲解,可以参看参考文献[2],[3].
注意,bandgap选择之后,并没有在PMC寄存器中打开bandgap,所以需要在主程序中加上如下代码:
PMC_REGSC |= 0X01; // enable bandgap
2.2节对应的计算C代码如下:
float ADC_Calculate(uint16 result_A,uint16 result_B)
{
float Vdd_Cal,ADCR_Temp25,ADCR_100m;
float i;
float Temp;
Vdd_Cal=40950/result_A;
ADCR_Temp25=29320/Vdd_Cal;
ADCR_100m=6633/Vdd_Cal;
Temp=(float)((result_B-ADCR_Temp25)*100/ADCR_100m);
i=(float)(25-Temp);
return (uint16)i;
}
|
|
|
|
|
5,测试结果
这里测试主要在datasheet规定的VDD的范围内,挑几个电压然后测试当前的温度,以及VDD的值。
[size=0.83em]test_result.jpg (119.54 KB, 下载次数: 3)
下载附件
[color=rgb(153, 153, 153) !important]2014-4-15 13:19 上传
图2
由以上测试结果可以发现,随着VDD的改变,温度基本还是实际温度。
|
|
|
|
|
float ADC_Calculate(uint16 result_A,uint16 result_B)
result_B能猜到是当前温度传感器的ADC值(12bit),但是result_A不知道是对应哪个参数,求大神告知。
|
|
|
|
|