STM32 实验14 内部温度传感器实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 校准