无线天然气报警系统之软件编程实现
by fxw451
对于一个初学者来说,TI的例程是这几个芯片公司所不能做到的,写的很详细。据我所知TI出的几款芯片(DSP2812,ARM-M3,以及430等)都会有很详细的例程,和丰富的库文件,这对于开发人员来说是个很好的选择。我起初接触的是DSP2812,到前段时间的LM3S8962,以及现在的EZ340-RF2500,它们几个都有丰富的例程。只要你参考手册,按照手册上的说明修改下例程就可以成为你的东西。
说了这么多废话,其实就是为了说说我作为一个初学者,一个刚刚接触EZ340-RF2500不到一个月的初学者,我是怎么做这个天然气报警系统的。不过肯定有许多做的不对的地方,时间按太短了,要想更深的理解,还需要长时间的学习。
第一步:首先要看手册,TI给出了 A_Wireless_Sensor_Monitor_Using_the_eZ430-RF2500_(SLAA378), cc2500,eZ430-RF2500_User Guide_SLAU227, msp430f2274,和MSP430x2xx_Family_User's_Guide_(Rev._D)_slau144d。这几个只有几个是要你去研读的,有cc2500和MSP430x2xx_Family_User's_Guide_(Rev._D)_slau144d两个就行,其实我MSP430x2xx_Family_User's_Guide我根本就没看,有单片机基础的这个建议可以不看,我就看cc2500,中文英文(中文翻译的真不咋地,不过我在论坛翻译的一个基础的东西也不咋地,在这里知道学一门外语有多重要了!!)一起看,这里面有很多的专业术语,我根本就看不懂,我只好靠baidu和goole了解了个差不多。记得看完第一遍后感觉什么都不会,然后就去网上搜搜关于这方面的问题,就又下了Packet Transmission Basics(swra109c),RSSI Interpretation and Timing(swra114d)和ERRATA NOTES(swrz002),这三个就是对CC2500里重要知识的详细介绍,有兴趣的学员还是要多看看。
然后反回头来看CC2500手册后就有点眉目,如果深入研究还有一段时间。下面就分析下我的程序,我的程序其实就是TI给的demo,我在里面修改了下。 第二步:这个例程其实包含两个部分Access Point和End Device,在这里要注意了,下载程序一定要记得这两个是面对不同的模块的,图一是下载到那个有电池的模块上的,图二是下载到带有串口的模块上的。
图(一)
图(二)
然后,就是里面的程序,关于430的程序ddllxxrr版主已经做了详细的介绍我这里就不说明了,有不会的可以问ddllxxrr,呵呵。
第三步:这两个模块的主程序分别是demo_AP.c和demo_ED.c,我拿过程序来看了看,看到demo_ED.c的程序行数比较少,并且好多程序指令都在demo_AP.c里出现过,所以我首先分析了demo_ED.c的程序,如下
linkTo() 就是实现链接是否成功,就通过SMPL_SUCCESS != SMPL_Link(&linkID1)判断的。
int results[3]; //存放结果
SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, "" ); // IOCTL_ACT_RADIO_SLEEP,还没睡醒
__bis_SR_register(LPM3_bits+GIE); // LPM3 with interrupts enabled 产生中断
SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, "" ); // IOCTL_ACT_RADIO_AWAKE 中断之后就醒了,radio开始工作。
共有三个变量要存储,我只分析一个
BSP_TOGGLE_LED2(); //触发led2
ADC10CTL1 = INCH_10 + ADC10DIV_4; // Temp Sensor ADC10CLK/5 和Selects Channel 10
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR; //这些就是一个430的配置的,建议找参考书
for( degC = 240; degC > 0; degC-- ); // delay to allow reference to settle等待时间
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled 中断
results[0] = ADC10MEM; //将AD得到的数据给results[0]
temp = results[1];
volt = (temp*25)/512;
bj = results[2];
msg[0] = degC&0xFF;
msg[1] = (degC>>8)&0xFF;
msg[2] = volt;
msg[3] = bj;
将results里的数据给msg,因为其他函数调用的是msg,所以要赋值过去。
if (SMPL_SUCCESS == SMPL_Send(linkID1, msg, sizeof(msg))) //发送数据触发一次
{
BSP_TOGGLE_LED2();
}
void createRandomAddress() //产生地址,这个主要是应用到addr,你没插入一个无线模块他就随机给你产生一个地址,主无线模块的地址为HUB0,另一块随机产生一个0001,如果在插入一个会产生一个出0001外其他地址,主要是通过TI_getRandomIntegerFromVLO()获得的。
其实demo_ED.c就这么些内容,下面咱们来看下demo_AP.c
void TXString( char* string, int length );//发送数据,UCA0TXBUF = string[pointer]
void transmitData(int addr, signed char rssi, char msg[MESSAGE_LENGTH] );//主要是赋值运算,将获得的数据赋给addrString和rssiString,第一个是确定地址的每个无线模块都有个地址,第二个是获得的能量,用来确定位置的,不过这个位置是在核心模块的rssiString半径上的点。不能具体到某个位置,只能具体到某个范围,如果是多个模块的话应该可以确定这个点
void transmitDataString(char addr[4],char rssi[3], char msg[MESSAGE_LENGTH]);//这个主要是发生数据的。发送数据格式为Node:XXXX,Temp:-XX.XC,Battery:X.XV,Strength:XXX%,RE:no,其中XXX的将被实时数据代替。下图有详细的说明;
static uint8_t sCB(linkID_t lid) //这个是检测插入的无线模块节点的
这四个是最重要的
图(三)
第四步:将我做的天然气的一部分抓图分析给大家,不过还不完善。我是直接在eZ430-RF2500 Sensor Monitor这上面该的,将电压替换成天然气采集的数据。
下面这个图四是原例程给的监视图,如图(四):
图(四)
下面的图(五,六)是我给燃气后和没给燃气获得的结果一个是1.1V,一个是0.1V(应该转化成百分比就好了)
图(五)
图(六)
这是我的硬件连接图如图(七),我发现我做东西真丑。
图(七)
就写到这吧,有错误之处还请大家多提意见,我好及时修改,以免影响大家。
无线天然气报警系统之软件编程实现.pdf
(148.69 KB, 下载次数: 58)
2011-3-22 晚