STM32有一个内部温度传感器,可度传感器CPU周围的温度(TA)。 特点:
-
,该通道将传感器输出的电压转换为数字值
-
STM支持32的内部温度传感器为:-40~125度。,为±1.5℃左右
-
内部温度传感器更适合,而不是测量绝对温度。如果需要测量绝度温度,应使用外部温度传感器,如DS18B20
我们必须在第一个地方使用它STM必须首先激活32的内部温度传感器ADC的内部通道,这里通过ADC_CR2的TSVREFE位(bit23)设置。将该位置设置为1,启用内部温度传感器。
ADC_TempSensorVrefintCmd(ENABLE); ///打开内部温度传感器
T(℃)={
(V25-Vsense)/Avg_Slope} 25
V25=Vsense值为25度(典型值为:1.43)。 Avg_Slope=温度与Vsense曲线平均斜率(单位为mv/℃或uv/℃)(典型值为4.3Mv/℃)。 利用上述公式,我们可以轻松计算当前温度传感器的温度
void Adc_Init(void) //ADC通道初始化 {
ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能GPIOA,ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟72M/6=12MHz ADC_DeInit(ADC1); //将外设 ADC1 所有寄存器重新设置为缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC在独立模式下工作 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数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; ///按顺序转换规则ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct初始化外设中指定的参数ADCx的寄存器 ADC_TempSensorVrefintCmd(ENABLE); ///打开内部温度传感器
ADC_Cmd
(ADC1
, ENABLE
)
;
//使能指定的ADC1
ADC_ResetCalibration
(ADC1
)
;
//重置指定的ADC1的复位寄存器
while
(
ADC_GetResetCalibrationStatus
(ADC1
)
)
;
//获取ADC1重置校准寄存器的状态,设置状态则等待
ADC_StartCalibration
(ADC1
)
;
//
while
(
ADC_GetCalibrationStatus
(ADC1
)
)
;
//获取指定ADC1的校准程序,设置状态则等待
} u16
Get_Adc
(
)
{
ADC_RegularChannelConfig
(ADC1
, ADC_Channel_16
,
1
, ADC_SampleTime_239Cycles5
)
;
//ADC1,ADC通道16,第一个转换,采样时间为239.5周期
ADC_SoftwareStartConvCmd
(ADC1
, ENABLE
)
;
//使能指定的ADC1的软件转换启动功能
while
(
!
ADC_GetFlagStatus
(ADC1
, ADC_FLAG_EOC
)
)
;
//等待转换结束
return
ADC_GetConversionValue
(ADC1
)
;
//返回最近一次ADC1规则组的转换结果
}
//得到ADC采样内部温度传感器的值
//取10次,然后平均 u16
Get_Temp
(
void
)
{
u16 temp_val
=
0
; u8 t
;
for
(t
=
0
;t
<
10
;t
++
)
{
temp_val
+
=
Get_Adc
(
)
;
//TampSensor
delay_ms
(
5
)
;
}
return temp_val
/
10
;
}
//获取通道ch的转换值
//取times次,然后平均 u16
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
;
}
//得到温度值
//返回值:温度值(扩大了100倍,单位:℃.)
short
Get_Temprate
(
void
)
//获取内部温度传感器温度值
{
u32 adcx
;
short result
;
double temperate
; adcx
=
T_Get_Adc_Average
(ADC_Channel_16
,
20
)
;
//读取通道16,20次取平均 temperate
=
(
float
)adcx
*
(
3.3
/
4096
)
;
//电压值 temperate
=
(
1.43
-temperate
)
/
0.0043
+
25
;
//转换为温度值 采样值转换成温度值
printf
(
"%.2f\n"
,temperate
)
;
return result
;
}
近期本人将更新关于自己所学到的全部ADC知识,敬请关注。 欢迎各位大佬交流