MM32F003內(nèi)置溫度傳感器,可以ADC通道讀取溫度傳感器的電壓值管闷,根據(jù)官方提供的計(jì)算公式粥脚,算出當(dāng)前芯片的溫度。
由于芯片的個(gè)體差異包个,讀取的溫度雖是線(xiàn)性的刷允,但是并不準(zhǔn)確冤留。不能將這個(gè)溫度結(jié)果用于溫度測(cè)量,可以用來(lái)衡量溫度的變化程度树灶。
因?yàn)闇囟茸x取是通過(guò)一路ADC通道實(shí)現(xiàn)的纤怒,所以基本配置代碼與普通ADC配置一致,只需要修改到溫度傳感器的讀取通道即可天通。
1 配置ADC通道
int main(void)
{
u16 chan, averagenumber = 0;
Uart_ConfigInit(9600);
// SystemInit();
// InitSystick();
//Initialize DMA
DMAInit();
ADCSingleChannelInit(ADCchTemp);
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Start Conversion
while(1) {
if(ADCFilterflag) { //Determine whether the second-order filter is over
ADCFilterflag = 0; //Clear the filter end flag
Get_Temperature(); //Convert the filtered value to voltage
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Start Conversion
}
}
}
2 將ADC值轉(zhuǎn)換成溫度值
#define M8(adr) (*((vu8 *) (adr)))
#define M16(adr) (*((vu16 *) (adr)))
#define M32(adr) (*((vu32 *) (adr)))
void Get_Temperature(void)
{
float slTemp, slTempsave;
if((ADCFilterValue < 1024) || (ADCFilterValue > 2048)) {
ADCFilterValue = 1237;
}
slTemp = ADCFilterValue;
slTempsave = (int32_t)(0x0fff & (M16(0x1FFFF7F6)));
ADCTempValue = (slTemp - slTempsave ) * 0.0143 + 27;
UartSendGroup((u8*)printBuf, sprintf(printBuf, "adc value = 0x%4X \r\n",ADCFilterValue));
UartSendGroup((u8*)printBuf, sprintf(printBuf, "temperature = %f \r\n",ADCTempValue));
}
計(jì)算方法詳情參考用戶(hù)手冊(cè)和規(guī)格書(shū)泊窘。
用戶(hù)手冊(cè)
規(guī)格書(shū)