STM32系列第19篇--內(nèi)部溫度傳感器
簡介:
STM32有一個(gè)內(nèi)部的溫度傳感器,可以用來測量CPU及周圍的溫度(TA)。
特點(diǎn):
該溫度傳感器在內(nèi)部和ADCx_IN16輸入通道相連接,此通道把傳感器輸出的電壓轉(zhuǎn)換成數(shù)字值
溫度傳感器模擬輸入推薦采樣時(shí)間是17.1μs
STM32的內(nèi)部溫度傳感器支持的溫度范圍為:-40~125度。精度比較差,為±1.5℃左右
內(nèi)部溫度傳感器更適合于檢測溫度的變化,而不是測量絕對溫度。如果需要測量絕度溫度,應(yīng)該使用一個(gè)外部溫度傳感器,如DS18B20
使用注意事項(xiàng):
第一個(gè)地方,我們要使用STM32的內(nèi)部溫度傳感器,必須先激活A(yù)DC的內(nèi)部通道,這里通過ADC_CR2的TSVREFE位(bit23)設(shè)置。設(shè)置該位為1則啟用內(nèi)部溫度傳感器。
等價(jià)于庫函數(shù):
ADC_TempSensorVrefintCmd(ENABLE); //開啟內(nèi)部溫度傳感器
溫度計(jì)算公式:
T(℃)={(V25-Vsense)/Avg_Slope}+25
V25=Vsense在25度時(shí)的數(shù)值(典型值為:1.43)。
Avg_Slope=溫度與Vsense曲線的平均斜率(單位為mv/℃或uv/℃)(典型值為4.3Mv/℃)。
利用以上公式,我們就可以方便的計(jì)算出當(dāng)前溫度傳感器的溫度了
//tsensor.c#include"tsensor.h"#include"delay.h"#include"sys.h"http://初始化ADC//這里我們僅以規(guī)則通道為例//我們默認(rèn)將開啟通道0~3voidT_Adc_Init(void)//ADC通道初始化{ADC_InitTypeDefADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能GPIOA,ADC1通道時(shí)鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分頻因子6時(shí)鐘為72M/6=12MHzADC_DeInit(ADC1);//將外設(shè)ADC1的全部寄存器重設(shè)為缺省值A(chǔ)DC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在獨(dú)立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//模數(shù)轉(zhuǎn)換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動(dòng)ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC數(shù)據(jù)右對齊ADC_InitStructure.ADC_NbrOfChannel=1;//順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC1,&ADC_InitStructure);//根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器ADC_TempSensorVrefintCmd(ENABLE);//開啟內(nèi)部溫度傳感器ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1ADC_ResetCalibration(ADC1);//重置指定的ADC1的復(fù)位寄存器while(ADC_GetResetCalibrationStatus(ADC1));//獲取ADC1重置校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));//獲取指定ADC1的校準(zhǔn)程序,設(shè)置狀態(tài)則等待}u16T_Get_Adc(u8ch){ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道3,第一個(gè)轉(zhuǎn)換,采樣時(shí)間為239.5周期ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的軟件轉(zhuǎn)換啟動(dòng)功能while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束returnADC_GetConversionValue(ADC1);//返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果}//得到ADC采樣內(nèi)部溫度傳感器的值//取10次,然后平均u16T_Get_Temp(void){u16temp_val=0;u8t;for(t=0;t<10;t++){temp_val+=T_Get_Adc(ADC_Channel_16);//TampSensordelay_ms(5);}returntemp_val/10;}//獲取通道ch的轉(zhuǎn)換值//取times次,然后平均u16T_Get_Adc_Average(u8ch,u8times){u32temp_val=0;u8t;for(t=0;t