打印
[STM32F0]

STM32基础篇——LCD内部温度传感器试验

[复制链接]
4806|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aizaixiyuanqian|  楼主 | 2018-1-23 12:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本次试验我们将向大家介绍 STM32 的内部温度传感器。 将利用STM32 的内部温度传感器来读取温度值,并在 TFTLCD 模块上显示出来。 本次试验目标:
1. 学会内部温度传感器的操作

沙发
aizaixiyuanqian|  楼主 | 2018-1-23 12:18 | 只看该作者
内部温度传感器 简介
STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器在内部和 ADCx_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推荐采样时间是 17.1μ s。 STM32 的内部温度传感器支持的温度范围为:-40~125 度。精度比较差,为±1.5℃左右。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-1-23 12:19 | 只看该作者
      STM32 内部温度传感器的使用很简单,只要设置一下内部 ADC,并激活其内部通道就差不多了。关于 ADC 的设置,我们在前面已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的 2 个地方。
      第一个地方,我们要使用 STM32 的内部温度传感器,必须先激活 ADC 的内部通道,这里通过 ADC_CR2 的 AWDEN 位( bit23)设置。设置该位为 1 则启用内部温度传感器。
      第二个地方, STM32 的内部温度传感器固定的连接在 ADC 的通道 16 上,所以,我们在设置好 ADC 之后只要读取通道 16 的值,就是温度传感器返回来的电压值了。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-1-23 12:20 | 只看该作者
根据这个值,我们就可以计算出当前温度。计算公式如下:
T(℃) ={( V25-Vsense) /Avg_Slope}+25
上式中:
V25=Vsense 在 25 度时的数值(典型值为: 1.43)。
Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为4.3Mv/℃)。
利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-1-23 12:33 | 只看该作者
因为温度传感器使用的是 STM32 内部的 ADC,所以呢,温度传感器的设置 跟 ADC 的设置是一样的,只是一个是读取外部的电压信号,一个是读取内部的 电压信号。只是开启通道的时候,开启的温度传感器的通道,同时要打开温度传 感器的使能。

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-1-23 12:34 | 只看该作者
初始化代码为:
void adc_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大 14M 设置 ADC 时钟(ADCCLK)ADC_DeInit(ADC1);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;  //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
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 的规则组通道,设置它们的转化顺序和采样时间
//  ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
//内部温度传感器是在 ADC1 通道 16 的。
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
ADC_TempSensorVrefintCmd(ENABLE);//打开内部温度传感器使能
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取 ADC 重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的 ADC 的软件转换启动功能
}

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-1-23 12:36 | 只看该作者
我们从 AD 读取出来的是 AD 值,那么我们如何将它转换为温度值呢? 转换温度的公式为:温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25。这里 V25 = VSENSE 在 25°C 时的数值(典型值为:1.43) ,Avg_Slope = 温度 与 VSENSE 曲线的平均斜率(单位为mV/ °C 或 μ V/ °C) (典型值为:4.3Mv/℃) 。一般这两个值是参考数据手册的电气特性。而 VSENSE 是指当 前读取到的电压值。

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-1-23 12:39 | 只看该作者
int main()
{
u32 value;
float ad;
u8 i,j,dat[7];
adc_init();  //ADC 配置内部温度初始化
LED_Init();  //端口初始化
TFT_Init();  //TFT 彩屏初始化
printf_init();  //printf 初始化
TFT_ClearScreen(BLACK);  //清屏
GUI_Show12ASCII(10,10,"This is a ADC1-Channel16-Temp Check!",YELLOW,BLACK);
GUI_Show12ASCII(10,100,"The Temp Value is:",YELLOW,BLACK);
while(1)
{
value=0;
if(j>1)
{
j=0;
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
else
{
j++;
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
delay_ms(100);  //LED 闪烁
for(i=0;i<50;i++)  //读取 50 此 AD 检测速度后求其平均值
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
value=value+ADC_GetConversionValue(ADC1);//返回最近一次 ADCx 规则组的转
换结果
}
value/=50;
ad=(1.43-value*3.3/4096)/0.0043+25;
value=ad*100;
dat[0]=value/1000+0x30;
dat[1]=value%1000/100+0x30;
dat[2]='.';
dat[3]=value%1000%100/10+0x30;
dat[4]=value%1000%100%10+0x30;
dat[5]='C';
dat[6]='\0';
GUI_Show12ASCII(160,100,dat,YELLOW,BLACK);
}
}

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2018-1-23 12:40 | 只看该作者
主程序的效果是,读取到的 AD 值经过转换后位芯片内部温度数据,通过 LCD 彩屏进行显示,并且 LED 指示灯闪烁表示系统正在运行。注意:使用内部温度传感器检测温度是不准确的,误差比较大。因此通常是不采用此传感器进行测温。

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-1-23 12:42 | 只看该作者
这次的试验更加简单,不过以后我们在做有关于STM的项目时对芯片内部的温度的读取时至关重要的,尤其是在恶劣的环境的条件下。这次试验就到这里了,感谢大家支持。

使用特权

评论回复
11
232321122| | 2018-1-23 15:07 | 只看该作者
LCD内部温度?

使用特权

评论回复
12
plsbackup| | 2018-1-23 15:07 | 只看该作者
aizaixiyuanqian 发表于 2018-1-23 12:18
内部温度传感器 简介
STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器在 ...

内部集成的温度传感器起到什么作用?

使用特权

评论回复
13
eefas| | 2018-1-23 15:08 | 只看该作者
aizaixiyuanqian 发表于 2018-1-23 12:20
根据这个值,我们就可以计算出当前温度。计算公式如下:
T(℃) ={( V25-Vsense) /Avg_Slope}+25
上式 ...

这个简单,温度测量方便多了。

使用特权

评论回复
14
232321122| | 2018-1-23 15:09 | 只看该作者
不是使用的DS18B20吗

使用特权

评论回复
15
plsbackup| | 2018-1-23 15:09 | 只看该作者
aizaixiyuanqian 发表于 2018-1-23 12:18
内部温度传感器 简介
STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器在 ...

是不是测试温度,控制风扇的?

使用特权

评论回复
16
eefas| | 2018-1-23 15:09 | 只看该作者
aizaixiyuanqian 发表于 2018-1-23 12:20
根据这个值,我们就可以计算出当前温度。计算公式如下:
T(℃) ={( V25-Vsense) /Avg_Slope}+25
上式 ...

不过有可能收到外部的干扰。

使用特权

评论回复
17
aizaixiyuanqian|  楼主 | 2018-1-24 16:46 | 只看该作者
eefas 发表于 2018-1-23 15:09
不过有可能收到外部的干扰。

的确,不过收到干扰的几率太小了吧、

使用特权

评论回复
18
aizaixiyuanqian|  楼主 | 2018-1-24 16:47 | 只看该作者
plsbackup 发表于 2018-1-23 15:09
是不是测试温度,控制风扇的?

也可以这样来设计。

使用特权

评论回复
19
aizaixiyuanqian|  楼主 | 2018-1-24 16:47 | 只看该作者
232321122 发表于 2018-1-23 15:09
不是使用的DS18B20吗

芯片内部也有温度传感器啊ds18b20是测量环境中的温度。

使用特权

评论回复
20
aizaixiyuanqian|  楼主 | 2018-1-24 16:48 | 只看该作者
eefas 发表于 2018-1-23 15:08
这个简单,温度测量方便多了。

这个是检测32芯片用的,就类似CPU的温度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