一款新型太阳能无线超高频阅读器的设计
同理,有USB充电时,Q1也截止,USB为整个系统提供电能。由于电池电源不稳定,所以还要加上一个DC-DC升压电路SP6641B-5,为阅读器模块提供稳定的5 V输入电压。
LPC的AD0.0引脚接图4所示的VADC,引脚P0.1接OP输出EINT0,实现实时电池电压监测。当电压低于1.5 V(锂电池电压低于3 V被分压)时,设置P0.1接收高电平中断,系统进入掉电模式。而当电池电压高于3.9 V时,OP的输出EINT0将输出高电平,产生EINT0中断,将系统从掉电模式唤醒。3.9 V和3 V有0.9 V的窗口,从而避免监测误差使系统频繁地在正常模式和掉电模式间切换。
2 太阳能无线UHF阅读器软件设计
2.1 PIE编码和Miller序列解码
关于基带信号处理,关键是PIE码的产生和Miller序列的解码。
根据ISO18000-6C协议,Tari为询问机向标签发送信号(PIE码)的基准时间间隔,即数据0的持续时间。PW为Tari时间间隔中,低电平所持续的时间。本设计选择Tari为6.25 μs,PW为3.125 ?滋s。数据1的周期为12.5 μs,PW为3.125 μs。为了方便通过PWM产生波形,将数据1的波形分成6.25 ?滋s高电平再加上数据0的波形。LPC2138的PWM5(引脚P0.21)作为PWM输出。寄存器PWMMR0设置PIE序列周期,PWMMR5设置下降沿的位置。在PWM中断处理程序中更新寄存器PWMMR0和PWMMR1的值来产生下一个PIE序列。
标签发射回的信息符合FM0编码规则:(1)在每位数据边界倒转相位。(2)数据0在其中间有一个相位倒转。一般一个FM0码用一个副载波表示,但有时为了降低信号检测误码率,可以用2、4或者8个副载波表示一个FM0码,称之为Miller副载波调制技术。阅读器发送query命令时选择副载波数,本设计采用M=2。Miller2码的规则:每个数据序列用两个副载波周期表示,数据0的副载波周期不发生相位翻转,数据1的副载波周期发生相位翻转,两个数据0边界要发生相位翻转。在本设计中将query中的TRext位设为1,这样每次从标签中返回Miller序列时,都有16个前导0加上010111(前同步码),通过检测前导序列来判断是否已经开始反射数据。
通过LPC2138定时器0的捕获功能和状态机完成Miller2序列的检测。研究Miller2序列发现,Miller2序列下降沿的时间间隔只有图5所示的两种情况:T或者1.5T(T为Tari=6.25 μs)。通过定时器0的捕获通道0捕获Miller序列的下降沿,并在中断处理程序中读取当前定时器快照的计数值,求出与上次计数值的差值。然后通过图6所示的状态机,就能够解码标签反射的Miller2序列。如图6所示,Sx为起始状态,a/b(a:输入,b:输出)箭头指向从初态到次态。
LPC2138接收Miller2序列的引脚为P0.2,设置该引脚捕获下降沿,下降沿到来时,进入中断处理程序,读取捕获寄存器CR0的值。计算出与上次下降沿之间的差值a,将差值存入FIFO(全局数组)中,在没有下降沿捕获时,处理器执行解码程序。本设计采用边接收编解码的方法。这是因为,根据ISO18000-6C协议,命令间有时限要求,若接收完Miller2序列后,再进行解码,可能会破坏这种时限。
2.2 ISO18000-6C命令和多任务的实现
2.2.1 ISO18000-6C命令
完成了PIE码发送和标签返回Miller2副载波的解码,就能够很容易地实现ISO18000-6C规定的所有命令。根据协议,命令分为三类:选择命令(select)、盘存命令(query、queryadjust、ACK等)和访问命令(Read、Write、Lock、BlockWrite、BlockErase)。根据协议中命令的格式,分别予以实现。
2.2.2 多任务的实现
μCOS-II[8]是一款抢占式多任务操作系统内核,应用十分广泛,将其移植到LPC2138也十分容易。本设计要求阅读器有以下功能:多卡访问(盘存)、单卡访问、低电压监测。多卡访问操作即批量读卡;单卡访问即对一张卡进行读/写、锁定和批量访问等操作;低电压监测实现检测电池电压的功能,当电池电压低于门限电压下限时,让阅读器工作于掉电模式,待电池电压恢复到门限电压上限时将系统唤醒。
创建3个用户任务:MainTask、Tag_Inventory、Tag_Operate,创建2个信号量:Semp_Invent和Semp_Operate。MainTask任务优先级最高,设为5,完成电压检测和操作模式的选择;任务Tag_Inventory优先级为6,完成多卡访问;任务Tag_Operate优先级为7,完成单卡访问。当进入MainTask任务后,马上获取2个信号量,使用case语句实现任务选择,选择到某项任务后,释放该任务所对应的信号量,执行相应任务。在任务中,先获取相应信号量,如OSSemPend(Semp_Invent,0,&err),然后执行该任务,最后释放信号量OSSemPost(Semp_Read)。
主任务中有两项功能:(1)完成对系统电压的检查。当电压小于3.0 V时,系统进入掉电模式,之后,