程序实现功能:
1、上电后,数码管数码PCB板温度;
2、串口间隔1s打印温度信息。
目录
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框图
2.4NTC温度数据表
3.HAL库函数
4.软件编程
4.1参数配置
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);
}