基于ZigBee的无线数据采集系统_第1页
基于ZigBee的无线数据采集系统_第2页
基于ZigBee的无线数据采集系统_第3页
基于ZigBee的无线数据采集系统_第4页
基于ZigBee的无线数据采集系统_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、无线数据采集控制系统的设计课 程 名 称 专业综合课程设计 课程设计总评成绩 学生姓名、学 号 学 生 专 业 班级 指 导 教 师 姓名 课程设计起止日期 2016.11.7-2016.12.1 无线数据采集控制系统的设计第1章 需求分析1.1 课程设计题目无线电子开关1.2 课程设计任务及要求 无线电子开关的设计 PC端用java编写程序通过串口给CC2530模块A发送开关等指令,CC2530模块A通过射频模块将指令以无线方式发送给CC2530模块B,CC2530模块B根据指令开灯或关灯。针对给定的任务,结合专业课程和专业知识完成系统的硬件或软件设计,对硬件设计:要求完成系统和接口设计,并

2、能动手制作和调试,对测量结果进行分析处理。设计须提供实物成果。对软件设计:要求能够熟悉 软件工具,设计其算法或者是系统结构,实现该算法和软件,能够对其计算过程进行推导或者是说明软件系统结构,并能调试成功,对实验结果进行分析处理。 通过专业综合的课程设计,使学生能够综合掌握无线传感网技术、java语言程序设计、数据库等课程的专业知识, 要求学生经过课程设计的教学环节进一步理解无线传感器网络的结构和组成原理,掌握数据采集节点,无线传输,串口通信等模块的基本设计方法,完成系统应用程序的设计。通过专业综合课程设计,提高学生电子信息系统综合设计能力。掌握电子信息系统的基本开发过程及应用方法。要求学生经过

3、课程设计的教学环节进一步理解电子信息系统的设计方法,根据所选择的对象进行应用系统的硬件和软件设计,提高学生专业的综合素质及专业能力。1.3 软硬件运行环境及开发工具软件开发环境为eclipse+ IAR Embedded Workbench硬件开发环境为CC25301.4主要芯片说明CC2530是ZigBee无线数据传输其中的一个核心芯片,它能够以非常低的总材料成本建立强的网络节点。CC2530芯片有四种不同的闪存版本:分别具32/64/128/256KB的闪存。CC2530芯片工作实具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运行模式之间的转换时间短进一步确保了低能源消耗。在业界内

4、,CC2530结合了德州仪器的业界领先的黄金单元ZigBee协议栈,提供了一个强大和完整的ZigBee解决方案。CC2530芯片共包含了40个引脚,引脚的排布如图1所示: 图1:cc2530引脚图CC2530芯片模块大致可以分为三类:CPU和内存相关的模块;外设、时钟和电源管理相关的模块以及无线电相关的模块。(1)CPU和内存:CC253x芯片系列中使用的8051CPU内核是一个单周期的8051兼容内核。(2)调试接口:执行一个专有的两线串行接口,用于内电路调试。(3)I/O控制器:负责所有通用I/O引脚。(4)五通道DMA控制器:系统可以使用一个多功能的五通道DMA控制器,使用XDATA存储

5、空间访问存储器,因此能够访问所有物理存储器。(5)定时器1:是一个16位定时器,具有定时器PWM功能。(6)内置MAC定时器:是专门为支持IEEE802.15.4,MAC或软件中其他时槽的协议设计。(7)定时器3和定时器4:是8位定时器,具有定时器/计数器/PWM功能。(8)睡眠定时器:是一个超低功耗的定时器,计算32kHz晶振或32kHzRC振荡器的周期。(9)看门狗:一个内置的看门狗,允许CC2530在固件挂起的情况下复位自身。第2章系统总体设计2.1 系统组成方案由eclipse编写上位机程序,TAR编写下位机程序,通过无线方式发送命令。如图2 图2 :设计方案 2.2系统工作原理 上位

6、机程序以轮询方式通过PC串口向ZigBee节点A发送命令light:1011,节点A通过无线方式向节点B转发命令light:1011,节点B接收到命令后点亮蓝灯,黄灯和绿灯(1点亮,0熄灭)。上位机程序以轮询方式通过PC串口向ZigBee节点A发送命令light:1011,节点A通过无线方式向节点C转发命令light:1011,节点C接收到命令后点亮蓝灯,红灯和绿灯(1点亮,0熄灭)。 2.3系统构建 PC端用java编写程序通过串口给CC2530模块A发送开关等指令,CC2530模块A通过射频模块将指令以无线方式发送给CC2530模块B和模块C,CC2530模块B和模块C根据指令开灯或关灯。

