基于S12的无线传感器网络样机系统设计

时间:2010-05-19来源:网络

1.4 传感器选择
  为降低系统能耗,本系统所选用的传感器均为低功耗的小型传感器。其中,温度传感器选用Maxim公司的MAX6611。正常工作状态下,供电电流仅为150 μA,功耗为0.75 mW;在SHDN脚接地时处于省电状态,供电电流仅为1 μA,功耗仅为5 μW。湿度传感器选用Honeywell公司的HIH4000,其正常工作状态下的供电电流仅为200 μA,功耗为1 mW。压力传感器选用Motorola公司的MPX4100A,其正常工作状态下的供电电流为7 mA,功耗为35 mW。3个传感器在正常工作状态下的总功耗为36.75 mW;在节电工作状态下,总功耗为36.005 mW。
2 软件设计
2.1 MC9S12DT128的中断控制方式
  本系统中,MC9S12DT128采用集编辑、编译、调试、程序下载于一体的开发环境CodeWarrior4.5进行开发。CodeWarrior4.5是一种交叉编译器,支持高级语言(如C、C++和Java),以及大部分微控制器的汇编语言。
  中断控制方式是微处理器发展的一个重要里程碑,是提高CPU的工作效率、降低系统功耗的有效方式。
  在CodeWarrior4.5下,中断函数的定义只有2种方法:采用pragma TRAP_PROC或者interrupt关键字进行定义。具体使用方法分别为(假定中断函数名为INCount):
  ① #pragma TRAP_PROC
    void INCount(void){
      Tcount++;
  }
  ② interrupt void INCount(void){
      tcount++;
  }
  对应于中断函数不同的定义方式,CodeWarrior4.5下初始化中断向量表也有2种方法:
  ① 采用VECTOR ADDRESS或者VECTOR关键字。具体实现方法为,在工程的.prm文件中加入中断函数的入口地址:
  VECTOR ADDRESS0x8AINCount
  其中,0x8A为中断入口地址。或者,加入中断向量标号:
  VECTOR 69 INCount
  其中,69为中断向量标号。
  ② 采用关键字interrupt。具体实现方法为在中断函数定义时加入中断向量标号:
  interrupt 69 void INCount(void){
    tcount++;
  }
  其中,69为中断向量标号。
2.2 A/D转换中断方式的实现
  本系统中,传感器采集到模拟信号的A/D转换是通过单片机的ATD模块实现的。对ATD模块采用中断的控制方式,可以节约系统资源,提高系统执行速度。
  首先,必须在ATD模块的初始化程序中将ATD模块设置为中断模式,启用ATD转换完成中断。转换完成中断函数名为ATD0,其功能为读取A/D转换结果,采用interrupt关键字进行定义:
  #pragma CODE_SEG ATD0Interrupt_SEG
  interrupt void ATD0(void){
    ATD0STAT0_SCF = 0;//关中断
    MeasureResult[0]=ATD0DR0H;
    MeasureResult[1]=ATD0DR0L;
    MeasureResult[2]=ATD0DR1H;
    MeasureResult[3]=ATD0DR1L;
    MeasureResult[4]=ATD0DR2H;
    MeasureResult[5]=ATD0DR2L;
  }
  #pragma CODE_SEG DEFAULT
  中断函数入口通过在预编译文件中添加ATD中断入口地址0xFFD2实现,即在PE_Multilink_CyclonePro_linker.prm中加入语句:
  VECTOR ADDRESS 0xFFD2 ATD0
  MC9S12DT128的Flash空间为128 KB,采用分页管理方式,其地址分配为:
  RAM = READ_WRITE 0x0400 TO 0x1FFF;
  /*unbanked Flash*/
  ROM_4000 = READ_ONLY0x4000TO0x7FFF;
  ROM_C000 = READ_ONLY0xC000 TO0xFEFF;
  /*banked Flash*/
  PAGE_38=READ_ONLY0x388000TO0x38BFFF;
  PAGE_39=READ_ONLY0x398000TO0x39BFFF;
  PAGE_3A=READ_ONLY0x3A8000TO0x3ABFFF;
  PAGE_3B=READ_ONLY0x3B8000TO0x3BBFFF;
  PAGE_3C=READ_ONLY0x3C8000TO0x3CBFFF;
  PAGE_3D=READ_ONLY0x3D8000TO0x3DBFFF;
  可以看到Flash空间被划分为两部分:unbanked Flash以及banked Flash。对于banked Flash,定义在其空间内的函数只能被本页的程序所调用;而定义在unbanked Flash内的函数则可以为工程内任意程序所调用。中断函数想要正确地响应中断请求,必须放在unbanked Flash内,因此需要将中断函数置于特定的位置。可以从A/D中断函数ATD0的定义中看出,ATD0被定义在CODE_SEG ATD0Interrupt_SEG部分。CODE_SEG ATD0Interrupt_SEG是自己定义的ATD0中断代码段,其存放位置在PE_Multilink_CyclonePro_linker.prm文件的PLACEMENT关键字下定义:
  PLACEMENT
  ATD0Interrupt_SEG,
  COPY
  INTOROM_C000
  这样,就将ATD0Interrupt_SEG的位置定义在了unbanked Flash空间的ROM_C000。
  最后,在工程中建立ATD0Interrupt.c文件,在其中声明中断函数ATD0()为外部函数:
  #pragma CODE_SEG ATD0Interrupt_SEG
    extern void ATD0();
  #pragma CODE_SEG DEFAULT
  这样,就能保证置于任意存储空间的主程序在请求中断时,都可以得到及时、正确的中断响应。
2.3 主从蓝牙模块驱动
  蓝牙技术是一种使用2.4 GHz频段的短距离无线通信技术。与其他几种无线通信方式比较,蓝牙的传输速率并不是最快的,但由于其具有主从式的自组织微微网、低功耗、频段的开放性等优势,因此在无线传感器网络的应用中具有良好的前景。
  本设计中的无线传感器网络模块正是采用蓝牙通信实现的。传感器采集的信号经过A/D转换,转换结果需要通过蓝牙无线通信传至PC机。蓝牙系统能够支持2种连接,即点对点连接和点对多点连接。这就形成了2种网络结构:微微网和散射网。本系统属于只有一个从设备的微微网。这个微微网中,主蓝牙为与PC机相连的蓝牙模块,从蓝牙由与单片机相连的蓝牙模块担任。主从蓝牙的区别在于:主蓝牙可以主动发出指令搜索蓝牙设备,建立和断开链接;而从蓝牙则必须等待主蓝牙的指令才能开始工作。
  PC机与主蓝牙模块、单片机与从蓝牙模块之间都是串行通信,波特率为57 600 b/s。主从蓝牙模块的初始化过程大致相同,通过串行通信顺序发送如下10条指令:
  Reset[01 03 0C 00]
  Read_Buffer_Size[01 05 10 00]
  Clear:Set_Event_Filter[01 05 0C 01 00]
  Write_Scan_Enable[01 1A 0C 01 03]
  Write_Authentication_Enable[01 20 0C 01 00]
  Write_Voice_Setting[01 26 0C 02 60 00]
  Set_Event_Filter[01 05 0C 03 02 00 02]
  Write_Connection_Accept_Timeout[01 16 0C 02 00 20]
  Write_Page_Timeout[01 18 0C 02 00 30]
  Read_BD_ADDR[01 09 10 00]
1 2 3

关键词: 样机 系统 设计 网络 传感器 S12 无线 基于

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版