- ?STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。
- 该温度传感器在内部和ADCX_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。
- 温度传感器模拟输入推荐采样时间是17.1us。
- STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为土1.5℃左右。
- 内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝度温度,应该使用一个外部温度传感器。
?开启内部温度传感器步骤:
- 选择ADC_IN16输入通道。
- 设置采样时间大于17.1us
- 设置ADC_CR2的TSVREFE位,打开内部温度传感器4设置ADON位启动转换
- 读取ADC结果
- 计算。
?主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "tsensor.h"
int main(void)
{
short temp;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
LCD_Init();
T_Adc_Init();
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"WarShip STM32");
LCD_ShowString(30,70,200,16,16,"Temperature TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2015/1/14");
POINT_COLOR=BLUE;
LCD_ShowString(30,140,200,16,16,"TEMPERATE: 00.00C");
while(1)
{
temp=Get_Temprate();
if(temp<0)
{
temp=-temp;
LCD_ShowString(30+10*8,140,16,16,16,"-");
}else LCD_ShowString(30+10*8,140,16,16,16," ");
LCD_ShowxNum(30+11*8,140,temp/100,2,16,0);
LCD_ShowxNum(30+14*8,140,temp%100,2,16, 0X80);
LED0=!LED0;
delay_ms(250);
}
}
传感器函数
#include "tsensor.h"
#include "delay.h"
#include "sys.h"
void T_Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 T_Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
u16 T_Get_Temp(void)
{
u16 temp_val=0;
u8 t;
for(t=0;t<10;t++)
{
temp_val+=T_Get_Adc(ADC_Channel_16);
delay_ms(5);
}
return temp_val/10;
}
u16 T_Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=T_Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
short Get_Temprate(void)
{
u32 adcx;
short result;
double temperate;
adcx=T_Get_Adc_Average(ADC_Channel_16,20);
temperate=(float)adcx*(3.3/4096);
temperate=(1.43-temperate)/0.0043+25;
result=temperate*=100;
return result;
}
?
|