⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hum_measure.c

📁 基于凌阳公司的spcea061单片机开发
💻 C
字号:
//====================================================================================
//文 件 名: Hum_Measure.c
//功能描述: 湿度测量驱动程序
//维护记录: 2006年6月26         by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
#include "math.h"
#define P_FeedBack (volatile unsigned int*)0x7009

unsigned int F_Counter,Flag=0;

//====================================================================================
//语法格式:void Humidity_Init(void)
//功能描述: 湿度测量初始化
//入口参数: 无
//出口参数: 无
//维护记录: 2006年6月26         by hongyan.Feng
//====================================================================================
void Humidity_Init(void)
{
	*P_IOB_Dir |= 0x020C;						//初始化IOB2/IOB3为反相低电平输出口,IOB4/IOB5为悬浮高电平输入口,
	*P_IOB_Attrib |= 0x0230;					//如果要用SPCE061A的Feedback功能,必须这样设置.详细可参考SPCE061A的数据/编程手册
	*P_IOB_Data |= 0x0230;
	
	*P_FeedBack = 0x000C;						//设置IOB2\3\4\5为特殊功能(反馈功能)口
}
//====================================================================================
//语法格式:void Humidity_Measure(void)
//功能描述: 湿度测量函数,测量数据存储RH中,同时播放这个数据
//入口参数: 无
//出口参数: 无
//维护记录: 2006年6月26         by hongyan.Feng
//====================================================================================
unsigned int Humidity_Measure(void)
{	
	unsigned int i,iRH,max,min,f1,f2,err;		//iRH为测量湿度返回值,i用来循环
	//f1、f2分别为每次测量得到的Feedback1和Feedback2频率计数值,err为测量错误判断变量,iRH为测量返回值,
	unsigned int F_Con1[4],F_Con2[4];			//两个数组分别用来存放的4次频率测量计数值   
	float RH,C,C1,Ca,f;							//C为湿度传感器的矫正电容、RH为湿度、f为Feedback1的频率
												//C1为每次测量得到的湿度传感器的电容,Ca为频率补偿后55%RH的电容										 	  
	F_Counter = 0;								//初始化各个变量
	f = 0;
	C = 0;
	iRH = 0;
	
	Humidity_Init();							//湿度测量初始化

	for(i=0;i<4;i++)							//进行4次的电容测量 
	{
		*P_TimerB_Ctrl = 0x0001;				//32768Hz
		*P_TimerB_Data = 0xF0FF;				//计1280个数 (FFFF-FAFF)=160//FAFF//2560//3840
		*P_TimerA_Ctrl = 0x0037;				//EXT1       
		*P_TimerA_Data = 0x0000;				//设置定时初值
		
		Flag = 0;								//中断标志,这个位会在isr.asm的IRQ2中改变
		*P_INT_Ctrl |= 0x0400;					//允许IRQ2中断
		__asm("int irq");						//开IRQ中断 
		
		while(Flag==0)							//读计数器的数据  
		{
			*P_Watchdog_Clear = 0x0001;			//清看门狗 
		}
		*P_TimerA_Ctrl = 0x0006;				//停止TimerA和TimerB的计数或者定时
		*P_TimerB_Ctrl = 0x0006;
		
		F_Con1[i] = F_Counter;					//读取测量值,F_Counter在isr.asm的IRQ2中改变
		F_Counter = 0;    	

		*P_TimerB_Ctrl = 0x0001;				//32768Hz
		*P_TimerB_Data = 0xF0FF;				//计1280个数//3840           
		*P_TimerA_Ctrl = 0x003D;				//EXT2
		*P_TimerA_Data = 0x0000;				//设置定时初值
		
		Flag = 0;								//中断标志,这个位会在isr.asm的IRQ2中改变   
		*P_INT_Ctrl |= 0x0400;					//允许IRQ2中断
		__asm("irq on");						//开IRQ中断 
			
		while(Flag==0)							//读计数器的数据
		{
			*P_Watchdog_Clear = 0x0001;
		}
		*P_TimerA_Ctrl = 0x0006;				//停止TimerA和TimerB的计数或者定时
		*P_TimerB_Ctrl = 0x0006;

		F_Con2[i] = F_Counter;					//读取测量值,F_Counter在isr.asm的IRQ2中改变
		F_Counter = 0;
	}
	//f1的处理;去掉测量4次中的一个最大值.一个最小值,两个中间值的平均值即为要测量数据
	max = F_Con1[0];							//找出最大值,放在F_Con1[0]中
	for(i=1;i<4;i++)
	{
		if(F_Con1[i]>max)                      
		{
			max = F_Con1[i];
			F_Con1[i] = F_Con1[0];
			F_Con1[0] = max;
		}
		*P_Watchdog_Clear = 0x0001;
	}
	min = F_Con1[3];							//找出最小值,放在F_Con1[3]
	for(i=2;i>0;i--)
	{
		if(F_Con1[i]<min)
		{
			min = F_Con1[i];
			F_Con1[i] = F_Con1[3];
			F_Con1[0] = min;
		}
	}
	if(F_Con1[1]>F_Con1[2])						//错误处理,如果中间两个数据相差太大,忽略这次测量数据,认为是一次错误测量
		err = F_Con1[1] - F_Con1[2];           
	else err = F_Con1[2] - F_Con1[1];
	if(err<10)
		f1 = (F_Con1[1]+F_Con1[2])/2;       
	else f1 = 0;	
	//f2的处理;去掉测量4次中的一个最大值.一个最小值,两个中间值的平均值即为要测量数据
	max = F_Con2[0];							//找出最大值,放在F_Con2[0]中
	for(i=1;i<4;i++)
	{
		if(F_Con2[i]>max)
		{
			max = F_Con2[i];
			F_Con2[i] = F_Con2[0];
			F_Con2[0] = max;
		}
		*P_Watchdog_Clear = 0x0001;
	}
	min = F_Con2[3];							//找出最小值,放在F_Con2[3]
	for(i=2;i>0;i--)
	{
		if(F_Con2[i]<min)
		{
			min = F_Con2[i];
			F_Con2[i] = F_Con2[3];
			F_Con2[0] = min;
		}
	}
	if(F_Con2[1]>F_Con2[2])						//错误处理,如果中间两个数据相差太大,忽略这次测量数据,认为是一次错误测量
		err = F_Con2[1] - F_Con2[2];
	else err = F_Con2[2] - F_Con2[1];
	if(err<10)
		f2 = (F_Con2[1]+F_Con2[2])/2;
	else f2 = 0;
	
	if(f1!=0)
	{
		C1 = 390.0000/f1*f2;					//计算测量电容,电路中固定电容为390pF
		C = C1 - 18;							//实际电容与测量值之间的误差,这个传感器的实际电容是根据电容表测量得到,可自己测量确定
		f = f1;									//计算湿度传感器的工作频率,以便进行频率补偿
		f = f/3840;
		f = f*98304;
		f = f/1000;								//频率划成千赫兹
		Ca = 180*(1.027-0.01185*log(f));		//频率补偿
		RH = (C-0.91*Ca)/(0.001*Ca*2.19);		//计算湿度 
	}
	else RH = 0;								//如果错误,直接返回0
	iRH = RH;									//把测量数据转换成整型给返回值
	if(iRH>100)									//如果湿度大于100
		iRH = 0;								//湿度强制赋0
	return iRH;
	*P_Watchdog_Clear = 0x0001;					//清看门狗
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -