(大連科技學院 電氣工程學院,大連 116052)
近年來,全國已經(jīng)發(fā)生多起由于病人遇到突發(fā)情況,不能及時向醫(yī)護人員尋求救助的嚴重事故,往往錯過了最佳治療的時間,小病變成大病,大病釀成無藥可醫(yī)。因此,一種新型臨床無線呼叫儀器的研制成為近些年來的研究熱點之一。
nRF24L01是一款由挪威(Nordic)公司生產(chǎn)的新型單片射頻收發(fā)器件,其工作于2.4~2.5 GHz世界通用ISM頻段,工作電壓為1.9~3.6 V??赏ㄟ^SPI寫入數(shù)據(jù),最高可達10 Mb,數(shù)據(jù)傳輸速率最快可達2 Mb,并且具有自動應答和自動再發(fā)射功能。芯片融進了增強式ShockBurst技術,其中輸出功率和通信頻道可通過程序進行配置。該芯片功耗低,在6 dBm功率發(fā)射時,工作電流為9 mA,接收時工作電流只有12.3 mA,可選擇的掉電模式和空閑模式使其應用設計更為方便。因此將nRF24L01作為無線收發(fā)模塊,實現(xiàn)病床呼叫系統(tǒng)的無線控制功能。
基于nRF24L01的無線病床呼叫系統(tǒng)主要是由主機和從機組成。從機部分主要完成病床病號的數(shù)據(jù)采集和數(shù)據(jù)的傳輸功能;主機部分主要負責數(shù)據(jù)的接收、數(shù)據(jù)處理、顯示以及報警。發(fā)射與接收電路傳輸距離可達100 m。當接收到從機發(fā)過來的信號時,主機控制蜂鳴器和發(fā)光二極管發(fā)出聲光報警,提醒有病人呼叫,醫(yī)護人員按下主機的呼應鍵,取消對應的呼叫。nRF24L01具有自動重發(fā)功能、數(shù)據(jù)包識別及CRC校驗功能,增強型ShockBurstTM模式可同時控制應答及重發(fā)功能而無需增加MCU的工作量。
系統(tǒng)主要由7部分組成:主控制器、按鍵模塊、無線發(fā)送模塊、無線接收模塊、LCD1602液晶顯示模塊、聲光報警和電源電路。無線病房呼叫系統(tǒng)結構框圖如圖1所示。
圖1 無線病床呼叫系統(tǒng)結構框圖
單片機最小系統(tǒng)由單片機STC89C52、復位電路、時鐘電路構成,如圖2所示。
STC89C52單片機的工作電壓范圍為4~5.5 V,所以通常給單片機5 V直流電源。連接方式為單片機中的40引腳,VCC接正極5 V,而20引腳VSS接電源地端。復位電路負責確定單片機的工作起始狀態(tài),完成單片機的啟動過程。時鐘電路好比單片機的心臟,它控制著單片機的工作節(jié)奏,振蕩電路是向單片機提供一個正弦波信號作為基準,其決定單片機的執(zhí)行速度。XTAL1和XTAL2分別為反向放大器的輸入和輸出,該反向放大器可以配置為片內(nèi)振蕩器。如采用外部時鐘源驅(qū)動器件,XTAL2應不接。因為一個機器周期含有6個狀態(tài)周期,而每個狀態(tài)周期為2個振蕩周期,所以一個機器周期共有12個振蕩周期,如果外接石英晶體振蕩器的振蕩頻率為12 MHz,則一個振蕩周期為1/12 μs。
圖2 單片機最小系統(tǒng)模塊
圖3 nRF24L01無線發(fā)射與接收模塊接線圖
無線病床呼叫系統(tǒng)的主從機都采用nRF24L01無線傳輸模塊實現(xiàn)通信,電路接法如圖3所示,一端作為電能的發(fā)射,一端作為電能的接收。
圖4 聲光報警模塊
無線病床呼叫系統(tǒng)主機中聲光報警電路采用NPN型S8550三極管驅(qū)動,當單片機的P1.1~1.3口輸出低電平時,三極管的VE>VB>VC>0。三極管的發(fā)射結正偏,集電結反偏,三極管飽和導通,此時發(fā)光二極管和蜂鳴器發(fā)出聲光報警,當單片機的P1.1~1.3口輸出高電平時,三極管截止,聲光報警停止工作。具體電路如圖4所示。
首先進行初始化操作,初始化包括設置單片機I/O和SPI相關寄存器,兩部分都可以和nRF24L01通信。通過SPI總線配置射頻芯片使其進入正確的工作模式,發(fā)射數(shù)據(jù)時,首先將nRF24L01配置為發(fā)射模式,接著把發(fā)送端待發(fā)射數(shù)據(jù)的目標地址TX-ADDR和數(shù)據(jù)TX-PLD寫入nRF24L01緩沖區(qū),延時后發(fā)射數(shù)據(jù),其流程圖如圖5所示。
圖5 無線發(fā)射模塊軟件流程圖
病床無線呼叫系統(tǒng)從機無線發(fā)射模塊的SPI寫入數(shù)據(jù)代碼如下:
reg為寄存器地址,pBuf為待寫入數(shù)據(jù)地址,uchars寫入數(shù)據(jù)的個數(shù)。
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){
uchar status,i;
CSN=0;
status = SPI_RW(reg);
for(i=0; i
SPI_RW(*pBuf++);
CSN=1;
return status;
}
uint SPI_RW_Reg(uchar reg, uchar value){
uint status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status uchar
}
void init_NRF24L01(void){
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 寫本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f);
//頻道0自動ACK應答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f);
//允許接收地址只有頻道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
//設置信道工作為2.4 GHz,收發(fā)必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
//設置接收數(shù)據(jù)長度,本次設置為20字節(jié)
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//設置發(fā)射速率為1 MHz,發(fā)射功率為最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收發(fā)完成中斷響應,16位CRC,主發(fā)送
}
void nRF24L01_TxPacket(uchar * tx_buf){
CE=0;//StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
//裝載數(shù)據(jù)
CE=1; //置高CE,激發(fā)數(shù)據(jù)發(fā)送
Delay(10);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
}
接收數(shù)據(jù)時,首先將nRF24L01配置為接收模式。接著延遲進入接收狀態(tài)等待數(shù)據(jù)的到來。當接收方檢測到有效地址和CRC時,就將數(shù)據(jù)包儲存在接收堆棧中,同時狀態(tài)寄存器中的中斷標志位RX-DR置高,產(chǎn)生中斷使IRQ引腳變?yōu)榈碗娖?,以便通知MCU去取數(shù)據(jù),其流程圖如圖6所示。
圖6 無線接收模塊軟件流程圖
病床無線呼叫系統(tǒng)主機無線接收模塊的SPI讀數(shù)據(jù)代碼如下:
reg為寄存器地址,pBuf為待寫入數(shù)據(jù)地址,uchars寫入數(shù)據(jù)的個數(shù)。
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){
uchar status,i;
CSN=0;
status = SPI_RW(reg);
for(i=0;i
pBuf[i] = SPI_RW(0);
CSN=1;
return status;
}
經(jīng)實驗,對系統(tǒng)進行了一些動態(tài)值的測量,具體結果如表1所列。
表1 數(shù)據(jù)測試表
從表1中看出接收端與發(fā)射端都維持在低功耗,基本達到了設計的初衷,另外收發(fā)距離測試精度也達到了設計的要求。