本文主要是介绍STM32(F103ZETX)物联网项目——MF52 珠状测温型 NTC 热敏电阻器(ADC、DMA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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°Cfor(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°Cfor(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的正弦波。
这篇关于STM32(F103ZETX)物联网项目——MF52 珠状测温型 NTC 热敏电阻器(ADC、DMA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!