cortex_m3_stm32嵌入式学习笔记(十七):内部温度传感器(ADC采集)

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

效果确实不咋地。。大冬天的测出来是20多度。。

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/℃)。

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

上一节的ADC是读取外部通道的值,而内部温度传感器相当与把通道端口连接在内部温度传感器上。

配置ADC和上一节大体类似,只不过不用初始化外部IO,但要增加一句开启内部温度传感器的语句。

temperate.c

#include "temperate.h"
void T_Adc_Init(void)
{
	ADC_InitTypeDef ADC_ist;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE );
	//72M/6=12,ADC 最大时间不能超过 14M
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置 ADC分频因子6
	ADC_DeInit(ADC1);//复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值

	ADC_ist.ADC_Mode= ADC_Mode_Independent;//ADC 独立模式
	ADC_ist.ADC_ScanConvMode=DISABLE;//单通道模式
	ADC_ist.ADC_ContinuousConvMode=DISABLE;//单次转换模式
	//转换由软件而不是外部触发启动
	ADC_ist.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_ist.ADC_DataAlign=ADC_DataAlign_Right;//ADC 数据右对齐
	ADC_ist.ADC_NbrOfChannel=1;//顺序进行规则转换的 ADC 通道的数目
	ADC_Init(ADC1,&ADC_ist);

	ADC_TempSensorVrefintCmd(ENABLE);  //开启内部温度传感器
	ADC_Cmd(ADC1,ENABLE);//使能指定的 ADC1
	ADC_ResetCalibration(ADC1);//开启复位校准
	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
	ADC_StartCalibration(ADC1);//开启 AD 校准
	while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}
//获得 ADC 值
//ch:通道值 0~3
u16 T_Get_Adc(u8 ch)
{
	//设置指定 ADC 的规则组通道设置它们的转化顺序和采样时间
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的 ADC1 的软件转换功能
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
	return ADC_GetConversionValue(ADC1);//返回最近一次 ADC1 规则组的转换结果
}
u16 T_Get_Temp(void)
{
	u16 temp_val=0;u8 i;
	for(i=0;i<10;i++)
	{
		temp_val+=T_Get_Adc(ADC_Channel_16);
		delay_ms(5);
	}
	return temp_val/10;
}
u16 T_Get_Adc_Average(u8 ch,u8 times)
{
	u32 tem_val=0;
	u8 i;
	for(i=0;i<times;i++)
	{
		tem_val+=T_Get_Adc(ch);
		delay_ms(5);
	}
	return tem_val/times;
}

temperate.h

#ifndef _TEMP_H
#define _TEMP_H
#include "sys.h"
#include "delay.h"

#define ADC_CH_TEMP  	ADC_Channel_16 //温度传感器通道
void T_Adc_Init(void);
u16 T_Get_Adc(u8 ch);
u16 T_Get_Temp(void);
u16 T_Get_Adc_Average(u8 ch,u8 times);
#endif

主函数是在上一节的基础上修改的。。

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "temperate.h"
void init()
{
	delay_init();	    	 //延时函数初始化
	uart_init(9600);	 	//串口初始化为9600
	LED_Init();		  		//初始化与LED连接的硬件接口
 	LCD_Init();
	T_Adc_Init();
	POINT_COLOR=RED;//设置字体为红色
	LCD_ShowString(60,40,200,24,24,"ADC Test ^-^");
	LCD_ShowString(60,70,200,16,16,"Medium difficulty");
	LCD_ShowString(60,90,200,16,16,"2015/1/25");
	LCD_ShowString(60,110,200,16,16,"By--Mr yh");
	//显示提示信息
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(60,130,200,16,16,"TEMP_VAL:");
	LCD_ShowString(60,150,200,16,16,"TEMP_VOL:0.000V");
	LCD_ShowString(60,170,200,16,16,"TEMPERATE:00.00C");
}
int main(void)
{
	u16 adcnum;
	float tem,temperate;
	init();
	while(1)
	{
		adcnum=T_Get_Adc_Average(ADC_CH_TEMP,10);
		LCD_ShowxNum(132,130,adcnum,4,16,0);//显示ADC的值
		tem=(float)adcnum*(3.3/4096);
		temperate=tem;
		adcnum=tem;
		LCD_ShowxNum(132,150,adcnum,1,16,0);//显示电压值的整数位
		tem-=(u8)tem;
		LCD_ShowxNum(148,150,(u32)(tem*1000),3,16,0X80);//显示电压值的小数位
		temperate=(1.43-temperate)/0.0043+25;		//计算出当前温度值
		LCD_ShowxNum(140,170,(u8)temperate,2,16,0); //显示温度整数部分
		temperate-=(u8)temperate;
		LCD_ShowxNum(164,170,temperate*100,2,16,0X80);//显示温度小数部分
		LED0=!LED0;
		delay_ms(250);
	}
}
时间: 2024-10-07 09:45:58

