基于AVR无线图像传输Word格式文档下载.docx
《基于AVR无线图像传输Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于AVR无线图像传输Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
12
2.5.6.NRF24L01电路部分:
13
2.5.7.NRF24L01的使用:
14
3.系统设计15
3.1.1.发射和接收主控板系统电路图15
3.1.2.主电路图16
3.1.3.程序流程图:
17
致谢18
参考文献18
附录一:
19
发射接收主要程序分析:
1.作品概述
以单片机ATMEGA16为平台,使用两组单片机,一个做主机,一个作从机。
主机,即发射端,用软件编程,把图像制作成相应格式的编码,通过AVR单片机,把控制命令和数据写入到NRF24L01。
NRF24L01以16位CRC校验后把命令和数据发射出去。
接收端的NRF24L01接收信号之后通过一定的时序传送给从机ATMEGA16,经过单片机处理程序之后,发送到液晶上面显示,实现了2.4G的无线图像传输。
2.系统功能分析
采用ATMEGA16单片机作为微处理器,外围电路包括:
1开关电源电路
2②AVR最小系统
32.4G无线发射单元;
接收端电路包括:
①AVR最小系统
②开关电源电路
2.4G无线接收单元
④LCD12864液晶显示单元;
2.1AVR最小系统
2.1.1.主控芯片ATMEGA16原理
32个可编程的I/O口
16K字节的系统内可编程FLASH
512字节的EEPROM
1K字节的片内SRAM
32个通用工作寄存器,所有的寄存器都直接与算术逻辑单元(ALU)相连接。
在典型的ALU操作中,两个位于寄存器文件中的操作数同时被访问,然后执行运算,结果再被送回到寄存器文件。
用于边界扫描的JTAG接口,支持片内调试与编程。
片内16K字节的ISPFlash允许程序存储器通过ISP串行接口进行在线程序下载
六个可以通过软件进行选择的省电模式:
空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式
引脚说明:
图1芯片ATMEGA16
VCC数字电路的电源
GND地
端口A(PA7..PA0)端口A做为A/D转换器的模拟输入端。
端口A为8位双向I/O口,具有可编程的内部上拉电阻。
其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。
作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。
在复位过程中,即使系统时钟还未起振,端口A处于高阻状态。
端口B(PB7..PB0)端口B为8位双向I/O口,具有可编程的内部上拉电阻。
在复位过程中,即使系统时钟还未起振,端口B处于高阻状态。
端口B也可以用做其他不同的特殊功能
端口C(PC7..PC0)端口C为8位双向I/O口,具有可编程的内部上拉电阻。
在复位过程中,即使系统时钟还未起振,端口C处于高阻状态。
如果JTAG接口使能,即使复位出现引脚PC5(TDI)、PC3(TMS)与PC2(TCK)的上拉电阻被激活。
端口D(PD7..PD0)端口D为8位双向I/O口,具有可编程的内部上拉电阻。
作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。
在复位过程中,即使系统时钟还未起振,端口D处于高阻状态。
端口D也可以用做其他不同的特殊功能
RESET复位输入引脚。
持续时间超过最小门限时间的低电平将引起系统复位。
持续时间小于门限间的脉冲不能保证可靠复位。
XTAL1反向振荡放大器与片内时钟操作电路的输入端。
XTAL2反向振荡放大器的输出端。
AVCCAVCC是端口A与A/D转换器的电源。
不使用ADC时,该引脚应直接与VCC连接。
使用ADC时应通过一个低通滤波器与VCC连接。
AREFA/D的模拟基准输入引脚。
2.2AVR外围硬件线路
1.复位线路
2.晶振线路
3.AD转换滤波线路
4.ISP下载接口
5.JTAG仿真接口
6.电源
2.2.1.复位线路的设计
Mega16已经内置了上电复位设计。
并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:
直接拉一只10K的电阻到VCC即可(R0)。
为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。
当AVR在工作时,按下S0开关时,复位脚变成低电平,触发AVR芯片复位。
重要说明:
实际应用时,如果你不需要复位按钮,复位脚可以不接任何的零件,AVR芯片也能稳定工作。
即这部分不需要任何的外围零件。
2.2.2.晶振电路的设计
Mega16内置RC振荡线路,可以产生1M、2M、4M、8M的振荡频率。
2.2.3.AD转换滤波线路的设计
为减小AD转换的电源干扰,Mega16芯片有独立的AD电源供电。
建议在VCC串上一只10uH的电感(L1),然后接一只0.1uF的电容到地(C3)。
Mega16内带2.56V标准参考电压。
实际应用时,如果你想简化线路,可以将AVCC直接接到VCC,AREF悬空。
2.2.4.JTAG仿真接口设计
仿真接口也是使用双排2*5插座。
需要四只10K的上拉电阻。
实际应用时,如果你不想使用JTAG仿真,并且不想受四只10K的上拉电阻的影响,可以将JP1-JP4断开。
2.3LM2596功能
2.3.1.LM2596开关电压调节器
LM2596开关电压调节器是降压型电源管理单片集成电路,能够输出3A的驱动电流,同时具有很好的线性和负载调节特性。
固定输出版本有3.3V、5V、12V,可调版本可以输出1.2V~37V之间的各种电压。
2.3.2.LM2596开关电压调节器特点
※3.3V、5V、12V的固定电压输出和可调电压输出
※可调输出电压范围1.2V~37V±
4%
※输出线性好且负载可调节
※输出电流可高达3A
※输入电压可高达40V
※采用150KHz的内部振荡频率,属于第二代开关电压调节器,功耗小、效率高
※低功耗待机模式,IQ的典型值为80μA
※TTL断电能力
※具有过热保护和限流保护功能
※封装形式:
TO-220(T)和TO-263(S)
※外围电路简单,仅需4个外接元件,且使用容易购买的标准电感
2.3.3.
典型应用(固定输出)
图2LM2596固定输出
2.3.4.LM2596端口用法
VIN正输入端,在这个管脚处必须加一个适当的输入旁路电容来减小暂态电压,同时为LM2596提供所需的开关电流。
GND接地端。
Output输出端,这个脚上的电压可在(+VIN-VSAT)和-0.5V(大约)间转换。
为了减小耦合,PCB上连接到该脚的铜线区域要尽量小。
Feedback反馈端,这个管脚把输出端的电压反馈到闭环反馈回路。
2.4LCD12864功能
图3LCD12864
1#Vss逻辑电源地
2#VDD 逻辑电源正 5v
3#V0 LCD驱动电压
4#RS 数据/指令选择:
高电平为数据,低电平为指令
5#R/W 读/写选择:
高电平为读数据,低电平为写数据
6#E 读写使能,高电平有效,下降沿锁定数据
7#DB0 数据输入输出引脚
8#DB1 数据输入输出引脚
9#DB2 数据输入输出引脚
10#DB3 数据输入输出引脚
11#DB4 数据输入输出引脚
12#DB5 数据输入输出引脚
13#DB6 数据输入输出引脚
14#DB7 数据输入输出引脚
15#CS1 片选择号,低电平时选择前64列
16#CS2 片选择号,低电平时选择后64列
17#RET 复位信号,低电平有效。
18#VEE 输出-15v电源给V0提供驱动电源
19#A 背光电源LED正极
20#K 背光电源LED负极
图4LCD12864接口说明
具体的电路还是两个电阻。
一个背光限流电阻。
一个液晶驱动电压调节电阻。
背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。
调节电位器到合适亮度。
具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。
液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。
中间接V0,通过调节电位器来调节V0上的电压。
当V0上为-15V时为全暗(液晶显示为全黑)。
当V0为0V时为全亮。
调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。
待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。
注意在V0的电压是在一个很小的范围有效。
我的就是在-2.2——-2.5这个范围。
仔细调节V0和地之间的电阻使V0上的电压在2.3V。
2.5NRF24L01功能
2.5.1.NRF24L01作用及原理
NRF24L01是一款新型单片射频收发器件,工作于2.4GHz~2.5GHzISM频段。
内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。
NRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;
接收时,工作电流只有12.3mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。
发射数据:
首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10us,延迟130us后发射数据:
若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。
如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除;
若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC—CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;
MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。
最后发射成功时,若CE为低则nRF24L0l进入空闲模式1;
若发送堆栈中有数据且CE为高,则进入下一次发射;
若发送堆栈中无数据且CE为高,则进入空闲模式2。
接收数据:
首先将nRF24L01配置为接收模式,接着延迟130s进入接收状态等待数据的到来。
当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ变低,以便通知MCU去取数据。
若此时自动应答开启,接收方则同时进入发射状态回传应答信号。
最后接收成功时,若CE变低,则nRF24L0l进入空闲模式1。
CE,CSN,SCK,MOSI,MISO,IRQ这6个管脚为该芯片的控制引脚。
微处理器通过对这6个引脚的控制就可以决定该芯片的工作模式。
当PWR_UP、PRIM_RX和CE为“111”时,L01处于接收模式;
为“101”时处于发射模式;
为“1X0”时处于空闲模式1;
为“0XX”时处于掉电模式。
nRF24L01引脚功能:
CE:
使能发射或接收;
CSN,SCK,MOSI,MISO:
SPI引脚端,微处理器可通过此引脚配置nRF24L01;
IRQ:
中断标志位;
VDD:
电源输入端;
VSS:
电源地;
XC2,XC1:
晶体振荡器引脚;
VDD_PA:
为功率放大器供电,输出为1.8V;
ANT1,ANT2:
天线接口;
IREF参考电流输入。
图5nRF24L01引脚排列
说明:
(1)VCC脚接电压范围为1.9V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。
推荐电压3.3V左右。
(2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。
当然对3V左右的单片机更加适用了。
待机模式I在保证快速启动的同时减少系统平均消耗电流。
在待机模式I下,晶振正常工作。
在待机模式II下部分时钟缓冲器处在工作模式。
当发送端TXFIFO寄存器为空并且CE为高电平时进入待机模式II。
在待机模式期间,寄存器配置字内容保持不变。
在掉电模式下,nRF24L01各功能关闭,保持电流消耗最小。
进入掉电模式后,nRF24L01停止工作,但寄存器内容保持不变。
启动时间见表格13。
掉电模式由寄存器中PWR_UP位来控制
nRF24L01有如下几种数据包处理方式:
ShockBurstTM(与nRF2401,nRF24E1,nRF2402,nRF24E2数据传输率为1Mbps时相同)增强型ShockBurstTM模式
ShockBurstTM模式:
ShockBurst模式下nRF24L01可以与成本较低的低速MCU相连。
高速信号处理是由芯片内部的射频协议处理的,nRF24L01提供SPI接口,数据率取决于单片机本身接口速度。
ShockBurst模式通过允许与单片机低速通信而无线部分高速通信,减小了通信的平均消耗电流。
在ShockBurstTM接收模式下,当接收到有效的地址和数据时IRQ通知MCU,随后MCU可将接收到的数据从RXFIFO寄存器中读出。
在ShockBurstTM发送模式下,nRF24L01自动生成前导码及CRC校验,参见表格12。
数据发送完毕后IRQ通知MCU。
减少了MCU的查询时间,也就意味着减少了MCU的工作量同时减少了软件的开发时间。
nRF24L01内部有三个不同的RXFIFO寄存器(6个通道共享此寄存器)和三个不同的TXFIFO寄存器。
在掉电模式下、待机模式下和数据传输的过程中MCU可以随时访问FIFO寄存器。
这就允许SPI接口可以以低速进行数据传送,并且可以应用于MCU硬件上没有SPI接口的情况下。
增强型的ShockBurstTM模式:
增强型ShockBurstTM模式可以使得双向链接协议执行起来更为容易、有效。
典型的双向链接为:
发送方要求终端设备在接收到数据后有应答信号,以便于发送方检测有无数据丢失。
一旦数据丢失,通过重新发送功能将丢失的数据恢复。
增强型的ShockBurstTM模式可同时控制应答及重发功能而无需增加MCU工作量。
2.5.6.
NRF24L01电路部分:
图6电路图
图7PCB版图
使用nRF2401进行发送数据时,采用以下的步骤:
(1)CE置高,使nRF2401开始工作;
(2)逐位写入接收机的地址;
(3)逐位写入要传送的数据;
(4)CE置低,激发nRF2401进行ShockBurstTM发射。
EnhancedShockBurstTM发射流程:
A.把接收机的地址和要发送的数据按时序送入NRF24L01;
B.配置CONFIG寄存器,使之进入发送模式。
C.微控制器把CE置高(至少10us),激发NRF24L01进行EnhancedShockBurstTM发射;
D.NRF24L01的EnhancedShockBurstTM发射
(1)给射频前端供电;
(2)射频数据打包(加字头、CRC校验码);
(3)高速发射数据包;
(4)发射完成,NRF24L01进入空闲状态。
EnhancedShockBurstTM接收流程:
A.配置本机地址和要接收的数据包大小;
B.配置CONFIG寄存器,使之进入接收模式,把CE置高;
C.130us后,NRF24L01进入监视状态,等待数据包的到来;
D.当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去;
E.NRF24L01通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
F.微控制器把数据从NewMsg_RF2401读出;
G.所有数据读取完毕后,可以清除STATUS寄存器。
NRF2401可以进入四种主要的模式之一。
3.系统设计
3.1.1.发射和接收主控板系统电路图
3.1.2.
主电路图
图8发射流程图图9接收流程图
致谢
经过自己不懈努力地查资料、制作毕业设计、写作论文,终于顺利的完成了自己的毕业设计和论文。
毕业设计得以完成,首先要感谢我的班主任晏凯老师和指导老师孙光老师,在他们耐心的指导下,给我们指明了创作的方向,还有帮助我的同学,在此,向你们表示崇高的敬意和衷心的感谢!
另外,还要感谢传授我知识的所有可爱的老师们,有你们悉心教导使我很好地掌握专业课知识,通过此次的毕业设计,我学到了很多知识,在论文的写作过程中,通过查资料和搜集有关的文献,更深层次地体现并再次提高了我的自学能力和动手能力。
总之,此次毕业设计让我受益匪浅,也为大学四年划上了一个圆满的句号,也为将来的人生之路做好了个很好的铺垫。
再次感谢传授我知识以及给我帮助和鼓励的老师,同学和朋友们,谢谢你们!
最后,感谢百忙之中抽时间参与本论文答辩的各位老师!
谢谢!
参考文献
[1]单片机原理及接口技术
[2]《电路设计与制版PROTEL99入门与提高》高鹏、安涛编著人民邮电出版社
[3]LCD12864说明书
[3]NRF24L01说明书
发射电路主要程序:
NRF24L01初始化:
voidinit_NRF24L01(void)
{
Low_24L01_CE;
//chipenable
Hign_24L01_CSN;
//Spidisable
Low_24L01_SCK;
//Spiclocklineinithigh
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,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);
SPI_RW_Reg(WRITE_REG+SETUP_AW,0X02);
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
Delay(6000);
}
NRF24L01发送数据设置:
voidnRF24L01_TxPacket(char*tx_buf)
Low_24L01_CE;
//StandBySPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
Hign_24L01_CE;
Delay(600);
无线图像接收主要程序:
charnRF24L01_RxPacket(char*rx_buf)
charrevale=0;
sta=SPI_Read(STATUS);
if(sta&
0x40)//Å
Ð
¶
Ï
Ê
Ç
·
ñ
½
Ó
Õ
µ
ý
¾
Ý
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
//readreceivepayloadfromRX_FIFObuffer
revale=1;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
returnrevale;
NRF24L01的读写时序程序:
//*****************************************长延时*****************************************
voidDelay(ints)
unsignedinti;
for(i=0;
i<
s;
i++);
/****************************************