MF52 珠状测温型 NTC 热敏电阻器数据手册如下:
链接:https://pan.baidu.com/s/1OL1ZtPuQqsUY4TKvp6j1ug
提取码:dxct
--来自百度网盘超级会员V2的分享
程序功能:
1.上电后,数码管显示PCB温度。
ADC介绍
详情介绍见STM32数据手册,上一篇介绍看门狗的文章里面有分享。
简介:
逐次逼近型ADC功能图:


DMA

! 详情可去b站搜索江协科技的STM32教程,里面的ADC和DMA章节非常详细 。
实例
NTC硬件电路:
初始化:
ADC1(通道13)参数配置:
ADC1DMA请求配置:
温度转换表:
制作方法:对照MF52 珠状测温型 NTC 热敏电阻器数据手册的温度特性表在excel中制作。
转换电压的关系:0~3.3V对应采集模拟值0~4095,关系为:实际电压=(ADC采集值*3.3)/4095
程序代码:
NTC结构体类型:
//定义结构体类型
typedef struct
{
void (*Get_NTC_Voltage)(void); //获取温度电压
uint16_t usADC_Value; //获取采集值
float fNTC_Voltage; //NTC电压
void (*Get_Temperature_Value)(void); //获取温度
float fTemperature; //温度值
} NTC_t;
获取温度函数:
/*
* @name Get_Temperature_Value
* @brief 获取温度值
* @param None
* @retval None
*/
static void Get_Temperature_Value()
{
uint8_t Temp;
临界温度处理
if(NTC.usADC_Value < 589) //最高70°C
{
NTC.usADC_Value = 589;
printf("Temperature is higher than 70¡æ\r\n");
}
if(NTC.usADC_Value > 3867) //最低-30°C
{
NTC.usADC_Value = 3867;
printf("Temperature is below -30¡æ\r\n");
}
//二分法查数组
if(NTC.usADC_Value > NTC_Table[50][1])
{
//查询0~49, 对应-30°C到19°C
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°C到70°C
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; //对应20°C
}
//计算温度
NTC.fTemperature = (float)Temp - 30;
printf("Temperature is :%.1f¡æ\r\n\r\n",NTC.fTemperature);
}
System.h里的系统运行函数:
/*
* @name Run
* @brief 运行函数
* @param None
* @retval None
*/
static void Run()
{
float Temp = 0;
//获取电压
NTC.Get_NTC_Voltage();
//获取温度
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); //间隔1秒显示温度
}
MyInit.h里的初始化函数:
/*
* @name Peripheral_Set
* @brief 外设设置
* @param None
* @retval None
*/
static void Peripheral_Set()
{
Display.TM1620_Init(); //ÊýÂë¹Ü³õʼ»¯
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&NTC.usADC_Value,(uint32_t)1); //开启ADC1的DMA输出
HAL_Delay(1); //延时,等待初始化稳定
}
补充:另外还做了DAC配合DMA输出1KHZ的正弦波操作,没有细讲,这里简单说说思路:
初始化:使用定时器输出频率,DAC配置中开启定时器事件中断输出,并配置DMA请求。
代码部分:在网上查找模拟值对应的电压,尽可能多,用作采集点,本项目选择了32个采集点,建立一个数组将其存入其中,开启DAC的DMA输出,输出值为数组元素值,DAC会自动转换输出电压值,将DAC输出端口连接到示波器,就会出现一个1KHZ的正弦波。