STM32 实验14 内部温度传感器实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

217

3.14内部温度传感器实验

这一节我们将向大家介绍STM32的内部温度传感器。本节将利用STM32的内部温度传感器来显示温度值,并在TFTLCD 模块上显示出来。本节分为如下几个部分:

3.1

4.1 STM32 内部温度传感器简介

3.1

4.2 硬件设计

3.1

4.3 软件设计

3.1

4.4 下载与测试

218

3.1

4.1 STM32 内部温度传感器简介

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

STM32内部温度传感器的使用很简单,只要设置一下内部ADC ,并激活其内部通道就差不多了。关于ADC 的设置,我们在上一节已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的2个地方。

第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC 的内部通道,这里通过ADC_CR2的AWDEN 位(bit23)设置。设置该位为1则启用内部温度传感器。

第二个地方,STM32的内部温度传感器固定的连接在ADC 的通道16上,所以,我们在设置好ADC 之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:

T (℃)={(V25-Vsense )/Avg_Slope}+25

该式中:

V25=Vsense 在25度时的数值(典型值为:1.43)。

Avg_Slope=温度与Vsense 曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为

4.3Mv/℃)。

利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。

现在,我们就可以总结一下STM32内部温度传感器使用的步骤了,如下:

设置ADC ,并开启ADC_CR2的AWDEN 位。

关于如何设置ADC ,上一节已经介绍了,我们采用与上一节一样的设置,这里我们只要增加使能AWDEN 位这一句就可以了。

读取通道16的AD 值,计算结果。

在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温度值了。

3.1

4.2 硬件设计

这部分硬件只需要1个TFTLCD 模块,其他的就不需要了。TFTLCD 的连接在前面已经介绍过了,这里就不再介绍了。

3.1

4.3 软件设计

打开上一节的工程,打开adc.c ,修改Adc_Init 函数代码如下:

void Adc_Init(void)

{

//先初始化IO 口

RCC->APB2ENR|=1<<2; //使能PORTA 口时钟

GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog 输入

219

//通道10/11设置

RCC->APB2ENR|=1<<9; //ADC1时钟使能

RCC->APB2RSTR|=1<<9; //ADC1复位

RCC->APB2RSTR&=~(1<<9);//复位结束

RCC->CFGR&=~(3<<14); //分频因子清零

//SYSCLK/DIV2=12M ADC 时钟设置为12M,ADC 最大时钟不能超过14M!

//否则将导致ADC 准确度下降!

RCC->CFGR|=2<<14;

ADC1->CR1&=0XF0FFFF; //工作模式清零

ADC1->CR1|=0<<16; //独立工作模式

ADC1->CR1&=~(1<<8); //非扫描模式

ADC1->CR2&=~(1<<1); //单次转换模式

ADC1->CR2&=~(7<<17);

ADC1->CR2|=7<<17; //软件控制转换

ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发

ADC1->CR2&=~(1<<11); //右对齐

ADC1->CR2|=1<<23; //使能温度传感器

ADC1->SQR1&=~(0XF<<20);

ADC1->SQR1&=0<<20; //1个转换在规则序列中 也就是只转换规则序列1

//设置通道0~3的采样时间

ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采样时间清空

ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采样时间可以提高精确度

ADC1->SMPR2|=7<<6; //通道2 239.5周期,提高采样时间可以提高精确度

ADC1->SMPR2|=7<<3; //通道1 239.5周期,提高采样时间可以提高精确度

ADC1->SMPR2|=7<<0; //通道0 239.5周期,提高采样时间可以提高精确度

ADC1->SMPR1&=~(7<<18); //清除通道16原来的设置

ADC1->SMPR1|=7<<18; //通道16 239.5周期,提高采样时间可以提高精确度

ADC1->CR2|=1<<0; //开启AD 转换器

ADC1->CR2|=1<<3; //使能复位校准

while(ADC1->CR2&1<<3); //等待校准结束

//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。

ADC1->CR2|=1<<2; //开启AD 校准

相关文档
最新文档