STM32F4 ADC之內(nèi)部溫度傳感器
測量芯片周圍的環(huán)境溫度用。這個溫度傳感器輸出的電壓與溫度成一定比例,獲取溫度基本就是用ADC測量這個電壓。
在芯片內(nèi)部,溫度傳感器與ADC1的CH16相連。當不使用改傳感器時,可將其設(shè)置為PowerDown模式以省電。
主要特性:
測溫范圍:-45~+125攝氏度
測溫精度:±1.5攝氏度
使用步驟:
1、選擇ADC1 CH16作為ADC的輸入
2、設(shè)置采樣時間
3、設(shè)置ADC1寄存器ADC_CCR的TSVREFE位,將溫度傳感器從PowerDown模式喚醒。
4、開始ADC轉(zhuǎn)換
5、讀取轉(zhuǎn)換值Value并換算成電壓Vsense,Vsense = Value×3300/4096 (mV)
6、計算溫度。
溫度計算公式:Temp = ((Vsense - V25)/Avg_Slope)+25
V25是Vsense 在25度時候的值,Avg_Slope 是溫度轉(zhuǎn)換率。這兩個值可在datasheet里邊查到。
V25 = 0.76V Avg_Slope = 2.5 mV/°C
Temp = (Vsense– 760)/2500 + 25;
【代碼實現(xiàn)】
首先,喚醒溫度傳感器:
ADC_TempSensorVrefintCmd(ENABLE);
將上一程序的4通道,改為16通道:
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,4,ADC_SampleTime_144Cycles);
讀取這個轉(zhuǎn)換的值,用上邊公式計算即可:
aa = adcvalue[i]-760;
printf("當前溫度是: %f攝氏度rn",(aa)/2.5+25);
printf("%drn",adcvalue[i]);
這里要注意數(shù)據(jù)類型,adcvalue定義的是uint16_t的,是無符號數(shù)。
這里能讀出溫度了,但是還有點問題:溫度不準,夜里讀出的溫度竟然有68度,我乖乖還活不了。不知道是片子工作久了內(nèi)部溫度高還是我的計算有錯誤。
但是這個溫度確實是隨著溫度的變化而變化的,板子斷電一會溫度就下降了,但還是不準