首页 热敏传感器
文章
取消

热敏传感器

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
   	
 int main(void)
 { 
	u16 adcx,adcx2;
	float temp;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(115200);	 	//串口初始化为9600
  LED_Init();		  		//初始化与LED连接的硬件接口
 	LCD_Init();
 	Adc_Init();		  		//ADC初始化	    
	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(60,50,200,16,16,"Mini STM32");	
	LCD_ShowString(60,70,200,16,16,"ADC TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,110,200,16,16,"2014/3/9");	
	//显示提示信息
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");	      
	LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");	       
	while(1)
	{
		adcx=Get_Adc_Average(ADC_Channel_1,10);
		printf("ADC的值:%d\r\n",adcx);
		temp=(float)adcx*(3.3/4096);
		printf("电压的值:%f\r\n",temp);
		adcx2 = Get_temper(adcx);
		printf("温度:%d\r\n",adcx2);
		LED0=!LED0;
		delay_ms(250);	
		
	}											    
}	

adc.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 #include "adc.h"
 #include "delay.h"
 #include <math.h>
 #define T25 298.15
#define R25 10
#define B	3950
#define NTC_ADC_MAX 200
u16 ADC_NTC[NTC_ADC_MAX] =
{
    2048 ,2043 ,2039 ,2034 ,2030 ,2025 ,2021 ,2016 ,2012 ,2007,  //25-25.9
    2003 ,1998 ,1994 ,1989 ,1985 ,1980 ,1976 ,1971 ,1967 ,1962,  //26-26.9
    1958 ,1953 ,1949 ,1944 ,1940 ,1935 ,1931 ,1926 ,1922 ,1917,  //27-27.9
    1913 ,1909 ,1904 ,1900 ,1895 ,1891 ,1886 ,1882 ,1878 ,1873,  //28-28.9
    1869 ,1864 ,1860 ,1856 ,1851 ,1847 ,1843 ,1838 ,1834 ,1829,  //29-29.9
    1825 ,1821 ,1816 ,1812 ,1808 ,1803 ,1799 ,1795 ,1790 ,1786,  //30-30.9
    1782 ,1778 ,1773 ,1769 ,1765 ,1760 ,1756 ,1752 ,1748 ,1743,  //31-31.9
    1739 ,1735 ,1731 ,1726 ,1722 ,1718 ,1714 ,1710 ,1705 ,1701,  //32-32.9
    1697 ,1693 ,1689 ,1684 ,1680 ,1676 ,1672 ,1668 ,1664 ,1660,  //33-33.9
    1655 ,1651 ,1647 ,1643 ,1639 ,1635 ,1631 ,1627 ,1623 ,1618,  //34-34.9
    1614 ,1610 ,1606 ,1602 ,1598 ,1594 ,1590 ,1586 ,1582 ,1578,  //35-35.9
    1574 ,1570 ,1566 ,1562 ,1558 ,1554 ,1550 ,1546 ,1542 ,1538,  //36-36.9
    1534 ,1530 ,1526 ,1523 ,1519 ,1515 ,1511 ,1507 ,1503 ,1499,  //37-37.9
    1495 ,1491 ,1488 ,1484 ,1480 ,1476 ,1472 ,1468 ,1464 ,1461,  //38-38.9
    1457 ,1453 ,1449 ,1445 ,1442 ,1438 ,1434 ,1430 ,1427 ,1423,  //39-39.9
    1419 ,1415 ,1412 ,1408 ,1404 ,1401 ,1397 ,1393 ,1389 ,1386,  //40-40.9
    1382 ,1378 ,1375 ,1371 ,1368 ,1364 ,1360 ,1357 ,1353 ,1349,  //41-41.9
    1346 ,1342 ,1339 ,1335 ,1332 ,1328 ,1324 ,1321 ,1317 ,1314,  //42-42.9
    1310 ,1307 ,1303 ,1300 ,1296 ,1293 ,1289 ,1286 ,1282 ,1279,  //43-43.9
    1275 ,1272 ,1269 ,1265 ,1262 ,1258 ,1255 ,1251 ,1248 ,1245   //44-44.9
};

//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK miniSTM32开发板
//ADC 代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/7
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
////////////////////////////////////////////////////////////////////////////////// 
	   
		   
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3																	   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能ADC1通道时钟
 

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

	//PA1 作为模拟通道输入引脚                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束
	
	ADC_StartCalibration(ADC1);	 //开启AD校准
 
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束
 
//	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能

}				  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 	 

//这是一个ADC值转温度值的函数
float Get_temper(u16 adc_value)
{
    int i;
    for(i=0;i<NTC_ADC_MAX;i++)
    {
        if(adc_value >= ADC_NTC[i]) //当没有ADC值对应温度的时候,就取相近的,也就是大于的情况
        {
            return 0.1*i+25;
            break;
        }
    }
    return 65;
}

adc.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __ADC_H
#define __ADC_H	
#include "sys.h"

void Adc_Init(void);
u16  Get_Adc(u8 ch); 
u16 Get_Adc_Average(u8 ch,u8 times); 
double myln(double a);
float Get_Kelvin_Temperature(float Rntc);
float temp_trans(u16 ADC_value);
float Get_temper(u16 adc_value);

#endif 

本文由作者按照 CC BY 4.0 进行授权