栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

炒冷饭系列-STM32F103之CPU温度测量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

炒冷饭系列-STM32F103之CPU温度测量

注意:1、ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
2、ADC读出来的是电压值,要按公式来转换T(℃) ={(V25-Vsense) /Avg_Slope}+25
V25=Vsense 在 25 度时的数值(典型值为: 1.43)。
Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为
4.3Mv/℃)。
temp=((1.43-temp)/0.0043)+25;//uv
temp=temp*100;//100倍变为mv

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "rtc.h"
#include "adc.h"
#include "tlc549.h"

void myCpuTemInit(void);
u16 myCpuTemHandler(u8 ch);
u16 Cpu_tem(u8 ch,u8 time);

 int main(void)
 {	
	 
	u16 cpu_val=0;
	 float temp=0;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();
	LCD_Init();
	 
	 myCpuTemInit();
	 
	LCD_ShowString(30,140,200,16,16,"TEMPERATE: 00.00C");	 
  while(1) 
	{		
		
		cpu_val=Cpu_tem(ADC_Channel_16,10);//通道16,计算次数10
		//LCD_ShowxNum(156,130,cpu_val,3,16,0);//寄存器的值只有8位,2^8=255最大值为3位
		
		temp=cpu_val*(float)(3.3)/4095;//检测到的电压值
		temp=((1.43-temp)/0.0043)+25;//4.3mv=0.0043V
		temp=temp*100;//为了方便显示
		//LCD_ShowxNum(156,130,temp,6,16,0);//寄存器的值只有8位,2^8=255最大值为3位
		
		LCD_ShowxNum(30+11*8,140,temp/100,2,16,0);		//显示整数部分
		LCD_ShowxNum(30+14*8,140,((u16)temp)%100,2,16, 0x80);	//显示小数部分
		LED0=!LED0;
		delay_ms(250);

	} 
}
 


// ADC1 的通道 1(PA1)来读取外部电压值显示在TFT上面 

void myCpuTemInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStruct;
	
	//1) 开启 PA 口时钟和 ADC1 时钟,设置 PA1 为模拟输入。
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC时钟

	//2) 复位 ADC1,同时设置 ADC1 分频因子
	ADC_DeInit(ADC1);
	//ADC最大转换频率为1MHz,对应的最大转换时间就是1us
	// ADC 的转换时间公式=Tcovn=采样时间+12.5个周期
	// ADCCLK=14Mhz 的时候,设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周
	//期=1us。
	//APB2对应的时钟频率是72MHz,分频因子要确保 ADC1 的时钟(ADCCLK)不超过14Mhz。
	//6分频之后72/6=12Mhz,所以ADC的频率是12Mhz
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	//3) 初始化 ADC1 参数, 设置 ADC1 的工作模式以及规则序列的相关信息。
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//ADC 工作模式:独立模式
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;//AD 单通道模式
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//AD 单次转换模式
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//ADC 数据右对齐ADC_DataAlign_Right,左对齐会咋样?ADC_DataAlign_Left
	ADC_InitStruct.ADC_NbrOfChannel=1;//顺序进行规则转换的 ADC 通道的数目 1
	ADC_Init(ADC1, &ADC_InitStruct);
	
	ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
	
	//4) 使能 ADC 并校准。
	//执行复位校准和 AD 校准,注意这两步是必须的!不校准将导致结果很不准确。
	ADC_Cmd(ADC1,ENABLE);//使能 ADC
	ADC_ResetCalibration(ADC1);//复位校准
	ADC_StartCalibration(ADC1);//AD 校准
	
	//记住,每次进行校准之后要等待校准结束。 这里是通过获取校准状态来判断是否校准是否结束
	//一旦校准结束, CAL位被硬件复位   校准状态复位完成的返回值是0,
	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准完成	为0时退出while
	while(ADC_GetCalibrationStatus(ADC1));//等待AD 校准完成

	//LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");//ADC采样值
	//LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");	 //电压值
}
 
//返回 ADC 值
//ch:通道值 0~3
u16 myCpuTemHandler(u8 ch)
{
	//5) 设置规则通道1的参数
	//ADC1的通道1,Rank:规则顺序中的第一个转换1,ADC_SampleTime:采样周期
	ADC_RegularChannelConfig(ADC1, ch, 1,ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的 ADC1 的软件转换启动功能
	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
	return ADC_GetConversionValue(ADC1);//获取转换 ADC 转换结果数据,16位里面含有12位,右对齐,高位对齐
}

//return: ADC平均值
//ch:通道16,  time:采集次数
u16 Cpu_tem(u8 ch,u8 time)
{
	u8 i=0;
	u16 adc_value=0;
	for(i=0;i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311797.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号