STM32 溫度傳感器 探究
溫度傳感器可以用來測(cè)量器件周圍的溫度(TA)。
溫度傳感器在內(nèi)部和ADCx_IN16輸入通道相連接,此通道把傳感器輸出的電壓轉(zhuǎn)換成數(shù)字值。
溫度傳感器模擬輸入推薦采樣時(shí)間是17.1μs。
當(dāng)沒有被使用時(shí),傳感器可以置于關(guān)電模式。
注意:必須設(shè)置TSVREFE位激活內(nèi)部通道:ADCx_IN16(溫度傳感器)和ADCx_IN17(VREFINT)的轉(zhuǎn)換。
主要特征
●支持的溫度范圍:-40到125度
●精確度:+/- 1.5° C
讀溫度
為使用傳感器:
1.選擇ADCx_IN16輸入通道
2.選擇采樣時(shí)間大于2.2 μs
3.設(shè)置ADC控制寄存器2(ADC_CR2)的TSVREFE位,以喚醒關(guān)電模式下的溫度傳感器
4.通過設(shè)置ADON位啟動(dòng)ADC轉(zhuǎn)換(或用外部觸發(fā))
5.讀ADC數(shù)據(jù)寄存器上的VSENSE 數(shù)據(jù)結(jié)果
6.利用下列公式得出溫度
溫度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
這里:
V25 = VSENSE
在25°C時(shí)的數(shù)值
Avg_Slope = 溫度與VSENSE曲線的平均斜率(單位為mV/° C 或 μV/ °C)
參考電氣特性章節(jié)中V25 和Avg_Slope的實(shí)際值。
注意:傳感器從關(guān)電模式喚醒后到可以輸出正確水平的VSENSE前,有一個(gè)建立時(shí)間。ADC在上電后也
有一個(gè)建立時(shí)間,為了縮短延時(shí),應(yīng)該同時(shí)設(shè)置ADON和TSVREFE位。
以下部分來自wolaiye945的博客:
首先將數(shù)據(jù)進(jìn)行比例轉(zhuǎn)化,可以使用微軟系統(tǒng)自帶的計(jì)算器,根據(jù)參考電壓3.3V在12位AD轉(zhuǎn)換對(duì)應(yīng)最大值0xFFF可知,1.42V對(duì)應(yīng)0x6E2(1762D),而斜率每攝氏度4.35mV對(duì)應(yīng)每攝氏度0x05,故此時(shí)公式可以修正為:溫度(°C) = {(0x6E2- VSENSE) / 5} + 25
綜上所述,芯片的溫度已經(jīng)可以通過計(jì)算存入變量,在經(jīng)過相應(yīng)的位處理就可以顯示在LCD上。
本人使用的代碼僅供參考,如下:
//變量聲明部分略去
mytemp = (0x6E2- ADC_ConvertedValue_Bak) / 0x05 + 25;
for (v2=3;v2;v2--)
{
v1=mytemp;
mytemp/=10;
LCD_DrawChar(3,(v2-1)<<3,HexValueOffset[v1]);
}
最后,還需要提示一下,在使用的時(shí)候不要忘記喚醒溫度傳感器(默認(rèn)處于休眠狀態(tài)),也就是需要設(shè)置ADC控制寄存器2(ADC_CR2)的TSVREFE位為1,否則會(huì)得到一個(gè)幾乎為零的極小AD值,通過公式得到一個(gè)遠(yuǎn)遠(yuǎn)超出范圍的溫度值,顯然是錯(cuò)誤的。
給控制寄存器置位可以使用直接置位的方法,但為了增強(qiáng)程序的模塊化程度,我建議使用STM32預(yù)定義的函數(shù)ADC_TempSensorVrefintCmd(ENABLE);
在初始化ADC后和開始轉(zhuǎn)換前的代碼段中調(diào)用該函數(shù),即可喚醒溫度傳感器的檢測(cè)。
以下來自泡桐樹
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//獨(dú)立模式CR1
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//掃描模式使能
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉(zhuǎn)換模式使能
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//啟動(dòng)轉(zhuǎn)換的外部事件--無CR2
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換后的數(shù)據(jù)右對(duì)齊
ADC_InitStructure.ADC_NbrOfChannel = 2;//轉(zhuǎn)換的通道數(shù)為2
ADC_Init(ADC1, &ADC_InitStructure);
//內(nèi)部溫度傳感器添加這一句
ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);//通道11采樣時(shí)間
//################ Channel 11(電位器)###### 內(nèi)部溫度傳感器改為 Channel 16 ###################
ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 2, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
顯示和轉(zhuǎn)換公式如下
u16 GetVolt(u16 advalue)
{
return (u16)(advalue*330/4096);
}
u16 GetTemp(u16 advalue)
{
u32 Vtemp_sensor;
s32 Current_Temp;
Vtemp_sensor=advalue*330/4096;
Current_Temp=(s32)(143-Vtemp_sensor)*10000/43+2500;
return (s16)Current_Temp;
}
初始化ADC,DMA后,循環(huán)讀取AD_Value[2]來獲取計(jì)數(shù)值,進(jìn)而進(jìn)行轉(zhuǎn)換。