打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
BS2系统编程与应用实例
类别:单片机/DSP  
 
        作者:中共中央党校成教学院

     蔡德聪 中国农业大学 孙宇瑞

     来源:《单片机与嵌入式系统应用》

     摘要:针对BS2微功耗单片机应用系统硬件结构与指令系统的特点,以系统监控程序为例,着重分析系统程序设计方法与技巧;结合谷物流量在线测量系统,阐述BS2在实际工程中的应用。

    

    

     关键词:外围芯片

     编程 数据采集 冲量传感器

     在阅读了本刊2001年第10期《一种新颖的器件型嵌入式单片机系统》后,读者对BS2系统的硬件资源配置、指令系统与开发方式已经有了基本的认识,本文将从系统编程与应用的角度进一步给予详述。

     一、BS2系统的变量类型与定义

     BS2系统的PBASIC支持的变量类型有很特色,除了通常的字节(Byte)、字(Word)外,还有二进制位(bit)、半字节(nib),这显然既灵活又节省内存这间。比如,在使用BCD码时,用nib变量比Byte变量能节省一半内存。nib变量可以说明为数据,例如:number

     var nib(10)占用5个字节,可存放10个BCD码数据。PBASIC支持将端口地址定义为常量(con),再用指令对数量操作来实现端口激活、复位与数据输入/输出。与直接的I/O地址读/写相比,这种方式使程序的可读性大大改善。

     通常在应用程序中首先定义系统变量。BS2系统中常用的系统端口变量定义如下:

     CKL con 15 '所有SPI串行外围设备共

     '享的时钟线

     DATA_ con 14 '所有SPI串行外围设备共

     '享的数据线

     EE_CS1 con 13 'EEPROM1(U3)片选线

     EE_CS0 con 12 'EEPROM0(U2)片选线

     NJU_CE con 11 '时钟日历(NJU6355)允许

     NJU_IO con 10 '时钟日历(NJU6355)读/写

     PwrOn con $31 '外围可控电源启动

     Shtdwn con 9 '外围可控电源关闭

     b96 con $54 '传输速率9600bps。

     二、BS2系统程序设计实例解析

     1.系统初始化

     程序启动运行时,通常需要执行以下初始化命令:

     OUTH=PwrOn '打开外围设备电源

     DIRH=$FF '设置端口高8位为输出

     DIRL=$FF '设置端口低8位为输出

     2.时钟/日历芯片NJU6355的访问与数据读取

     NJU6355ED时钟/日历芯片包含13个BCD码存储器,分别用于存储当前的年、月、日、周、时、分、秒等信息,时间采取24小时制。时钟子程序将这13个变量转换为1个nib数组,定义为日期-时间数组DTG(13)。每个单元存放1个BCD码,其取值范围为0~9。BS2系统支持给数组下标命名,访问数组变量时可以通过下标名访问。例如:“Y10s”定义为常量1,通过DTG(Y10s)可以获得存放在DTG数组第一单元数据。日期-时间数组及下标变量定义如下:

     Yls con 0 '存放“年份”个位

     Y10s con 1 '存放“年份”十位

     Mols con 2 '存放“月份”个位

     Mo10s con 3 '存放“月份”十位

     D1s con 4 '存放“日”个位

     D10s con 5 '数组下标,存放“日”的

     '十位数信息

     Day con 6 '数组下标,存放“星期几”对应信息

     H1s con 7 '数组下标,存放“小时”对应的个位数信息

     H10s con 8 '数组下标,存放“小时”对应的十位数信息

     M1s con 9 '数组下标,存放“分”对应的个位数信息

     M10s con 10 '数组下标,存放“分”对应的十位数信息

     S1s con 11 '数组下标,存放“秒”对应的个位数信息

     S10s con 12 '数组下标,存放“秒”对应的十位数信息

     Digit var nib '变量,4bitBCD码

     DTG var nib(13)' 日期-时间数组

     Temp var word '临时变量

     (1)set_clock子程序

     功能:以人机对话方式读取用户输入的日期、时间数据,存放到DTG()数组中,作为计时初值。

     set_clock:

     serout 16, b96,[CR,“Year(YY):"]:

     gosub get2BCD '取年值

     DTG(Y10s)=temp.tighnib存储年份的十位到DTG

     '(Y10s)

     DTG(Y1s)=temp.lownib '存储年份的个位到DTG

     '(Y1s)

     :

     :

     用与取年值相同的方法可取得月份、日期、时、分、星期几等数据,并分别存放到DTG(Mo10s)、DTG(Mo1s)、DTG(D10s)、DTG(D1s)、DTG(H10s)、DTG(Hls)、DTG(M10s)、DTG(M1s)、DTG(day)中。

     (2)write_clock子程序

     功能:将DTG()数组中的数据写入时钟芯片,秒的起始值为0。

     write_clock:

     high NJU_IO '置位时钟/日历芯片为允许写

     high NJU_CE '选择时钟/日历芯片

     for digit=0 to 10'写11个数据到DTG(0)~DTG(10)

     shiftout DATA_,CLK,lsbfirst,[DTG(digit)4] '串行输出4位到时钟

     next

     low NJU_CE '禁止时钟/日历芯片

     return

     (3)read_clock子程序

     功能:用于实时读取当前时钟/日历到DTG()数组。

     Read_clock:

     low NJU_IO '置位时钟/日历芯片为允许读

     high NJU_CE '选择时钟/日历芯片

     for digit=0 to 12 '从DTG(0)~DTG(12)取13个实时数据

     shiftin DATA_,CLK,lsbpre,[DTG(digit)4] '串行输入4位

     next

     low NJU_CE'Deselect the chip. '禁止时钟/日历芯片

     return

     (4)get2BCD子程序

     功能:以2位十六进制数形式取两个BCD码,每个BCD码表示数值0~9。用户设置时钟参数时需调用此子程序。

     get2BCD:

     serin16,b96,[HEX2 temp]

     return

     3.A/D采样子程序

    

    

    

     以下程序是对用户系统中外围芯片LTC1298编程。LTC1298是12位A/D转换器,输入量程序0~5V,以外围电源的5V输出为参考电压。LTC1298有两种输入模式:两路单端输入或1路差分输入。模式=1为单端,通道号为0~1;模式=0为差分,通道号为0。

     A/D转换程序中变量定义如下:

     ADC_CS con 8 'A/D转换器LTC1298片选线

     ADcnfg var nib '存储ADC配置位

     ADstb var Adcnfg.bit0 '与ADC(always 1)

     ADmode var Adcnfg.bit1 'A/D输入模式

     ADch var Adcnfg.bit2 '通道号

     Admsbf var Adcnfg.bit3 '输出0(无意义)

     以下Adread子程序触发A/D转换,将采集转换的结果存放到Adres中。

     Adread:

     Adcnfg=Adcnfg l%1001 '设置配置参数

     Low ADC_CS '激活A/D转换

     Shiftout DATA_,CLK,lsbfirst,[Adcnfg4] '传送4位配置位

     Shiftin DATA_,CLK,msbpost,[Adres12] '取采样结果,保存到Adres的低12位中

     High ADC_CS '禁止A/D

     Return '返回调用程序

     若用户选择了不同的A/D转换器,本程序不能完全照搬使用,应根据所选芯片的可编程信息改写程序;而前面的时钟读写程序和EEPROM程序用户可直接使用。

     三、BS2系统应用实例

     笔者在科研工作中使用配备了LTC1298

     A/D转换器的BS2系统,利用厂家提供的免费软件与PC电脑经过串行总线连接,构成了通用实时数据采集、控制器,完成了对温度、多相流测量等多种试验。使用后感觉最大优点之一是微功耗:一节普通的9V叠层电池可以连续工作两个月以上。尤其适用于外出携带的野外工作,需长时间连续监测的场合。另外它开发成本低,不像一般的单片机需要另外花费购置专用开发系统。本实例介绍的是笔者在谷物产量实时监测系统中用BS2为主控制器组成的实时数据采集系统。图1所示为谷物产品实时监测系统的示意图。

     由被测物料重量与流量的基本关系知,物料累积重量W、瞬时单位长度质量mi、流速vi与瞬时质量流利Q之间存在着关系:

    

     式(1)中:Δt为定时采样时间间隔;mi(t)为在t时刻、传送带上任意处单位长度上的谷物质量;vi(t)为谷物t时刻的瞬时运动速度。如果在谷物脱离收割机传送带后的运行轨迹某处插入一个拦截板,并安装冲量传感器,处于运行状态的谷物在与拦截板碰撞后谷物的动量将发生变化,传感器输出随之变化。则由物理学冲量的定义知冲量:

     Ii(t)=mi(t)vi(t) (2)

     因此,由式(1)与(2)知,利用连续测量谷物撞击拦截板后其动量的变化进而实现谷物累积重量的实时测量,从理论上说是可行的。由试(2)可见,冲量数值的大小既与谷物的重量有关,也与谷物的流速有关。对不同谷物的收割机来说,收获过程中不同谷物(例如玉米、小麦、水稻和黄豆)的收获过程对应着不同的运送速度;而对于确定的谷物对象,物料输送装置的运行速度基本上是不变的。

     实验得知,在物料输送装置的运行速度不变情况下,在单位时间内运送某谷物Xkg,与传感器输出值D成正比,用公式X=KD表示。通过标定方式为不同种类谷物计算出不同的K。用BS2系统测量计算谷物总量的程序中,使用了前节所列的部分系统定义变量,在此程序中增加了几个本程序必要的变量定义。

     源程序代码如下:

     Wgt VAR WORD '谷物累计重量

     Seconds VAR WORD '累计秒数

     Temp1 VAR BYTE '临时变量

     Temp2 VAR BYTE '临时变量

     Temp3 VAR BYTE '临时变量

     K VAR BYTE '标定系数

     主程序:

     Admode=0 '差分输入模式

     Adch=0 '通道号为0

     Wgt=0 '测量前谷物重量为0

     Seconds=0 '初始秒值为0

     Temp2=0

     Temp3=0

     Gosubread_clock '读当前时钟

     Temp1=DTG(Sls) '取时钟的秒值

     K=0.2 '谷物标定系数

     Mcycle:

     Gosub Adread '调用采样子程序

     IF Adres<8 Then Goto Mcycel '采样值<8,视为无谷物输入,

     '采样无效

     Temp3=Temp3+1 '1s内采样次数累加

     Advalue=Advalue+Adres '1s采样值累加

     Temp2=DTG(Sls)

     IF Temp2=Temp1 Then Mcycle '1s内重复采样

     Second=Second+1 '秒值增加1

     Temp1=Temp2

     Wgt=Wgt+K*Advalue/Temp3 '重量按每秒平均值增加

     Advalue=0 '每秒采样值清0

     Temp3=0 '每秒采样次数清0

     Debug "当前谷物重量为:",dec5

     Wgt,cr

     IF Seconds=3600 Then End '测1h(小时)结束。

     Goto MCycle

     End

     在上述程序中,BS2每秒多次采样后输出一个平均值进行重量累加。因为收获机械不可避免地存在着振动,即使没有容

     物通过冲量传感器,仍然会有一定幅度的噪声电平。为了降低噪声的影响,提高测量精确定,根据实验情况,程序设计引入了噪声门限阀。若采样值<8,则认为无容物输入,采样值作放弃处理。

     以上仅是笔者在自己科研中的应用实例与经验。从网上看Parallax公司组织过几次专门的应用大赛,获奖作品有可辨识障碍与声音的微型机器人,微型灌溉控制器,河流水质变化监测系统,气象站风力、风速、空气湿度监测系统等等。美国一家航天公司,甚至同时使用6套BS2系统,分别用于控制火箭发射角度、传送GPS信息、电子摄像等等。有兴趣的读者从那里能得到更多信息。总之,在美、欧、澳洲等国家,BS2系统的应用成果已经是遍地开花。