7、根据指令(light1或light2)第5位判断后缀为1或者为2,节点B和节点C分别依据指令开灯或者关灯第3章系统硬件设计3.1 主模块电路设计本系统采用TI公司生产的CC2530为核心器件。CC2530是一个真正的片上系统(SoC)解决方案,它能够以非常低的材料成本建立强大的网络节点,它结合了领先的RF收发器的优良性能、业界标准的增强型8051CPU、系统内可编程闪存、8KBRAM、A/D转换器以及许多其他强大的功能,并且其具有不同的运行模式,使得它尤其适应超低功耗要求的系统。围绕着CC2530芯片,系统大致可分为三大模块:CPU和内存相关的模块,外设、时钟和电源管理相关的模块以及无线电相关

8、的模块。3.2 显示模块电路设计设计通过A发送的指令来控制4个LED灯的亮灭,LED模块电路及灯的引脚图,如图3、图4所示。 图3:LED模块电路 图4:LED灯对应引脚若要点亮LED灯,CC2530的通用IO口需要配置三个寄存器:P1SEL,P1DIR,P1INP,P2INP功能选择寄存器PxSEL,其中x为端口标号02,用来设置端口的每个引脚为通用I/O或外部设备I/O。默认为通用I/O。方向寄存器PxDIR,其中x为端口标号02,用来设置端口的每个引脚为输入或输出。默认为输入。输入模式寄存器P1INP,用来设置P1端口用作输入时为上拉、下拉模式或三态模式。默认为上、下拉模式。具体是上拉还

9、是下拉,由P2INP来设置。输入模式寄存器P2INP,用来设置P0、P1、P2端口用作输入时为上拉、下拉模式。默认为上拉模式。完整配置: P1SEL&=0x03;/P1_0、P1_1通用IO P1DIR|=0x03;/ P1_0、P1_1输出 P1INP&=0x03;/ P1_0、P1_1上下拉 P2INP&=0x40;/ P1上拉简化配置: P1DIR|=0x03;/ P1_0、P1_1输出3.3 通信模块电路设计CC2530 是符合 802.15.4 标准的无线收发芯片,但是本设计并没有遵守 802.15.4 协议规则,在发送过程中忽略了网络 ID、源地址和目标地址等参数,在接收的过程中禁

10、止了帧过滤。通过发送和接收过程的处理使得 CC2530 无线部分的使用尽可能的简单清晰,通过最少的代码说明问题。无线芯片的调试具有一定的难度,一般存在发送设备和接收设备。为了通过最简单的代码说明无线芯片的使用,只编写一个设备的代码同时实现发送和接收功能。设备代码的功能也相对简单,CC2530 从串口接收数据并把数据通过 RF 部分原分不动地发送出去,于此同时 CC2530 把从 RF 部分接收的数据原分不动的通过串口发送出去,通过这样的方式实现无线串口。发送的数据编号以及控制指令,来控制灯的亮度和开关。串口数据属于“流”型数据包,RF 部分属于“帧”型数据包。在串口数据处理与分析中,一般采用特

11、定的串口头和长度的方式解析数据,但是本文采用通过串口时间间隔的方式解析数据,这种方法等同于 modbus-RTU 串口数据处理的方法。通过这种检测字节数据时间间隔的方法使得 CC2530 的串口部分可以接收无特殊格式要求的数据,真正实现无线串口功能。第4章 系统软件设计4.1上位机程序设计上位机程序通过两个类来实现,第一个SerialPort类用来实现控制程序面板,第二个DSerialPort类来实现串口通信。图5所示为Java的两个类: 图5:Java的两个类SerialPort类中,通过网格布局管理器来实现面板的布局,设置各个标签以及文本框,复选框,组合框,窗口的大小位置以及标题等。4个灯

12、的设置大致相同,通过jcheckbox来表示灯选中以及未选中时的设置。jlabel1=new JLabel(全 关1:);jcheckbox1=new JCheckBox(绿);jcheckbox2=new JCheckBox(红);jcheckbox3=new JCheckBox(黄);jcheckbox4=new JCheckBox(蓝);jlabel2=new JLabel(全 关2:);jcheckbox5=new JCheckBox(绿);jcheckbox6=new JCheckBox(红);jcheckbox7=new JCheckBox(黄);jcheckbox8=new JC

13、heckBox(蓝);/灯一的设置jcheckpanel1=new JPanel();gridbagconstraints.anchor=GridBagConstraints.EAST;gridbagconstraints.gridwidth=1;gridbaglayout.setConstraints(jlabel1,gridbagconstraints);add(jlabel1);gridbagconstraints.anchor=GridBagConstraints.WEST;gridbagconstraints.gridwidth=GridBagConstraints.REMAINDE

14、R;gridbaglayout.setConstraints(jcheckpanel1, gridbagconstraints);add(jcheckpanel1);jcheckpanel1.add(jcheckbox4);jcheckpanel1.add(jcheckbox3);jcheckpanel1.add(jcheckbox2);jcheckpanel1.add(jcheckbox1);/灯一开关的设置jcheckbox1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)if

