- UID
- 1029342
- 性别
- 男
|
温度传感器可以用来测量器件周围的温度(TA)。
温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。
温度传感器模拟输入推荐采样时间是17.1μs。
当没有被使用时,传感器可以置于关电模式。
注意: 必须设置TSVREFE位激活内部通道:ADCx_IN16(温度传感器)和ADCx_IN17(VREFINT)的转换。
主要特征
● 支持的温度范围:-40到125度
● 精确度:+/- 1.5° C
读温度
为使用传感器:
1. 选择ADCx_IN16输入通道
2. 选择采样时间大于2.2 μs
3. 设置ADC控制寄存器2(ADC_CR2)的TSVREFE位,以唤醒关电模式下的温度传感器
4. 通过设置ADON位启动ADC转换(或用外部触发)
5. 读ADC数据寄存器上的VSENSE 数据结果
6. 利用下列公式得出温度
温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
这里:
V25 = VSENSE
在25°C时的数值
Avg_Slope = 温度与VSENSE曲线的平均斜率(单位为mV/° C 或 μV/ °C)
参考电气特性章节中V25 和Avg_Slope的实际值。
注意: 传感器从关电模式唤醒后到可以输出正确水平的VSENSE前,有一个建立时间。ADC在上电后也
有一个建立时间,为了缩短延时,应该同时设置ADON和TSVREFE位。
以下部分来自wolaiye945的博客:
首先将数据进行比例转化,可以使用微软系统自带的计算器,根据参考电压3.3V在12位AD转换对应最大值0xFFF可知,1.42V对应0x6E2(1762D),而斜率每摄氏度4.35mV对应每摄氏度0x05,故此时公式可以修正为:温度(°C)= {(0x6E2- VSENSE) / 5} + 25
综上所述,芯片的温度已经可以通过计算存入变量,在经过相应的位处理就可以显示在LCD上。
本人使用的代码仅供参考,如下:
//变量声明部分略去
mytemp = (0x6E2- ADC_ConvertedValue_Bak) / 0x05 + 25;
for(v2=3;v2;v2--)
{
v1=mytemp;
mytemp/=10;
LCD_DrawChar(3,(v2-1)<<3,HexValueOffset[v1]);
}
最后,还需要提示一下,在使用的时候不要忘记唤醒温度传感器(默认处于休眠状态),也就是需要设置ADC控制寄存器2(ADC_CR2)的TSVREFE位为1,否则会得到一个几乎为零的极小AD值,通过公式得到一个远远超出范围的温度值,显然是错误的。
给控制寄存器置位可以使用直接置位的方法,但为了增强程序的模块化程度,我建议使用STM32预定义的函数ADC_TempSensorVrefintCmd(ENABLE);
在初始化ADC后和开始转换前的代码段中调用该函数,即可唤醒温度传感器的检测。
以下来自泡桐树
ADC_InitStructure.ADC_Mode =ADC_Mode_Independent; //独立模式 CR1
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //扫描模式使能
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //连续转换模式使能
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //启动转换的外部事件--无 CR2
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //转换后的数据右对齐
ADC_InitStructure.ADC_NbrOfChannel =2; //转换的通道数为2
ADC_Init(ADC1,&ADC_InitStructure);
//内部温度传感器 添加这一句
ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11,1,ADC_SampleTime_55Cycles5); //通道11采样时间
//################Channel 11(电位器)###### 内部温度传感器改为 Channel 16###################
ADC_RegularChannelConfig(ADC1, ADC_Channel_16,2, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
显示和转换公式如下
u16 GetVolt(u16 advalue)
{
return(u16)(advalue*330/4096);
}
u16 GetTemp(u16 advalue)
{
u32 Vtemp_sensor;
s32 Current_Temp;
Vtemp_sensor=advalue*330/4096;
Current_Temp=(s32)(143-Vtemp_sensor)*10000/43+2500;
return(s16)Current_Temp;
}
初始化ADC,DMA后,循环读取AD_Value[2]来获取计数值,进而进行转换。 |
|