STM32实战-ADC采集显示

程序实现功能:

1、上电后,数码管数码PCB板温度;

2、串口间隔1s打印温度信息。


 

目录

1.硬件电路

2.技术讲解 

2.1ADC介绍 

2.2特性 

2.3框图 

2.4NTC温度数据表 

 3.HAL库函数

 4.软件编程

4.1参数配置 

 4.2运行函数

 4.3NTC函数

4.3.1结构体封装

4.3.2NTC电压数值获取

 4.3.3温度获取



1.硬件电路

STM32实战-ADC采集显示_第1张图片 

 

 利用温度传感器常温状态 阻值为10k,设计分压电路,通过ADC采集电压,用公式计算出模拟量对应数值 通过温度表显示相应温度。

2.技术讲解 

2.1ADC介绍 

12 位 ADC 是一种逐次逼近型模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。

2.2特性 

● 12-位分辨率
● 转换结束,注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道 0 到通道 n 的自动扫描模式
● 自校准
● 带内嵌数据一致的数据对齐
● 通道之间采样间隔可编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带 2 个 ADC 的器件)
● ADC 转换时间:
- STM32F103xx 增强型产品: ADC 时钟为 56MHz 时为 1μs(ADC 时钟为
72MHz 为 1.17μs)
- STM32F101xx 基本型产品: ADC 时钟为 28MHz 时为 1μs(ADC 时钟为
36MHz 为 1.55μs)
● ADC 供电要求: 2.4V 到 3.6V
● ADC 输入范围: VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有 DMA 请求产生。
 

2.3框图 

 STM32实战-ADC采集显示_第2张图片

 

2.4NTC温度数据表
 

STM32实战-ADC采集显示_第3张图片

 3.HAL库函数

STM32实战-ADC采集显示_第4张图片

 4.软件编程

4.1参数配置 

 STM32实战-ADC采集显示_第5张图片

 4.2运行函数

static void Run()
{
	float Temp = 0;
	
	//获取温度
	NTC.Get_Temperature_Value();
	
	//显示温度
	if(NTC.fTemperature < 0) //负温
	{
		Temp = 0 - NTC.fTemperature;
		Display.Disp_Other(Disp_NUM_3,0x40,Disp_DP_OFF); //3号数码管显示负数
	}
	else                     //正温
	{
		Temp = NTC.fTemperature;
		Display.Disp_Other(Disp_NUM_3,0x00,Disp_DP_OFF); //3号数码管显示正数
	}
	
	Display.Disp_HEX(Disp_NUM_1,(uint8_t)Temp%10,Disp_DP_OFF);//显示个位
	Display.Disp_HEX(Disp_NUM_2,(uint8_t)Temp/10,Disp_DP_OFF);//显示十位
	
	HAL_Delay(1000); //延时
}

 4.3NTC函数

4.3.1结构体封装

//结构体类型
typedef struct
{
	void (*Get_NTC_Voltage)(void);           //获取温度电压
	uint16_t usADC_Value;                    //ADC采集值
	float fNTC_Voltage;                      //NTC电压
	
	void (*Get_Temperature_Value)(void);     //获取温度值
	float fTemperature;                      //温度值
} NTC_t;

/* extern variables-----------------------------------------------------------*/
extern NTC_t  NTC;

4.3.2NTC电压数值获取

static void Get_NTC_Voltage() 
{	
	HAL_ADC_Start(&hadc1);	
	if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
	{
		NTC.usADC_Value    = HAL_ADC_GetValue(&hadc1);
		NTC.fNTC_Voltage   = (NTC.usADC_Value*3.3)/4095;
		
		printf("AD转换原始值 = %d\r\n",NTC.usADC_Value);
	  printf("计算得出的电压值 = %.2fV\r\n",NTC.fNTC_Voltage);
	}
	else
	{
		printf("AD转换失败!!!\r\n");
	}	
}

 4.3.3温度获取

static void Get_Temperature_Value() 
{	
	uint8_t Temp;
	
	NTC.Get_NTC_Voltage(); //获取ADC采集值与NTC电压
	
	ÁÙ½çζȴ¦Àí
	if(NTC.usADC_Value < 589) //最高设置上限70度
	{
		NTC.usADC_Value = 589;
		
	  printf("Temperature is higher than 70¡æ\r\n");
	}
	
	if(NTC.usADC_Value > 3867) //最低-30度
	{
		NTC.usADC_Value = 3867;
		
		printf("Temperature is below -30¡æ\r\n");
	}
	
	//二分法查表
	if(NTC.usADC_Value > NTC_Table[50][1])
	{
		//查询0-49对应-30到19摄氏度
		for(Temp=0;Temp<=49;Temp++)
		{
			if((NTC.usADC_Value >= NTC_Table[Temp][0]) && (NTC.usADC_Value <= NTC_Table[Temp][1]))
				break;
		}
	}
	else if(NTC.usADC_Value < NTC_Table[50][0])
	{
		//查询51-100 对应21至70摄氏度
		for(Temp=51;Temp<=100;Temp++)
		{
			if((NTC.usADC_Value >= NTC_Table[Temp][0]) && (NTC.usADC_Value <= NTC_Table[Temp][1]))
				break;
		}
	}
	else
	{
		Temp = 50;
	}
	
	//计算温度
	NTC.fTemperature = (float)Temp - 30;	
	printf("Temperature is :%.1f¡æ\r\n\r\n",NTC.fTemperature);
}

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)