无线信号传输系统设计.docx
《无线信号传输系统设计.docx》由会员分享,可在线阅读,更多相关《无线信号传输系统设计.docx(23页珍藏版)》请在冰点文库上搜索。
无线信号传输系统设计
课题5:
无线信号传输系统设计
一、任务
设计制作一套混合信号无线传输装置。
该装置由发射机与接收机组成,其方框图参见图1。
接收机可以收到发射机送来的信号,并具有显示功能。
图1无线信号传输系统方框图
装置中调制方式自由选定。
可使用专用数据收发芯片,但不得使用现成的收发模块。
二、要求
1.基本要求
(1)点对点(发射机与接收机)无线传输方式。
(2)载波频率范围在40—50MHz之间。
(3)传输距离达5米。
(4)发射功率小于20mW。
(5)传输模拟信号:
单一正弦电压信号1—4kHz送达接收端,并能监听到相应声调。
(6)传输数字信号:
采集30—60℃水温数据,误差±2℃,送达接收端,并显示水温数据。
2.发挥部分
(1)能识别所接收的正弦信号频率并正确显示频率值。
(2)输入连续可调电压Vpp=1—3V的正弦信号,接收端的信号波形不失真且幅度基本恒定。
(3)接收机与发射机距离15米以上。
(4)改变输入信号频率1—4kHz时,接收到的正弦信号波形无明显失真。
(5)其他。
三、说明
1、允许手动切换模拟信号输入或数字信号输入模式。
2、接收及发射电路不能采用现成的专用无线模块。
3、设计报告正文中应包括系统总体框图、核心电路原理图、主要流程图、主要的测试结果。
完整的电路原理图、重要的源程序用附件给出。
基于PTR7660的无线信号传输系统设计
[摘要]采用ATmega16单片机作为主控制器,测量部分由数字传感器DS18B20实现温度采集,数据处理后通过PTR7660无线传输到到另一个接受模块上通过LCD1602进行显示。
[关键词]PTR7660DS18B20无线温度采集
一:
系统设计
1.PTR7660简介
PTR7660是以nRF905为核心的一款无线收发芯片,工作电压为1.9~3.6V,工作在433/868/915MHz的ISM(工业、科学、医疗)频段,由一个完全集成的频率调制器、一个带解调器的接收器、一个功率放大器、一个晶体振荡器和一个调节器组成。
最大传输速率可达到100Kbit/s,可以很容易通过SPI接口进行编程配置。
PTR7660采用Nordic公司的ShockBurst技术收发数据。
ShockBurst将与RF协议有关的高速信号处理放到芯片内,使收发芯片能够提供高速的数据传输,收发芯片由微控制器通过一个SPI接口控制,通信速率由微控制器通过程序设定。
在发送模式中,PTR7660自动产生前导码和CRC校验码,数据准备就绪DR信号通知AT89LV52数据传输已经完成。
在接收模式中,地址匹配AM和数据准备就绪DR信号通知AT89LV52一个有效的地址和数据包已经各自接收完成。
由PWR、TRX_CE、TXEN三个引脚完成PTR7660四种工作模式的设定:
掉电各SPI编程模式、待机和SPI编程模式、发射模式、接收模式,如表所示。
信号调理电路
2.PTR7660硬件电路
PTR7660内置有完整的通信协议和CRC,单片机通过SPI接口便可完成无线数据收发,但PTR7660工作电压为3V,如果PTR7660与5V单片机连接,则必须进行电平转换。
这里选用低电压通用单片机AT89LV52,其供电和逻辑电平均为3V,因此不存在电平转换的问题。
ATmega16是ATMEL公司推出的低电压,高性能CMOS8位单片机,工作电压范围可达2.7V-6.0V,芯片内置通用8位中央处理器和Flash存储单元,可用于低功耗场合。
PTR7660与AT89LV52的硬件连接如图1所示。
3.温度检测
数字温度传感器大大简化了温度检测装置的设计方案,工作稳定性高,并且能够直接将温度转换为数字值,便于单片机进行综理。
本系统采用DS18B20单总线数字传感器实现温度检测。
DS18B20是美国DALLAS公司生产的单总线温度传感器,它能够直接读出被测温度的数字量,其测温范围为-55~+125℃,在-10~+85℃时精度为±0.5℃。
DS18B20采用单总线技术(1-WIRES),即单片机只用一根输入输出接口线,就可以实现单片机与传感器的数据传送,为此DS18B20数据线与单片机P2.4相连。
DS18B20读写数据仅需要一根口线,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
为增强系统稳定性,在此选用外加电源方式,外加电源正负极分别接DS18B20引脚VDD及GND,如图2所示。
二、系统软件设计
1.无线通信软件设计
由于RF协议相关的高速信号处理部分已经嵌入在模块内部,PTR7660可与各种低成本单片机匹配使用,。
(1)配置编程。
上电以后AT89LV52首先配置PTR7660模块。
先将PWR_UP、TXEN、TRX_CE设为配置模式,AT89LV52通过SPI将配置数据移入PTR7660模块;在掉电和待机模式工作后,配置内容仍然有效。
(2)发射模式。
当AT89LV52有数据需要发往规定节点时,首先设置TRX_CE、TXEN来启动传输,无线系统自动上电,将数据加前导码和CRC校验码并打包发送,如果AUTO_RETRAN被设置为高,PTR7660将连续地发送数据包,直到TRX_CE被置为低。
当TRX_CE被设置为低时,PTR7660结束数据传输并将自己设置成待机模式。
(3)接收模式。
设置TRX_CE为1,TXEN为0选择接收模式,PTR7660开始监测信息,当PTR7660发现和接收频率相同的载波时,载波检测(CD)被置高,当PTR7660接收到有效的地址时,地址匹配(AM)被置高。
PTR7660接收到有效的数据校验正确时,PTR7660去掉前导码,数据准备就绪(DR)被置高。
AT89LV52通过SPI接口读出有效数据,当所有的有效数据被读出后,PTR7660将AM和DR置低。
2.温度测量软件设计
温度测量部分主要是利用程序控制DS18B20完成温度读取,DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性,AT89LV52控制DS18B20必须经过三个步骤:
(1)每一次读写之前都要对DS18B20进行复位。
(2)复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
(3)复位要求ATmga将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,AT89LV52收到此信号表示复位成功。
设置分辨率为12位,DS1820测量得到的温度数据存储在的两个字节的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,数值需要取反加1再乘于0.0625即可得到实际温度。
三:
电路原理图
3.1发射电路原理图
3.2接受机电路图
四:
软件流程图及程序设计
4.1发射机
基于以上所述,整个无线温度采集系统都在单片机的控制下运行,这就需要编制程序来实现各部分的功能和工作过程。
发射部分的工作过程为:
标准热电偶在单片机的控制下采集温度数据信息,经热电偶数字转换器处理后发送给单片机进行A/D转换,同时,被测热电偶的输出数据也经放大器输入到单片机中,单片机对这些数据进行分组打包,发送给无线收发芯片PTR7660,通过PTR7660中的内置环形天线发送到上位机模块中。
下位机软件实现流程图如图3-13所示。
4.2接受机
接收部分的工作过程为:
在单片机的控制下接收来发射部分的数据信号,经PTR7660解调后经单片机处理在LCD1602上进行显示,或者可以经过MAX232进行电平转换,然后送入PC机串口。
上位机的软件实现流程图如图
程序:
1发射机程序:
PTR7660.H
#include
#include
#include
#include"nRF2401.h"
constuint8_tInitData[15]=//nRF2401控制字15Byte
{
NRF2401_CH2_WIDTH,
(NRF2401_REC_ADDR_WIDTH
|NRF2401_CRC_LENGTH_16
|NRF2401_CRC_ENABLE),//b23~b18:
接收地址宽度(32位)
//b17~b16:
CRC模式选择(11-16bit)
(NRF2401_RX_CH1
|NRF2401_SHOCKBURST_MODE
|NRF2401_RF_RATE_250
|NRF2401_CRYSTAL_16M
|NRF2401_RF_POWER_0dB),
(NRF2401_FRE_CH_SEL
|NRF2401_TRANSMIT_MODE)//b7~b1:
收发频率(0110010,2.45GHz)
//b0:
收发控制(1-接收)
};
voidnRF2401_Initial(void)
{
#ifNRF2401_GPIO
//初始化端口
P_NRF2401_DDR|=_BV(CS)|_BV(DATA)|_BV(PWR)|_BV(CLK1)|_BV(CE);
P_NRF2401_DDR&=~_BV(DR1);
P_NRF2401_PORT&=~(_BV(CS)|_BV(DATA)|_BV(CLK1)|_BV(CE));
#endif
#ifNRF2401_SPI
P_NRF2401_DDR|=_BV(CS)|_BV(MOSI)|_BV(PWR)|_BV(CLK1)|_BV(CE);
P_NRF2401_DDR&=~_BV(MISO);
P_NRF2401_PORT&=~(_BV(CS)|_BV(DATA)|_BV(CLK1)|_BV(CE));
//SPI允许、数据传送为MSB、主机模式、极性与相位00、速率focs/2
SPCR=_BV(SPE)|_BV(MSTR)|_BV(SPR0)|_BV(SPR1);
//SPSR|=_BV(SPI2X);
#endif
#ifNRF2401_INT
DDRB&=~_BV(DR1);//设置PB2口为输入口
MCUCSR|=_BV(ISC2);//上升沿触发
GIFR|=_BV(INTF2);//清中断
GICR|=_BV(INT2);//允许外部中断INT2
sei();
#endif
nRF2401_ON();//nRF2401上电
_delay_ms
(1);
nRF2401_WriteCommand();//向nRF2401写命令字
_delay_ms
(1);
}
voidnRF2401_ON(void)
{
P_NRF2401_PORT|=_BV(PWR);
}
{
P_NRF2401_PORT&=~_BV(PWR);
uint8_ti;
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT|=_BV(CS);
_delay_us(50);
for(i=0;i<15;i++)
{
nRF2401_WriteByte(InitData[i]);
}
P_NRF2401_PORT&=~_BV(CS);
P_NRF2401_PORT|=_BV(CE);
P_NRF2401_PORT&=~_BV(CS);
P_NRF2401_PORT|=_BV(CE);
voidnRF2401_WriteByte(uint8_tuiData)
{
#ifNRF2401_GPIO
uint8_ti;
for(i=0;i<8;i++)
{
P_NRF2401_PORT&=~_BV(CLK1);
if(uiData&0x80)
{
P_NRF2401_PORT|=_BV(DATA);
}
else
{
P_NRF2401_PORT&=~_BV(DATA);
}
_delay_us(30);
P_NRF2401_PORT|=_BV(CLK1);
_delay_us(30);
P_NRF2401_PORT&=~_BV(CLK1);
uiData=uiData<<1;
}
#else
SPDR=uiData;
while(!
(SPSR&(1<#endif
}
a)
{
uint8_ti;
P_NRF2401_PORT|=_BV(CE);
_delay_us(50);
for(i=0;i{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteByte(TxData);
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT&=~_BV(DATA);
_delay_us(2000);
}
uint8_ti;
for(i=0;i<16;i++)
{
P_NRF2401_PO&=~_BV(CLK1);
if(uiData&0x8000)
{
P_NRF2401_PORT|=_BV(DATA);
}
else
{
P_NRF2401_PORT&=~_BV(DATA);
}
_delay_us(30);
P_NRF2401_PORT|=_BV(CLK1);
_delay_us(30);
P_NRF2401_PORT&=~_BV(CLK1);
uiData=uiData<<1;
}
}
//===============================
uint8_ti;
P_NRF2401_PORT|=_BV(CE);
_delay_us(10);
for(i=0;i{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteWord(TxData);
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT&=~_BV(DATA);
_delay_us(2000);
{
nRF2401_WriteByte(TxData[i]);
}
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT&=~_BV(DATA);
_delay_us(200);
}
voidnRF2401_SendBuffer_Word(uint16_t*TxData,uint8_tDataWord)
{
uint8_ti;
P_NRF2401_PORT|=_BV(CE);
_delay_us(10);
for(i=0;i{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0;i{
nRF2401_WriteWord(TxData[i]);
}
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT&=~_BV(DATA);
if((P_NRF2401_PIN&_BV(DR1))==0)
{
return0;
}
else
{
#ifNRF2401_SPI
uint8_tj;
P_NRF2401_DDR&=~_BV(MOSI);
while(P_NRF2401_PIN&_BV(DR1))
{
SPDR=0x00;
while(!
(SPSR&(1<RxData[j]=SPDR;
}
P_NRF2401_DDR|=_BV(MOSI);
#endif
#ifNRF2401_GPIO
uint8_ti=0,j=0;
uint8_tdat=0;
P_NRF2401_DDR&=~_BV(DATA);
while(P_NRF2401_PIN&_BV(DR1))
{
dat<<=1;
P_NRF2401_PORT&=~_BV(CLK1);
|=_BV(MOSI);
j++;
}
P_NRF2401_PORT&=~_BV(CLK1);
}
P_NRF2401_DDR|=_BV(DATA);
#endif
}
uint8_tAddress[4]={0x00,0x00,0x01,0xFF};
intmain(void)
{
uint8_tkey;
Key_Init();
nRF2401_Initial();//初始化nRF2401A
nRF2401_Mode(NRF2401_TRANSMIT_MODE);//切换nRF2401A收/发模式
nRF2401_SetAddress(Address,4);//设置接收端地址000001FF
while
(1)
{
key=Key_Get();//取键值
switch(key)
{
caseKEY_1:
nRF2401_SendByte(KEY_1);
break;
caseKEY_2:
nRF2401_SendByte(KEY_2);
break;
caseKEY_3:
nRF2401_SendByte(KEY_3);
break;
caseKEY_4:
nRF2401_SendByte(KEY_4);
break;
default:
程序2:
接收机
#include
#include
#include
#include"nRF2401.h"
constuint8_tInitData[15]=//nRF2401控制字15Byte
{
NRF2401_CH2_WIDTH,//通道二接收数据宽度
NRF2401_CH1_WIDTH,
//b14:
收发模式(1-ShockBurst模式)
//b13:
波特率选择(0-250Kbps)
//b12~b10:
晶振选择(011-16M)
(NRF2401_FRE_CH_SEL
|NRF2401_TRANSMIT_MODE)//b7~b1:
收发频率(0110010,2.45GHz)
//b0:
收发控制(1-接收)
};
uint8_tAddrBuffer[5];//保存地址
uint8_tAddrByteCnt;//地址Byte数
voidnRF2401_Initial(void)
{
#ifNRF2401_GPIO
//初始化端口
P_NRF2401_DDR|=_BV(CS)|_BV(DATA)|_BV(PWR)|_BV(CLK1)|_BV(CE);
P_NRF2401_DDR&=~_BV(DR1);
P_NRF2401_PORT&=~(_BV(CS)|_BV(DATA)|_BV(CLK1)|_BV(CE));
#endif
#ifNRF2401_SPI
P_NRF2401_DDR|=_BV(CS)|_BV(MOSI)|_BV(PWR)|_BV(CLK1)|_BV(CE);
P_NRF2401_DDR&=~_BV(MISO);
P_NRF2401_PORT&=~(_BV(CS)|_BV(DATA)|_BV(CLK1)|_BV(CE));
//SPI允许、数据传送为MSB、主机模式、极性与相位00、速率focs/2
SPCR=_BV(SPE)|_BV(MSTR)|_BV(SPR0)|_BV(SPR1);
//SPSR|=_BV(SPI2X);
#endif
#ifNRF2401_INT
DDRB&=~_BV(DR1);//设置PB2口为输入口
MCUCSR|=_BV(ISC2);//上升沿触发
GIFR|=_BV(INTF2);//清中断
GICR|=_BV(INT2);//允许外部中断INT2
sei();
#endif
nRF2401_ON();//nRF2401上电
_delay_ms
(1);
nRF2401_WriteCommand();//向nRF2401写命令字
_delay_ms
(1);
}
{
P_NRF2401_PORT|=_BV(PWR);
}
{
P_NRF2401_PORT&=~_BV(PWR);
}
{
uint8_ti;
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT|=_BV(CS);
_delay_us(50);
for(i=0;i<15;i++)
{
nRF2401_WriteByte(InitData[i]);
}
P_NRF2401_PORT&=~_BV(CS);
P_NRF2401_PORT|=_BV(CE);
}
的工作方式
//参数:
uiMode:
1--接收;0--
{
P_NRF2401_PORT&=~_BV(CE);
P_NRF2401_PORT|=_BV(CS);
if(uiMode==NRF2401_RECEIVE_MDOE)
{
nRF2401_WriteByte(InitData[14]|0x01);
}
else
{
nRF2401_WriteByte(InitData[14]&0xfe);
}