15、(getLightState1().equals(0000)jlabel1.setText(全 关1:);else if(getLightState1().equals(1111)jlabel1.setText(全 开1:);elsejlabel1.setText(开 灯1:););通过switch语句,串口打开后轮流发送Data的参数以及设置参数异常时的命令:void startRun()Timer timer = new Timer();TimerTask task =new TimerTask()int i=0; public void run() if(com_open)/串口打开则发

16、送 try switch(i) case 0:sp.write(lightcommand1+getLightState1();break; case 1:sp.write(lightcommand2+getLightState2();break; if(i=2) i=0; else i+; catch(Exception e) System.out.println(发送异常); ;timer.schedule(task,1000,200);/在200毫秒后执行此任务,每次间隔2秒执行一次,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.串口通信DSerialport类中,通过li

17、stport方法,列出了所有可用的串口,并设置返回值类型为void:public void listPort(JComboBox jcombox1)CommPortIdentifier cpid;Enumeration en = CommPortIdentifier.getPortIdentifiers();System.out.println(now to list all Port of this PC: +en);while(en.hasMoreElements()cpid = (CommPortIdentifier)en.nextElement();if(cpid.getPortTyp

18、e() = CommPortIdentifier.PORT_SERIAL)jcombox1.addItem(cpid.getName();System.out.println(cpid.getName() + , + cpid.getCurrentOwner();通过selectport方法,选择一个端口,设置返回值类型void:public void selectPort(String portName,int rate)mPort = null;CommPortIdentifier cpid;Enumeration en = CommPortIdentifier.getPortIdenti

19、fiers();while(en.hasMoreElements()cpid = (CommPortIdentifier)en.nextElement();if(cpid.getPortType() = CommPortIdentifier.PORT_SERIAL& cpid.getName().equals(portName)mPort = cpid;break;openPort(rate);通过openPort方法,打开SerialPort,设置返回值类型void:private void openPort(int rate)if(commPort = null)System.out.pr

20、intln(String.format(无法找到名字为%1$s的串口!, commPort.getName();elseSystem.out.println(端口选择成功,当前端口:+commPort.getName()+,现在实例化 SerialPort:);tryserialPort = (SerialPort)commPort.open(appName, timeout);System.out.println(实例 SerialPort 成功!);catch(PortInUseException e)throw new RuntimeException(String.format(端口%

21、1$s正在使用中!, commPort.getName();try serialPort.setSerialPortParams(rate,8,1,0);/设置波特率等参数catch (UnsupportedCommOperationException e) / TODO Auto-generated catch blocke.printStackTrace();通过checkport方法检查端口是否正确连接:private void checkPort()if(commPort = null)throw new RuntimeException(没有选择端口,请使用 +selectPort(

22、String portName) 方法选择端口);if(serialPort = null)throw new RuntimeException(SerialPort 对象无效!);通过write方法向端口发送数据,在调用此方法前需要先选择端口并确定serialport正常打开。public void write(String message) checkPort();tryoutputStream = serialPort.getOutputStream();catch(IOException e)throw new RuntimeException(获取端口的OutputStream出错:

23、+e.getMessage();tryoutputStream.write(message.getBytes();System.out.println(信息发送成功!);catch(IOException e)throw new RuntimeException(向端口发送信息时出错:+e.getMessage();finallytryoutputStream.close();catch(Exception e)通过startread开始监听从端口中接受的数据:public void startRead(int time)checkPort();tryinputStream = serialP

24、ort.getInputStream();catch(IOException e)throw new RuntimeException(获取端口的InputStream出错:+e.getMessage();tryserialPort.addEventListener(this);catch(TooManyListenersException e)throw new RuntimeException(e.getMessage();serialPort.notifyOnDataAvailable(true);System.out.println(String.format(开始监听来自%1$s的数

25、据-, commPort.getName();if(time 0)this.threadTime = time*1000;Thread t = new Thread(this);t.start();System.out.println(String.format(监听程序将在%1$d秒后关闭。, threadTime);使用close方法关闭serialport:public void close()serialPort.close();serialPort = null;commPort = null;/* * 数据接收的监听处理函数 */public void serialEvent(Se

26、rialPortEvent arg0) byte readBuffer = new byte20;int numBytes=0;String readStr=;s2 = ; try while(inputStream.available()0) try Thread.sleep(100);/休眠100ms catch (InterruptedException e) e.printStackTrace();numBytes = inputStream.read(readBuffer); /从串口上读取数据上的流for(int i=0;inumBytes;i+)readStr=readStr +

27、(char)readBufferi;s2=readStr;System.out.println(接收的数据:+readStr); catch (IOException e) e.printStackTrace(); /* * 读取接收的数据 */public String readData()return s2;public void run() tryThread.sleep(threadTime);serialPort.close();System.out.println(String.format(端口监听关闭了!, commPort.getName();catch(Exception

28、e)e.printStackTrace();4.2下位机程序设计 发送过程大致可分为侦听 SFD 清除信道,关闭接收中断,填充缓冲区,启动发送并等待发送完成,最后恢复接收中断。在这几个过程中唯一需要说明的便是填充缓冲区过程,在初始化过程中提到 FRMCTRL0 寄存器,该寄存器中 AUTO_CRC 标志位默认为使能状态,CC2530 的物理层负载部分第一个字节为长度域,填充实际负载之前需要先填充长度域,而物理层负载在原长度的基础上增加 2。长度域数值增加 2 的原因是由于自动 CRC 的存在,CRC 部分占两个字节 CC2530 会把这两个字节填充至发送缓冲区。void rf_send( ch

29、ar *pbuf , int len) RFST = 0xE3; / RF接收使能 ISRXON / 等待发送状态不活跃 并且 没有接收到SFD while( FSMSTAT1 & ( 11 ) | ( 15 ); RFIRQM0 &= (16); / 禁止接收数据包中断 IEN2 &= (10); / 清除RF全局中断 RFST = 0xEE; / 清除发送缓冲区 ISFLUSHTX RFIRQF1 = (11); / 清除发送完成标志 / 填充缓冲区 填充过程需要增加2字节,CRC校验自动填充 RFD = len + 2; for (int i = 0; i len; i+) RFD =

30、*pbuf+; RFST = 0xE9; / 发送数据包 ISTXON while (!(RFIRQF1 & (11); / 等待发送完成 RFIRQF1 = (11); / 清除发送完成标志位 RFIRQM0 |= (16); / RX接收中断 IEN2 |= (10);和发送部分略有不同,接收部分可以分为接收中断部分和接收数据帧处理部分。无线接收部分可以分为两块内容,一块是无线接收中断处理,一块是无线数据帧处理。在前者中仅需查询标志位即可,RFIRQF0 的第 6 位为完整数据包接收中断标志,若CC2530 接收到一个完整的无线数据包,该标志位便会置位。由于 CC2530 存在多种 RF中

31、断类型,例如接收到一个完整的帧,帧通过过滤等,那么在进入中断服务函数之后可以通过查询标志位的方法进入相应的处理任务,接收过程中便是采用的这种方式。进入数据包处理函数之后,首先读取接收缓冲区的第一个字节,第一个字为数据包长度,在这里需要减去 2。长度域减去 2 的原理和发送过程相似,最后两个字节原位 CRC校验,但是在 CC2530 处理过程中填充了更有用的信息,例如 RSSI 结果,而 CRC 校验只返回结果而不返回数值,CRC 校验的结果只占用一位。如果 CRC 校验成功,那么就依次读取接收缓冲区字节数据,通过串口发送这些字节数据,并附加一个 RSSI 结果且 RSSI 被中括号包围。如果

32、CRC 校验失败则通过串口打印 CRC Error。在程序刚开始调试的过程中,原先认为 CRC 校验结果是个“花架子”,但是实际中却发现当CC2530 处于接收状态时,会不时的收到数据。这些数据杂乱无章,唯一的特征便是 CRC 校验结果错误。通过 CRC 校验结果可以有效的剔除数据,保证系统的可靠性。void rf_receive_isr() int rf_rx_len = 0; int rssi = 0; char crc_ok = 0; rf_rx_len = RFD - 2; / 长度去除两字节附加结果 rf_rx_len &= 0x7F; for (int i = 0; i rf_rx

33、_len; i+) rf_rx_bufi = RFD; / 连续读取接收缓冲区内容 rssi = RFD - 73; / 读取RSSI结果 crc_ok = RFD; / 读取CRC校验结果 BIT7 RFST = 0xED; / 清除接收缓冲区 if( crc_ok & 0x80 ) uart0_sendbuf(rf_rx_buf , rf_rx_len); / 串口发送 /printf(%d,rssi); /发送强度数据 else printf(rnCRC Errorrn); 串口部分的内容和RF部分无关,串口部分的代码包括定时器 T1 和 UART 两部分,UART 中断中往接收缓冲区中

34、填充数据并重新启动定时器,在定时器中断中指示串口数据接收完毕,改变一个软件标志位is_serial_receive。void uart0_sendbuf(char *pbuf , int len) for( int i = 0 ; i len ; i+) while(!UTX0IF); UTX0IF = 0; U0DBUF = *pbuf; pbuf+; #pragma vector=URX0_VECTOR_interrupt void UART0_ISR(void) URX0IF = 0; / 清除接收中断标志 serial_rxbufserial_rxpos = U0DBUF; / 填充缓冲区 serial_rxpos+; serial_rxlen+; timer1_enable();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论