?? 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 + -