打印
[Kinetis]

【经验分享】FRDM-KL02改变VDD使用内部温度传感器测温例程

[复制链接]
2947|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 FSL_TICS_A 于 2014-10-21 15:18 编辑

FRDM-KL02改变VDD使用内部温度传感器测温例程
Author:FSL_TICS_ZJJ
1,例程功能描述
本例程旨在使用官方的FRDM_KL02开发板,测试改变芯片VDD电压的时候,利用内部测试传感器测试温度,查看是否能够测准。分享该例程的原因是因为发现还是有部分客户在调试这个功能的时候遇到了一些问题,所以我们飞思卡尔论坛支持小组利用Codewarror的PE生成了一个例程,并编写了这个文档供大家参考。
例程主要是通过ADC读取bandgap的值,计算出当前VDD的值,然后再结合datasheet提供的温度相关参数计算出这些参数在当前VDD值下对应的ADC值,然后最终带入公式计算出实际的温度。
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脚实现。接线如下:
图1
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的值。

图2
由以上测试结果可以发现,随着VDD的改变,温度基本还是实际温度。
6,参考文献
[1] Donnie Carcia, Rafael Peralez. Temperature sensor for the HCS08 Microcontroller Family. AN3031
[2] FSL_TICS_ZP. KL25使用乒乓模式采集ADC上篇
具体链接,请查看kinetis的资料大本营,官方例程分享
[3] FSL_TICS_ZP. KL25使用乒乓模式采集ADC下篇
具体链接,请查看kinetis的资料大本营,官方例程分享

KL02_ADC_temp.rar (545.09 KB)
FRDM-KL02改变VDD使用内部温度传感器测试温度.pdf (375.43 KB)



评论
深深生生 2018-7-6 14:27 回复TA
转换带隙基准电压通道(AD23) • 通过使用 V BG 的值转换带隙基准电压通道的数字值,用户就可确定 V DD 。 • 转换温度传感器通道(AD22) • 通过使用计算所得的 V DD 值将 AD22 的数字值转换成电压,V TEMP 就是不明白VDD是啥 
深深生生 2018-7-6 14:26 回复TA
VDD是啥电压么 

相关帖子

沙发
FSL_TICS_ZJJ|  楼主 | 2014-4-15 13:18 | 只看该作者
希望本文档以及例程能够给大家带来帮助,不足之处欢迎指正。
同时也欢迎大家分享自己的文档。

使用特权

评论回复
板凳
xinyinxing| | 2014-4-15 14:09 | 只看该作者
感谢楼主们的分享,这些经验很宝贵,收下了!

使用特权

评论回复
地板
攻城狮| | 2014-4-15 15:54 | 只看该作者
哎呦,很高大上吗,学习学习!

使用特权

评论回复
5
FSL_TICS_ZJJ|  楼主 | 2014-4-22 09:56 | 只看该作者
欢迎支持!

使用特权

评论回复
6
smiel_xll| | 2014-4-25 15:07 | 只看该作者
灌水。。。。。。。。。。。

使用特权

评论回复
7
FSL_TICS_ZJJ|  楼主 | 2014-4-25 15:52 | 只看该作者
smiel_xll 发表于 2014-4-25 15:07
灌水。。。。。。。。。。。

所有的经验分享帖已经汇总:https://bbs.21ic.com/icview-722190-1-1.html
有兴趣可以去查看。

使用特权

评论回复
8
hypear| | 2014-7-6 08:10 | 只看该作者
thank

使用特权

评论回复
9
caijun_2012| | 2014-7-21 08:55 | 只看该作者
:)

使用特权

评论回复
10
因口折心| | 2014-12-18 14:58 | 只看该作者
:victory:

使用特权

评论回复
11
goodrenze| | 2016-7-9 17:50 | 只看该作者
好经验,感谢楼主分享。

使用特权

评论回复
12
shauew| | 2016-7-13 21:46 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-15 13:18
希望本文档以及例程能够给大家带来帮助,不足之处欢迎指正。
同时也欢迎大家分享自己的文档。 ...

你回来啦?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

5069

帖子

88

粉丝