找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5806|回复: 2
收起左侧

NRF401单片机无线遥控设计资料

[复制链接]
ID:291292 发表于 2018-3-13 15:19 | 显示全部楼层 |阅读模式
无线遥控设计
  • 总体概述
本系统有六大部分组成分PS/2电脑键盘控制部分、双单片机控制部分、无线数字收发部分、摄相头采集部分、高频放大发射部分、电视观察接收信号图像部分。
  • 题目分析及方案论证:
本题中要求发射大于10米,且多通道。所以可采用高频无线数字收发模块。如NRF 系列数字收发模块。可选用单片机给数字模块进行控制和配置寄存器,及用SPI给数字模块发送数据。
1 NRF系列数字收发模块选择方案论证


    • NRF401可以达到题目要求
           所设计的无线数传模块由单片射频收发芯片nRF401、AT89C52微控制器和MAX3316接口芯片构成,工作在433.92/434.33MHz频段;
   nRF401是北欧集成电路公司(NORDIC)的产品,是一个为433MHz ISM频段设计的真正单片UHF无线收发芯片,满足欧洲电信工业标准(ETSI)EN300 200-1 V1.2.1。它采用FSK调制解调技术,最高工作速率可以达到20K,发射功率可以调整,最大发射功率是+10dBm。nRF401的天线接口设计为差分天线,以便于使用低成本的PCB天线。它要求非常少的外围元件(约10个),无需声表滤波器、变容管等昂贵的元件,只需要便宜且易于获得的4MHz晶体,收发天线合一。无需进行初始化和配置,不需要对数据进行曼彻斯特编码,有两个工作频宽(433.92/434.33MHz),工作电压范围可以从2.7-5V,还具有待机模式,可以更省电和高效。
   
   nRF401无线收发芯片的结构框图如图1所示:内部结构可分为发射电路、接收电路、模式和低功耗控制逻辑电路及串行接口几部分。发射电路包含有:射频功率放大器、锁相环(PLL),压控振荡器(VCO),频率合成器等电路。基准振荡器采用外接晶体振荡器,产生电路所需的基准频率。
   
   其主要特性如下:
   ●工作频率为国际通用的数传频段
   ●FSK调制,抗干扰能力强,特别适合工业控制场合;
   ●采用PLL频率合成技术,频率稳定性极好;
   ●灵敏度高,达到-105dBm(nRF401);
   ●功耗小,接收状态250 A,待机状态仅为8 A(nRF401);
   ●最大发射功率达 +10dBm ;
   ●低工作电压(2.7V),可满足低功耗设备的要求;
   ●具有多个频道,可方便地切换工作频率 ;
   ●工作速率最高可达20Kbit/s(RF401);
   ●仅外接一个晶体和几个阻容、电感元件,基本无需调试;
   ●因采用了低发射功率、高接收灵敏度的设计,使用无需申请许可证,开阔地的使用距离最远可达1000米 (与具体使用环境及元件参数有关)。
TX与RX之间的切换
   
   当从RX切换到TX模式时,数据输入脚(DIN)必须保持为高至少1ms才能收发数据。当从TX切换到RX时,数据输出脚(DOUT)要至少3ms以后有数据输出。
   
   Standby与RX之间的切换
   
   从待机模式到接收模式,当PWR_UP输入设成1时,经过tSR时间后,DOUT脚输出数据才有效。对 nRF401来说,tST最长的时间是3ms。
   从待机模式到发射模式,所需稳定的最大时间是tST。
   
   Power Up与TX间的切换
   
   从加电到发射模式过程中,为了避免开机时产生干扰和辐射,在上电过程中TXEN的输入脚必须保持为低,以便于频率合成器进入稳定工作状态。当由上电进入发射模式时,TXEN必须保持1ms以后才可以往DIN发送数据。
   
   从上电到接收模式过程中,芯片将不会接收数据,DOUT也不会有数据输出,直到电压稳定达到2.7V以上,并且至少保持5ms。如果采用外部振荡器,这个时间可以缩短到3ms。
   
  在实际应用中,微控制器采用Atmel公司的AT89C52,分别用单片机的P1口各管脚控制nRF401的DIN、DOUT、TXEN、PWRUP、CS这五个脚即可。
      接口芯片采用美信公司的RS232转换芯片MAX3316,完成单片机和计算机RS232接口的电平转换及数据发送、接收、请求、清除功能。在nRF401芯片使用时,设定好工作频率,进入正常工作状态后,通过单片机根据需要进行收发转换控制,发送/接收数据或进行状态转换。在设计程序时,要注意各状态转换的时延。nRF401的通讯速率最高为20kbit/s,发送数据之前需将电路置于发射模式;接收模式转换为发射模式的转换时间至少为1ms;可以发送任意长度的数据;发射模式转换为接收模式的转换时间至少为3ms。在待机模式时,电路进入待机状态,电路不接收和发射数据。待机模式转换为发射模式的转换时间至少为4ms;待机模式转换为接收模式的转换时间至少为5.0ms。这里给出系统和程序的工作流程图
