MM32F003内置温度传感器,可以ADC通道读取温度传感器的电压值,根据官方提供的计算公式,算出当前芯片的温度。
由于芯片的个体差异,读取的温度虽是线性的,但是并不准确。不能将这个温度结果用于温度测量,可以用来衡量温度的变化程度。
因为温度读取是通过一路ADC通道实现的,所以基本配置代码与普通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值转换成温度值
#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));
}
计算方法详情参考用户手册和规格书。