cortex_m3_stm32嵌入式学习笔记(十七):内部温度传感器(ADC采集)的相关文章

cortex_m3_stm32嵌入式学习笔记(十六):ADC实验(模数转换)

之前没学过数模电,对A/D D/A转换一窍不通,也百度了很多资料大都深奥难懂..算了,先自以为是一下吧,等以后学了专业课再说..(寒假回家一定要学..恩 就这么决定了)看了那么多资料,感觉 A/D转换就是将电压(或者是其他模拟量:如 压力,图像等)转换为数字,D/A就是反过来,而ADC就是A/D转换器,他可以采集外部电压转化为数字.本节实验通过ADC采集外部电压转换为数字显示在屏幕上. STM32 拥有 1~3 个 ADC( STM32F101/102 系列只有 1 个 ADC),这些 ADC

cortex_m3_stm32嵌入式学习笔记(十九):DMA实验(高速传输)

DMA,全称为: Direct Memory Access,即直接存储器访问. DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高. 即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU. 一个完整的DMA传输过程必须经过下面的4个步骤. 1.DMA请求 CPU对DMA控制器初始化,并向I/O接

cortex_m3_stm32嵌入式学习笔记(十八):DAC实验(数模转换)

STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC. DAC可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用. DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐. DAC 模块有 2 个输出通道,每个通道都有单独的转换器.在双 DAC 模式下, 2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出. 本节实验,我们将利用按键(或 USMART) 控制 STM32 内部 DAC1来输出电压,通过 A

cortex_m3_stm32嵌入式学习笔记(八):定时器中断实验

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器. 本节学习通用定时器 TIM3 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等. STM3 的通用 TIMx (TIM2. TIM3. TIM4 和 TIM5)定时器功能包括: 1)16 位向上.向下.向上/向下自动装载计数器( TIMx_CNT). 2)16 位可

cortex_m3_stm32嵌入式学习笔记(十一):TFTLCD显示(初涉显示器)

本章我们将介绍 ALIENTEK 2.8 寸 TFT LCD 模块,该模块采用 TFTLCD 面板,可以显示 16 位色的真彩图片. TFT-LCD 即薄膜晶体管液晶显示器.其英文全称为: Thin Film Transistor-Liquid CrystalDisplay. TFT-LCD 与无源 TN-LCD. STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管( TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质

cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)

SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola首先在其 MC68HCXX 系列处理器上定义的. SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间. SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信

cortex_m3_stm32嵌入式学习笔记(六):窗口看门狗实验(WWDG)

窗口看门狗( WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障. 简单来说,和IWDG的区别就是IWDG要靠手动去喂狗,而WWDG有内置中断,所以可以利用设置中断服务函数去喂狗 首先还是设置WWDG (记得往工程里面添加头文件)大致设置步骤如下: 1)使能 WWDG 时钟(系统内部时钟) 2)设置窗口值和分频数 3)开启 WWDG 中断并分组 4) 设置计数器初始值并使能看门狗 5) 编写中断服务函数 wwdg.c #include "led

cortex_m3_stm32嵌入式学习笔记(七):独立看门狗&amp;窗口看门狗

总结一下这两种狗吧... 1)独立看门狗没有中断,窗口看门狗有中断 2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制 3)独立看门狗只有下限,窗口看门狗又下限和上限 4)独立看门狗是12位递减的.窗口看门狗是7位递减的 5)独立看门狗是用的内部的大约40KHZ RC振荡器(不受系统时钟限制,即使系统时钟坏了也能工作),窗口看门狗是用的系统时钟APB1ENR(系统时钟要是挂了就完了) 独立看门狗Iwdg--独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器.主要用于监视硬件错误.

cortex_m3_stm32嵌入式学习笔记(四):外部中断实验

本章学习将STM32的IO口作为外部中断输入(实现和按键扫描一样的功能) STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处. STM32F103 的中断控制器支持 19 个外部中断/事件请求.每个中断设有状位,每个中断/事件都有独立的触发和屏蔽设置. STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断.(本章只学习这一种) 线 16:连接到 PVD 输出. 线 17:连接到 RTC 闹钟事件. 线 18:连接到 USB