📄 hum_measure.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 + -