基于nRF24E01的無線溫度采集系統(tǒng)設(shè)計
溫度采集系統(tǒng)所采集的溫度信息通常通過RS485、CAN總線通信方式傳輸至上位機,但這種方式維護較困難,不利于工業(yè)現(xiàn)場生產(chǎn);而無線通信GPRS技術(shù)傳輸距離長,通信可靠穩(wěn)定,但設(shè)計復(fù)雜、成本昂貴、后期運轉(zhuǎn)成本高。本設(shè)計采用工業(yè)級內(nèi)置硬件鏈路層協(xié)議的低成本單芯片nRF24E01無線收發(fā)器件實現(xiàn)系統(tǒng)間的無線通信,完成無線信號的接收、顯示及報警功能。
nRF24E01簡介
nRF24E1收發(fā)器是Nordic VLSI推出的系統(tǒng)級芯片,采用先進的0.18μs CMOS工藝、36引腳QFN封裝。以nRF2401/02芯片結(jié)構(gòu)為基礎(chǔ),將射頻、8051MCU、9輸入12位ADC、125通道、UART、SPI、PWM、RTC、WDT全部集成到單芯片中。nRF24E01是一款工業(yè)級內(nèi)置硬件鏈路層協(xié)議的低成本無線收發(fā)器。該器件工作于2.4GHz全球開放ISM頻段,內(nèi)置頻率合成器、功率放大器、晶體振蕩器、調(diào)制器等功能模塊,并融合增強型ShockBurst技術(shù),其輸出功率和通信頻道可通過程序配置。擁有ShockBurst和Enhanced ShockBurst兩種數(shù)據(jù)傳輸模式。nRF24E01功耗低,以-6dBm的功率發(fā)射時,工作電流僅9mA;接收時,工作電流僅12.3mA,多種低功率工作模式(掉電和空閑模式)更利于節(jié)能設(shè)計。nRF24E1/nRF24E2適用于無線鼠標和鍵盤、無線手持終端、無線頻率識別、數(shù)字視頻、遙控和汽車電子及其他短距離無線高速應(yīng)用。
系統(tǒng)硬件設(shè)計
系統(tǒng)硬件設(shè)計主要由采集發(fā)送和接收顯示兩部分組成。圖1為采集發(fā)送電路原理圖,該電路主要由溫度傳感器DS18B20和nRF24E01組成。
圖1 采集發(fā)送電路原理圖
DSl8B20是DALLAS公司生產(chǎn)的單總線數(shù)字1-Wire溫度傳感器,可把溫度信號直接轉(zhuǎn)換成串行數(shù)字信號供單片機處理,采用1-Wire接口,數(shù)據(jù)端DQ通過4.7kΩ的上拉電阻接NRF24E01。nRF24E01的任意IO端口都可通過程序模擬DQ通信信號,但需在編程時注意,這里接至P1端口。采集到的溫度數(shù)據(jù)經(jīng)過NRF24E01內(nèi)部調(diào)制、混頻無線傳輸?shù)浇邮漳K,接收模塊可以顯示或?qū)⑺杉臄?shù)據(jù)通過串口發(fā)送至PC進行處理。
系統(tǒng)軟件設(shè)計
數(shù)據(jù)采集發(fā)送部分上電后首先配置nRF24E01的相關(guān)寄存器.使其工作在發(fā)射狀態(tài),然后復(fù)位DSl8B20,向DSl8B20發(fā)送溫度轉(zhuǎn)換命令,讀取已轉(zhuǎn)換的溫度值,然后由nRF24E01發(fā)送.由于DSl8B20采用的是單線讀寫方式,需采用軟件模擬實現(xiàn)1-WIRE通信。因此應(yīng)嚴格按照1-Wire的時序要求編寫。復(fù)位要求nRF24E01將數(shù)據(jù)線下拉500μs,然后釋放,當DS18B20收到信號后等待16〜60μs,后發(fā)出60〜240μs的存在低脈沖,主CPU收到此信號表示復(fù)位成功,其流程如圖2所示。
圖2 溫度數(shù)據(jù)采集發(fā)送流程圖
RF24E01的主要程序代碼如下:
(1)nRF24E01對DSl8B20的數(shù)據(jù)讀寫是通過時間隙處理位和命令字來確認信息交換。根據(jù)“單線復(fù)位脈沖時序和1-wire presence detect”的時序圖設(shè)計程序如下:
uint get_temperature()
{
float wendu;
uchar a,b;
ds_reset();
delay(1); //約2ms
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte();
b=ds_read_byte();
temp=b;
return temp;
//返回溫度相關(guān)數(shù)據(jù)
}
(2)發(fā)送函數(shù),把溫度數(shù)據(jù)通過無線發(fā)射出去,實現(xiàn)函數(shù)如下:
void Transmitter(unsigned char b){//發(fā)送函數(shù)
unsigned char mtemp;
CS=1;
Delay100us(0);
for(mtemp=0;mtemp<tconf.n;mtemp++){
SpiReadWrite(tconf.buf[mtemp]);//發(fā)送發(fā)送器配置字
}
CS=0;
TransmitPacket(b);
//發(fā)送數(shù)據(jù)包
}
}