首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 温度传感器 探究

STM32 温度传感器 探究

温度传感器可以用来测量器件周围的温度(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]来获取计数值,进而进行转换。
继承事业,薪火相传
返回列表