1.2 单片射频收发器nRF905也可达到要求
nRF905是挪威Nordic VLSI公司推出的单片射频收发器,工作电压为1.9~3.6V,32引脚QFN封装(5由频率合成器、接收解调器、功率放大器、晶体振荡器和调制器组成,不需外加声表滤波器, ShockBurstTM工作模式,自动处理字头和CRC(循环冗余码校验),使用SPI接口与微控制器通信,配置非常方便。此外,其功耗非常低,以-10dBm的输出功率发射时电流只有11mA,工作于接收模式时的电流为12.5mA,内建空闲模式与关机模式,易于实现节能。nRF905适用于无线数据通信、无线报警及安全系统、无线开锁、无线监测、家庭自动化和玩具等诸多领域。NRF905比NRF401先进多了。能充分满足题目要求。
2. 芯片结构、引脚介绍及工作模式
   nRF905片内集成了电源管理、晶体振荡器、低噪声放大器、频率合成器功率放大器等模块,曼彻斯特编码/解码由片内硬件完成,无需用户对数据进行曼彻斯特编码,因此使用非常方便。nRF905的详细结构如图1所示。
2.2引脚介绍     表1:nRF905引脚
     nRF905有两种工作模式和两种节能模式。两种工作模式分别是ShockBurstTM接收模式和ShockBurstTM发送模式,两种节能模式分别是关机模式和空闲模式。nRF905的工作模式由TRX_CE、TX_EN和PWR_UP三个引脚决定,详见表2。
2.1ShockBurstTM模式
与射频数据包有关的高速信号处理都在nRF905片内进行,数据速率由微控制器配置的SPI接口决定,数据在微控制器中低速处理,但在nRF905中高速发送,因此中间有很长时间的空闲,这很有利于节能。由于nRF905工作于ShockBurstTM模式,因此使用低速的微控制器也能得到很高的射频数据发射速率。在ShockBurstTM接收模式下,当一个包含正确地址和数据的数据包被接收到后,地址匹配(AM)和数据准备好(DR)两引脚通知微控制器。在ShockBurstTM发送模式,nRF905自动产生字头和CRC校验码,当发送过程完成后,数据准备好引脚通知微处理器数据发射完毕。由以上分析可知,nRF905的ShockBurstTM收发模式有利于节约存储器和微控制器资源,同时也减小了编写程序的时间。下面具体详细分析nRF905的发送流程和接收流程。
2.2发送流程
典型的nRF905发送流程分以下几步:
接口的速率在通信协议和器件配置时确定;
B. 微控制器置高TRX_CE和TX_EN,激发nRF905的ShockBurstTM发送模式;
C. nRF905的ShockBurstTM发送:
l 数据打包(加字头和CRC校验码);
2 发送数据包;
3 当数据发送完成,数据准备好引脚被置高;
D. AUTO_RETRAN被置高,nRF905不断重发,直到TRX_CE被置低;
E. 当TRX_CE被置低,nRF905发送过程完成,自动进入空闲模式。
ShockBurstTM工作模式保证,一旦发送数据的过程开始,无论TRX_EN和TX_EN引脚是高或低,发送过程都会被处理完。只有在前一个数据包被发送完毕,nRF905才能接受下一个发送数据包。
2.3接收流程
A. 当TRX_CE为高、TX_EN为低时,nRF905进入ShockBurstTM接收模式;
B. 650us后,nRF905不断监测,等待接收数据;
C. 当nRF905检测到同一频段的载波时,载波检测引脚被置高;
D. 当接收到一个相匹配的地址,地址匹配引脚被置高;
E. 当一个正确的数据包接收完毕,nRF905自动移去字头、地址和CRC校验位,然后把数据准备好引脚置高
F. 微控制器把TRX_CE置低,nRF905进入空闲模式;
G. 微控制器通过SPI口,以一定的速率把数据移到微控制器内;
H. 当所有的数据接收完毕,nRF905把数据准备好引脚和地址匹配引脚置低;
I. nRF905此时可以进入ShockBurstTM接收模式、ShockBurstTM发送模式或关机模式。
当正在接收一个数据包时,TRX_CE或TX_EN引脚的状态发生改变,nRF905立即把其工作模式改变,数据包则丢失。当微处理器接到地址匹配引脚的信号之后,其就知道nRF905正在接收数据包,其可以决定是让nRF905继续接收该数据包还是进入另一个工作模式。
2.4节能模式
nRF905的节能模式包括关机模式和节能模式。
在关机模式,nRF905的工作电流最小,一般为2.5uA。进入关机模式后,nRF905保持配置字中的内容,但不会接收或发送任何数据。
空闲模式有利于减小工作电流,其从空闲模式到发送模式或接收模式的启动时间也比较短。在空闲模式下,nRF905内部的部分晶体振荡器处于工作状态。nRF905在空闲模式下的工作电流跟外部晶体振荡器的频率有关。
2.5 器件配置
所有配置字都是通过SPI接口送给nRF905。SIP接口的工作方式可通过SPI指令进行设置。当nRF905处于空闲模式或关机模式时,SPI接口可以保持在工作状态。
2.6SPI接口配置
SPI接口由状态寄存器、射频配置寄存器、发送地址寄存器、发送数据寄存器和接收数据寄存器5个寄存器组成。状态寄存器包含数据准备好引脚状态信息和地址匹配引脚状态信息;射频配置寄存器包含收发器配置信息,如频率和输出功能等;发送地址寄存器包含接收机的地址和数据的字节数;发送数据寄存器包含待发送的数据包的信息,如字节数等;接收数据寄存器包含要接收的数据的字节数等信息。
2.7射频配置
  射频配置寄存器和内容如表3所示:
  表3:射频配置寄存器
射频寄存器的各位的长度是固定的。然而,在ShockBurstTM收发过程中,TX_PAYLOAD、RX_PAYLOAD、TX_ADDRESS和RX_ADDRESS 4个寄存器使用字节数由配置字决定。nRF905进入关机模式或空闲模式时,寄存器中的内容保持不变。
2.8 应用电路
nRF905在使用中,根据不同需要,其电路图不尽相同,图2所示为典型的应用原理图,该电路天线部分使用的是50Ω单端天线。在nRF905的电路板设计中,也可以使用环形天线,把天线布在PCB板上,这可减小系体积。
  

3.  NRF2401芯片是2.4G高频无线数字收发模块
nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。nRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。nRF2401无线收发一体芯片和蓝牙一样,都工作在2.4GHz自由频段,能够在全球无线市场畅通无阻。nRF2401支持多点间通信,最高传输速率超过1MBit/S,而且比蓝牙具有更高的传输速度。它采用SoC方法设计,只需少量外围元件便可组成射频收发电路。与蓝牙不同的是,nRF 2401没有复杂的通信协议,它完全对用户透明,同种产品之间可以自由通信。更重要的是,nRF 2401比蓝牙产品更便宜。所以nRnRF 2401是业界体积最小、功耗最少、外围元件最少的低成本射频系统级芯片。
3.1.芯片结构、引脚说明
nRF2401内置地址解码器、先入先出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器,功率放大器等功能模块,需要很少的外围元件,因此使用起来非常方便。QFN24引脚封装,外形尺寸只有5×5mm。nRF2401的功能模块如图1所示。

3.2芯片结构
作模式工
nRF2401有工作模式有四种:收发模式、配置模式、空闲模式和关机模式。nRF2401的工作模式由PWR_UP 、CE、TX_EN和CS三个引脚决定,详见表2。
表2:nRF2401工作模式
3.3 收发模式
nRF2401的收发模式有ShockBurstTM收发模式和直接收发模式两种,收发模式由器件配置字决定,具体配置将在器件配置部分详细介绍。
3.4.ShockBurstTM收发模式
ShockBurstTM收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入,但高速(1Mbps)发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射速率。与射频协议相关的所有高速信号处理都在片内进行,这种做法有三大好处:尽量节能;低的系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。nRF2401的ShockBurstTM技术同时也减小了整个系统的平均工作电流。
在ShockBurstTM收发模式下,nRF2401自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,当发送过程完成后,数据准备好引脚通知微处理器数据发射完毕。
3.4.1 ShockBurstTM发射流程
接口引脚为CE,CLK1,DATA
A. 当微控制器有数据要发送时,其把CE置高,使nRF2401工作;
B. 把接收机的地址和要发送的数据按时序送入nRF2401;
C. 微控制器把CE置低,激发nRF2401进行ShockBurstTM发射;
D. nRF2401的ShockBurstTM发射
² 给射频前端供电;
² 射频数据打包(加字头、CRC校验码);
² 高速发射数据包;
² 发射完成,nRF2401进入空闲状态。
3.4.2 ShockBurstTM接收流程
接口引脚CE、DR1、CLK1和DATA(接收通道1)
A. 配置本机地址和要接收的数据包大小;
B. 进入接收状态,把CE置高;
C. 200us后,nRF2401进入监视状态,等待数据包的到来;
D. 当接收到正确的数据包(正确的地址和CRC校验码),nRF2401自动把字头、地址和CRC校验位移去;
E. nRF2401通过把DR1(这个引脚一般引起微控制器中断)置高通知微控制器;
F. 微控制器把数据从nRF2401移出;
G. 所有数据移完,nRF2401把DR1置低,此时,如果CE为高,则等待下一个数据包,如果CE为低,开始其它工作流程。
3.5.1直接收发模式
在直接收发模式下,nRF2401如传统的射频收发器一样工作。
3.5.2直接发送模式
接口引脚为CE、DATA
A. 当微控制器有数据要发送时,把CE置高;
B. nRF2401射频前端被激活;
C. 所有的射频协议必须在微控制器程序中进行处理(包括字头、地址和CRC校验码)。
3.5.3直接接收模式
接口引脚为CE、CLK1和DATA
A. 一旦nRF2401被配置为直接接收模式,DATA引脚将根据天线接收到的信号开始高低变化(由于噪声的存在);
B. CLK1引脚也开始工作;
C. 一旦接收到有效的字头,CLK1引脚和DATA引脚将协调工作,把射频数据包以其被发射时的数据从DATA引脚送给微控制器;
D. 这头必须是8位;
E. DR引脚没用上,所有的地址和CRC校验必须在微控制器内部进行。
3.5.4配置模式
在配置模式,15字节的配置字被送到nRF2401,这通过CS、CLK1和DATA三个引脚完成,具体的配置方法请参考本文的器件配置部分。
3.5.5空闲模式
nRF2401的空闲模式是为了减小平均工作电流而设计,其最大的优点是,实现节能的同时,缩短芯片的起动时间。在空闲模式下,部分片内晶振仍在工作,此时的工作电流跟外部晶振的频率有关,如外部晶振为4MHz时工作电流为12uA,外部晶振为16MHz时工作电流为32uA。在空闲模式下,配置字的内容保持在nRF2401片内。
3.5.6关机模式
在关机模式下,为了得到最小的工作电流,一般此时的工作电流小于1uA。关机模式下,配置字的内容也会被保持在nRF2401片内,这是该模式与断电状态最大的区别。
3.6. 器件配置
nRF2401的所有配置工作都是通过CS、CLK1和DATA三个引脚完成,把其配置为ShockBurstTM收发模式需要15字节的配置字,而如把其配置为直接收发模式只需要2字节的配置字。由上文对nRF2401工作模式的介绍,我们可以知道,nRF2401一般工作于ShockBurstTM收发模式,这样,系统的程序编制会更加简单,并且稳定性也会更高,因此,下文着重介绍把nRF2401配置为ShockBurstTM收发模式的器件配置方法。
ShockBurstTM的配置字使nRF2401能够处理射频协议,在配置完成后,在nRF2401工作的过程中,只需改变其最低一个字节中的内容,以实现接收模式和发送模式之间切换。ShockBurstTM的配置字可以分为以下四个部分:
数据宽度:声明射频数据包中数据占用的位数。这使得nRF2401能够区分接收数据包中的数据和CRC校验码;
地址宽度:声明射频数据包中地址占用的位数。这使得nRF2401能够区分地址和数据;
地址:接收数据的地址,有通道1的地址和通道2的地址;
CRC:使nRF2401能够生成CRC校验码和解码。
当使用nRF2401片内的CRC技术时,要确保在配置字中CRC校验被使能,并且发送和接收使用相同的协议。nRF2401配置字的各个位的描述如表3所示。
在配置模式下,注意保证PWR_UP引脚为高电平,CE引脚为低电平。配置字从最高位开始,依次送入nRF2401。在CS引脚的下降沿,新送入的配置字开始工作。
3.7. 应用电路
图2为nRF2401的应用电路,由图可知,其只需要14个外围元件。nRF2401应用电路一般工作于3V,它可用多种低功耗微控制器进行控制。在设计过程中,设计者可使用单鞭天线或环形天线,上图为50欧姆单鞭天线的应用电路。在使用不同的天线时,为了得到尽可能大的收发距离,电感电容的参数应适当调整。
3.6. PCB设计
PCB设计对nRF2401的整体性能影响很大,所以PCB设计在nRF2401收发系统的开发过程中主要的工作之一,在PCB设计时,必须考虑到各种电磁干扰,注意调整电阻、电容和电感的位置,特别要注意电容的位置。
nRF2401的PCB一般都是双层板,底层一般不放置元件,为地层,顶层的空余地方一般都敷上铜,这些敷铜通过过孔与底层的地相连。直流电源及电源滤波电容尽量靠近VDD引脚。nRF2401的供电电源应通过电容隔开,这样有利于给nRF2401提供稳定的电源。在PCB中,尽量多打一些通孔,使顶层和底层的地能够充分接触。
4.三种方案比较论证
nRF401工作速率最高达20Kbit/s应用时偏低。 接口芯片采用美信公司的RS232转换芯片MAX3316,完成单片机和计算机RS232接口的电平转换及数据发送、接收、请求、清除功能。在nRF401芯片使用时,设定好工作频率,进入正常工作状态后,通过单片机根据需要进行收发转换控制,发送/接收数据或进行状态转换。在设计程序时,要注意各状态转换的时延。通信协议的设计nRF401是程序繁杂难以在短时间内调试好。平时大多数情况下应处于关闭状态,由于无线部分硬件上是不具备自动唤醒功能的,为了达到节能的目的,必须通过软件方式采用合理的通信协议以保证节能同时不丢失数据。接收模式转换为发射模式的转换时间至少为1ms;可以发送任意长度的数据;发射模式转换为接收模式的转换时间至少为3ms。在待机模式时,电路进入待机状态,电路不接收和发射数据。待机模式转换为发射模式的转换时间至少为4ms;待机模式转换为接收模式的转换时间至少为5.0ms。延时问题也需要程序弥补不好调试。
nRF905工作速率最高达100Kbit/s,频道之间的转换时间小于650us。与射频数据包有关的高速信号处理都在nRF905片内进行,数据速率由微控制器配置的SPI接口决定,数据在微控制器中低速处理,但在nRF905中高速发送,因此中间有很长时间的空闲,这很有利于节能。与nRF401相比与相当大的改进。当微控制器有数据要发送时,通过SPI接口,按时序把接收机的地址和要发送的数据送传给nRF905,SPI接口的速率在通信协议和器件配置时确定;微控制器置高TRX_CE和TX_EN,激发nRF905的ShockBurstTM发送模式;射频寄存器自动开启;数据打包(加字头和CRC校验码);发送数据包;当数据发送完成,数据准备好引脚被置高;当数据发送完成,数据准备好引脚被置高当TRX_CE被置低,nRF905发送过程完成,自动进入空闲模式。ShockBurstTM工作模式保证,一旦发送数据的过程开始,无论TRX_EN和TX_EN引脚是高或低,发送过程都会被处理完。只有在前一个数据包被发送完毕,nRF905才能接受下一个发送数据包。
nRF2401芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。nRF2401内置地址解码器、先入先出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器,功率放大器等功能模块,需要很少的外围元件,因此使用起来非常方便。该器件有125个频点,能够实现点对点、点对多点的无线通信,同时可采用改频和跳频来避免干扰。nRF2401最大传输速率可达1Mbit/s,其最大发射功率为-5dBm,在比较理想环境中,其室内传输距离可达50~90米,室外传输距离可达100-200米。nRF2401的灵敏度为-90dBm,工作电压为1.9V~3.3,工作温度范围为-40~+80℃。在ShockBurstTM收发模式下,nRF2401自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,当发送过程完成后,数据准备好引脚通知微处理器数据发射完毕。
1 ShockBurstTM发射流程
接口引脚为CE,CLK1,DATA
A. 当微控制器有数据要发送时,其把CE置高,使nRF2401工作;
B. 把接收机的地址和要发送的数据按时序送入nRF2401;
C. 微控制器把CE置低,激发nRF2401进行ShockBurstTM发射;
D. nRF2401的ShockBurstTM发射
1 给射频前端供电;
2 射频数据打包(加字头、CRC校验码);
3 高速发射数据包;
4 发射完成,nRF2401进入空闲状态。
2 ShockBurstTM接收流程
接口引脚CE、DR1、CLK1和DATA(接收通道1)
A. 配置本机地址和要接收的数据包大小;
B. 进入接收状态,把CE置高;
C. 200us后,nRF2401进入监视状态,等待数据包的到来;
D. 当接收到正确的数据包(正确的地址和CRC校验码),nRF2401自动把字头、地址和CRC校验位移去;
E. nRF2401通过把DR1(这个引脚一般引起微控制器中断)置高通知微控制器;
F. 微控制器把数据从nRF2401移出;有空闲模式降低功耗,发送数据打包,
G. 所有数据移完,nRF2401把DR1置低,此时,如果CE为高,则等待下一个数据包,如果CE为低,开始其它工作流程。
3.直接发送模式
接口引脚为CE、DATA
A. 当微控制器有数据要发送时,把CE置高;
B. nRF2401射频前端被激活;
C. 所有的射频协议必须在微控制器程序中进行处理(包括字头、地址和CRC校验码)。
4.直接接收模式
接口引脚为CE、CLK1和DATA
A. 一旦nRF2401被配置为直接接收模式,DATA引脚将根据天线接收到的信号开始高低变化(由于噪声的存在);
B. CLK1引脚也开始工作;
C. 一旦接收到有效的字头,CLK1引脚和DATA引脚将协调工作,把射频数据包以其被发射时的数据从DATA引脚送给微控制器;
D. 这头必须是8位;
E. DR引脚没用上,所有的地址和CRC校验必须在微控制器内部进行。
nRF2401通过ShockBurstTM收发模式进行无线数据发送,收发可靠度高。
总结:nRF401电路焊接多、程序繁杂,调试不好实现,发送频率低,频道转换时间长,容易丢数据包,出错率高。所以不选用nRF401nRF905 发送频率可以,由微控制口SPI写发送数据,ShockBurstTM发送模式;射频寄存器自动开启;数据打包(加字头和CRC校验码);发送数据包;当数据发送完成,数据准备好引脚被置高;当数据发送完成,数据准备好引脚被置高当TRX_CE被置低,nRF905发送过程完成,自动进入空闲模式。可是nRF905的微控制器配置的SPI及寄存器配置繁杂给系统调试带来麻烦。射频寄存器的各位的长度是固定所有信息都有SPI来实现。所以不选用nRF905nRF2401发射功率大,本身功耗低,灵敏度高,并且有nRF905的所有优越性的无线数字收发性能,且使我们的系统调试更加快速。也是与整个系统匹配的最佳选择。它的直接发送模式和直接接收模式是优于其它模块的特色。所以最终选择nRF2401
结果也证明了nRF2401确实是实现无线数字收发的可靠选择。
四、硬件系统设计:
1硬件控制系统PS/2电脑键盘
因为整个系统需要控制的键许多。十六个通道,两个电机控制,发送数据等控制键很多,所以不用单键及小键盘,通过键盘编码传给89S52单片机,然后89S52与89C2051经过Max232实现单片机与单片机串行通信。如图示:
这样设计增加控制键又省去了不必要的设计麻烦。      
2微控制系统单片机之间实现串行通信
  
  选择89S52是因为它可通过Max232与电脑通信可观测单片机发送的数据,可以对设计串行通信发送的数据分析和改进程序。就是因为89S52这些功能才使整个系统可以应用PS/2电脑键盘。
  利用两个单片机是因为两个CPU可以提高工作效率。另外NRF2401的工作电压小于单片机的工作电压而89C2051可低电压工作。所以用89C2051实现微控制对NRF2401控制及传送数据。同时也降低了功耗,串行通信的程序中有校验程序,从而避免了错码,使NRF2401发送的数据完全正确。只有无错码才能达到无线遥控的操作正确,这样才能提高整个系统的性能。
3无线数字发射系统
利用89C2051对NRF2401传送数据和对NRF2401寄存器配置,以及对NRF2401的控制。从而实现无线数字发射
4、无线数字接受系统
   与无线数字发射系统相似用NRF2401接受数据包传给89C2051,再由89C2051与89S52 串行通信传递数据,经89S52解码后选择相应通道。
如图所示:
5通道显示系统
显示用大型号发光二极管显示。
6摄相头采集系统
电机驱动芯片
此功能是无线遥控拓展,是实现更好的无线遥控必然趋势。由此项高级功能才能完备整个系统的安全、无误的进行工作。
7监控系统设计
  利用小电视机对摄相头采集、发射的图象进行接受。如图示:
   
   8时钟显示系统
  无论工作在什么地方都需要有时间显示,在本系统中电子钟是本系统的辅助单元。可以使整个大的系统更有合理的应用价值。为操作者提供舒适环境。本系统用单片机控制,七位共阳极数码管显示有74LS04,74LS07进行驱动,且可调时等功能。
9
总结;整个的系统可用下列图示说明:

发射部分:(见附件)
接受部分

五、软件系统设计:
本系统主要是三大部分:单片机与单片机串行通信程序,对PS/2键盘编码及译码程序,单片机对nRF2401的控制及传递数据程序。
1单片机与单片机串行通信程序
2对PS/2键盘编码及译码程序
3单片机对nRF2401的控制及传递数据程序。
六、功能测试及结果分析:
七、参考书目:
黄智伟 编著 《无线数字收发电路设计》——电路原理与应用实例
周立功 等编著速成与实践——增强型80C51单片机
黄智伟 等编著 训练教程》——全国大学生电子设计竞赛
附录:部分程序
  • 1单片机对nRF2401的控制及传递数据程序
<发射程序>
  1. #include <At89x051.h>

  2. //脚的定义
  3. #define RxD         P3_0
  4. #define TxD         P3_1
  5. #define TxLED       P3_4
  6. #define RxLED       P3_5
  7. #define PWR_UP      P1_7
  8. #define CE          P1_6
  9. #define  CS         P1_2
  10. #define CLK1        P3_2
  11. #define  DR1        P1_1
  12. #define DATA        P1_0

  13. //测试用nRF2401寄存器数据
  14. const unsigned test_config[18]={
  15.         0x8e,0x08,0x1e,   
  16.         0x08,0x08,
  17.         0xaa,0xbb,0xcc,0xdd,0xee,
  18.         0xaa,0xbb,0xcc,0xdd,0xee,
  19.         0xa3,0x2f,        
  20.         0x64              
  21.     };
  22. //RF2401寄存器数据
  23. const unsigned configbyte[18]={
  24.                 0x8e,0x08,0x1c,        
  25.                 0x08,0x08,
  26.                 0xaa,0xbb,0xcc,0xdd,0xee,
  27.                 0xaa,0xbb,0xcc,0xdd,0xee,
  28.                 0xa3,0x6f,            
  29.                 0x64         
  30.         };

  31. unsigned char rx_data_buf[1];  
  32. unsigned char increase_data;
  33. unsigned char task_switch;
  34. unsigned char get_tx_data_for_pc();
  35. void system_init(void);
  36. void write_spi_one_byte(unsigned char data_buf);
  37. void config_2401(void);
  38. void config_test(void);
  39. void delay_ms(unsigned int delay_counter);
  40. void send_data(unsigned input_data);
  41. void send_data_rf(void);
  42. void transmit_mode(void);
  43. void main(void);

  44. //系统初始化
  45. void system_init(void)
  46. {
  47.     unsigned char i;

  48.     PWR_UP=0;
  49.     CE=0;
  50.     CS=0;
  51.     CLK1=0;
  52.     DATA=0;         
  53.     for(i=0;i<8;i++)           
  54.         rx_data_buf[i]=0;
  55.     config_2401();
  56.     delay_ms(2);

  57.     TxLED=0;      
  58.     RxLED=1;

  59.     TMOD=0x20;                 
  60.     SCON=0x50;               
  61.     TH1=0xfd;
  62.     TL1=0xfd;
  63.     TR1=1;
  64.     EA=0;
  65. }




  66. //对RF2401写数据函数

  67. void write_spi_one_byte(unsigned char data_buf)
  68. {
  69.     unsigned char i;
  70.     unsigned char j;

  71.     j=0x80;//0b10000000
  72.     while(j>0)
  73.     {
  74.         i=data_buf&j;
  75.         if(i==0)
  76.             DATA=0;
  77.         else
  78.             DATA=1;
  79.         CLK1=1;
  80.         j>>=1;
  81.         CLK1=0;
  82.     }
  83. }
  84. //对RF2401寄存器写数据
  85. void config_2401(void)
  86. {
  87.     unsigned char i;
  88.     PWR_UP=1;                     
  89.     delay_ms(5);                 
  90.     CE=0;                        
  91.     CS=1;                        

  92.     i=1;                        
  93.     while(i--);

  94.     for(i=0;i<18;i++)
  95.         write_spi_one_byte(configbyte[i]);

  96.     CS=0;
  97.     DATA=0;
  98.     CE=1;
  99. }
  100. //系统测试
  101. void config_test(void)
  102. {
  103.     unsigned char i;

  104.     PWR_UP=1;                     
  105.     delay_ms(5);                  
  106.     CE=0;                          
  107.     CS=1;                        

  108.     i=1;                        
  109.     while(i--);

  110.     for(i=0;i<18;i++)
  111.         write_spi_one_byte(test_config[i]);

  112.     CS=0;
  113.     DATA=0;
  114.     CE=1;                        
  115. }
  116. //延时函数
  117. void delay_ms(unsigned int delay_counter)
  118. {
  119.     unsigned int i;

  120.     while(delay_counter--)
  121.     {
  122.         i=81;
  123.         while(i--);
  124.     }
  125. }
  126. //发射数据函数
  127. void send_data(unsigned input_data)
  128. {
  129.     unsigned char i;

  130.     PWR_UP=1;            
  131.     delay_ms(5);         

  132.     CE=1;                 

  133.     i=1;                  
  134.     while(i--);

  135.     write_spi_one_byte(0xaa);        
  136.     write_spi_one_byte(0xbb);         
  137.     write_spi_one_byte(0xcc);         
  138.     write_spi_one_byte(0xdd);         
  139.     write_spi_one_byte(0xee);         

  140.     for(i=0;i<1;i++)
  141.         write_spi_one_byte(input_data);


  142.     CE=0;                 

  143.     i=50;                                    
  144.         while(i--);

  145.         PWR_UP=0;            
  146. }
  147. //从串行获的数据
  148. unsigned char  get_tx_data_for_pc()
  149. {  unsigned char  chuanh=0x00;
  150.     while(RI==0);
  151.     chuanh=SBUF ;
  152.     RI=0;
  153.     return(chuanh);

  154. }


  155. //从RF2401发射数据
  156. void send_data_rf(void)
  157. {       increase_data=get_tx_data_for_pc();
  158.         TxLED=0;              
  159.         send_data(increase_data);
  160.         delay_ms(1);
  161.         TxLED=1;            
  162.         delay_ms(1);

  163. }
  164. //主函数
  165. void main(void)
  166. {
  167.     system_init();

  168.     while (1)
  169.     {

  170.           send_data_rf();        

  171.         }
  172.     }

  173. 2单片机对nRF2401的控制及传递数据程序
  174. <接收程序>
  175. #include <At89x051.h>

  176. //脚的定义
  177. #define RxD         P3_0
  178. #define TxD         P3_1
  179. #define TxLED       P3_4
  180. #define RxLED       P3_5
  181. #define PWR_UP      P1_7
  182. #define CE          P1_6
  183. #define  CS         P1_2
  184. #define CLK1        P3_2
  185. #define  DR1        P1_1
  186. #define DATA        P1_0

  187. //测试
  188. const unsigned test_config[18]={
  189.         0x8e,0x08,0x1e,   
  190.         0x08,0x08,
  191.         0xaa,0xbb,0xcc,0xdd,0xee,
  192.         0xaa,0xbb,0xcc,0xdd,0xee,
  193.         0xa3,0x2f,        
  194.         0x64            
  195.     };
  196. //2401寄存器数据
  197. const unsigned configbyte[18]={
  198.                 0x8e,0x08,0x1c,        
  199.                 0x08,0x08,
  200.                 0xaa,0xbb,0xcc,0xdd,0xee,
  201.                 0xaa,0xbb,0xcc,0xdd,0xee,
  202.                 0xa3,0x6f,            
  203.                 0x65         

  204.         };

  205. unsigned char rx_data_buf[1];     
  206. unsigned char increase_data;
  207. void system_init(void);
  208. void write_spi_one_byte(unsigned char data_buf);
  209. void config_2401(void);
  210. void config_test(void);
  211. void receive_data(unsigned payload_length);
  212. unsigned char read_spi_one_byte(void);
  213. void delay_ms(unsigned int delay_counter);
  214. void receive_mode(void);
  215. void main(void);

  216. //系统初始化
  217. void system_init(void)
  218. {
  219.     unsigned char i;

  220.     PWR_UP=0;
  221.     CE=0;
  222.     CS=0;
  223.     CLK1=0;
  224.     DATA=0;


  225.     for(i=0;i<8;i++)         
  226.         rx_data_buf[i]=0;  

  227.     config_2401();
  228.     delay_ms(2);

  229.     TxLED=0;      
  230.     RxLED=1;

  231.     TMOD=0x20;               
  232.     SCON=0x50;              
  233.     TH1=0xfd;
  234.     TL1=0xfd;
  235.     TR1=1;
  236.     EA=0;
  237. }
  238. //从串行传数据

  239. void send_rx_data_to_pc(unsigned char payload_length)
  240. {

  241.         TI=0;
  242.         SBUF=rx_data_buf[0];
  243.         while(TI==0);

  244. }
  245. //对寄存器写数据

  246. void write_spi_one_byte(unsigned char data_buf)
  247. {
  248.     unsigned char i;
  249.     unsigned char j;

  250.     j=0x80;//0b10000000
  251.     while(j>0)
  252.     {
  253.         i=data_buf&j;
  254.         if(i==0)
  255.             DATA=0;
  256.         else
  257.             DATA=1;
  258.         CLK1=1;
  259.         j>>=1;
  260.         CLK1=0;
  261.     }
  262. }
  263. //对RF2401写寄存器数据
  264. void config_2401(void)
  265. {
  266.     unsigned char i;
  267.     PWR_UP=1;                     
  268.     delay_ms(5);                  
  269.     CE=0;                        
  270.     CS=1;                          

  271.     i=1;                          
  272.     while(i--);

  273.     for(i=0;i<18;i++)
  274.         write_spi_one_byte(configbyte[i]);

  275.     CS=0;
  276.     DATA=0;
  277.     CE=1;
  278. }
  279. //测试
  280. void config_test(void)
  281. {
  282.     unsigned char i;

  283.     PWR_UP=1;                     
  284.     delay_ms(5);                  
  285.     CE=0;                          
  286.     CS=1;                          

  287.     i=1;                           
  288.     while(i--);

  289.     for(i=0;i<18;i++)
  290.         write_spi_one_byte(test_config[i]);

  291.     CS=0;
  292.     DATA=0;
  293.     CE=1;                          
  294. }
  295. //接收数据
  296. void receive_data(unsigned payload_length)
  297. {
  298.     unsigned char i;

  299.     for(i=0;i<payload_length;i++)
  300.         rx_data_buf[i]=read_spi_one_byte();
  301. }
  302. //对RF2401写数据

  303. unsigned char read_spi_one_byte(void)
  304. {
  305.     unsigned char j;
  306.     unsigned char data_buf;

  307.     j=0x80;
  308.     while(j>0)
  309.     {
  310.                   DATA=1;
  311.         data_buf<<=1;
  312.         if(DATA==1)
  313.             data_buf|=0x01;
  314.         CLK1=1;
  315.         j>>=1;
  316.         CLK1=0;
  317.     }
  318.     return data_buf;
  319. }
  320. //延时
  321. void delay_ms(unsigned int delay_counter)
  322. {
  323.     unsigned int i;

  324.     while(delay_counter--)
  325.     {
  326.         i=81;
  327.         while(i--);
  328.     }
  329. }


  330. //接收数据
  331. void receive_mode(void)
  332. {
  333.     //change_rf_txrx_mode(1);        //Change the RF to the receive mode
  334.     while(START_SW!=0)
  335.     {
  336.         if(DR1==1)
  337.         {
  338.             RxLED=0;
  339.             receive_data(8);
  340.                       delay_ms(50);
  341.             RxLED=1;
  342.             send_rx_data_to_pc(8);
  343.         }
  344.     }

  345. }
  346. //主函数
  347. void main(void)
  348. {
  349.     system_init();

  350.     while (1)
  351.     {

  352.                 receive_mode();        

  353.         }
  354.     }
复制代码

完整的Word格式文档51黑下载地址:
无线遥控设计资料.rar (646.15 KB, 下载次数: 27)
回复

使用道具 举报

ID:295477 发表于 2018-3-22 14:44 | 显示全部楼层
不错 好好收藏一下
回复

使用道具 举报

ID:335709 发表于 2018-7-4 11:52 | 显示全部楼层
谢谢!先收藏了,待研究。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表