本文來自http://blog.csdn.net/hellogv/這裡所用的脈搏感應器是HK-2000B,類比訊號,可以採集脈搏波形,建議採用500HZ定時器來定時採集,因為市面上一些心電模組也是500HZ,因此,在一個定時器中斷服務程式程式中,可以同時處理兩組資料!!!以下代碼有點亂,因為是在我現有項目中複製過來的。以下為ADConvert.c
//============================================================
//感應器資料擷取原始碼
//============================================================
#include "SPCE061A.h"
#define AD_END_FLAG *P_ADC_MUX_Ctrl&0x8000 //誤差調整
//=====================================================================
// 函數: unsigned int Get_One_AD(void)
// 描述: 取得一次AD轉換的值
// 參數: 無
// 返回: 轉換值
//=====================================================================
unsigned int Get_One_AD(void)
{
unsigned int uiData;
while(!AD_END_FLAG); //等待ADC轉換結束
uiData=*P_ADC_LINEIN_Data;
return(uiData&0xffc0);
}
//=====================================================================
// 函數: unsigned long int Get_AD(void)
// 描述: 使用平均法,取得AD轉換的平均值
// 參數: 無
// 返回: 轉換值
//========================================================================
#define N 4 //必須在2~4
unsigned long int Get_AD(void)
{
/* unsigned int adc_value=0;
int i;
for(i=0;i<N;i++)
{
adc_value += Get_One_AD()/N;
*P_Watchdog_Clear=0x0001;
}
adc_value+=N;
return (adc_value);*/
//////////////////
unsigned int count,i,j,temp;
unsigned int value_buf[N];
for (count=0;count<N;count++)
{
value_buf[count] = Get_One_AD();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N)];
}
//=====================================================================
// 函數: void AD_Initial(void)
// 描述: 初始化AD轉換
// 參數: 無
// 返回: 無
//=====================================================================
void Init_AD(void)
{
unsigned int Read_Start;
*P_ADC_MUX_Ctrl=C_ADC_CH1; //選擇LINE_IN1通道,從IOA0輸入
*P_ADC_Ctrl= C_ADCE; //AD使能開啟
Read_Start=*P_ADC_LINEIN_Data; //AD開始轉換
}
//*=================================================================
ISR.c:中斷服務程式:
//======================================================================== // 函數: void IRQ6(void) // 描述: 512Hz中斷服務程式,用於取得脈搏,心電資料 // 參數: 無 // 返回: 無 //======================================================================== int cardNpulse_data[500];//脈搏,心電資料,一秒採集500次unsigned int int cardNpulse_i=0; int tmp_max=0; int tmp_min=10; void IRQ6(void) __attribute__ ((ISR)); void IRQ6(void) { if((*P_INT_Ctrl&C_IRQ6_TMB2)) { sensor_data =Get_AD(); cardNpulse_data[cardNpulse_i]=abs((sensor_data)/129);//縮小或放大資料 //----------------測試代碼-------------- if(cardNpulse_data[cardNpulse_i]>tmp_max) tmp_max=cardNpulse_data[cardNpulse_i]; if(cardNpulse_data[cardNpulse_i]<tmp_min) tmp_min=cardNpulse_data[cardNpulse_i]; //-----------------測試代碼------------- cardNpulse_i++; /* for(delay=0;delay<1;delay++)//加入少少延時 { *P_Watchdog_Clear=0x0001; *P_INT_Clear=C_IRQ6_TMB2;//清中斷 }*/ *P_Watchdog_Clear=0x0001; *P_INT_Clear=C_IRQ6_TMB2;//清中斷 } if(cardNpulse_i>=500)//如果採集的資料數量足夠,則顯示出來 { FilterCMDSign(cardNpulse_data,500); SendPackage(mcu_id,patient_id,check_type,cardNpulse_data); cardNpulse_i=0; } }