引言:
许多仪器的前面板通常是由诸多的旋钮、按键组成的混合界面。传统的仪器前面板上通常有两种旋钮,一种是电位器,用于调节连续变化的量;另一种是档位开关,用于调节间隔变化的量。它们嵌入在测量电路中,可以直接改变仪器的参数和设置。而在现代智能仪器[1]中,这两类调节均可以通过数字旋钮由微控制器将用户操作的变化量反馈给仪器的主处理器,再由主处理器改变仪器的参数和设置。所以,智能仪器上的数字旋钮和传统仪器上的旋钮在原理和处理方法上有很大不同。为了节省成本,面板处理往往采用体积小、性价比高的单片机(MCU)。运用单片机不但经济灵活,并可充分利用MCU逻辑处理的优势,大大简化外围连线,对旋钮按键混合控制系统[2]的处理尤为突出。
设计采用LPC900系列的P89LPC922Flash单片机来实现软件处理。P89LPC922采用高性能的处理器结构,6倍于标准80C51器件的速率,并自带波特率发生器。充分考虑单片机的资源和处理速度,分模块设计——按钮电路,旋钮电路,串口电路,扫描电路。用protel完成电路原理图,制作电路板,在KeilC环境下编写软件。软件和硬件相结合,协同实现整个面板。
1 硬件设计及原理
1.1 旋钮电路设计
1.1.1 数字旋钮的工作原理
本设计选用常见的编码器EC16系列作为数字旋钮,如图1。4、5脚供固定之用,3脚接VCC(+5V),1、2脚在转动时输出连续脉冲。这种旋钮只有两种操作,即正旋和反旋。通过示波器可以观察到如图所示的旋钮转动时1、2脚的波形。
每次转动1、2脚都会产生脉冲信号,正旋时1脚先变高,反旋时2脚先变高。也就是说,正旋和反旋输出信号的相位不同,只要检测出相位,就可以识别正旋和反旋。
1.1.2鉴相电路设计
本文设计的鉴相电路见图2,附箭头所指数字标号对应的波形(以正旋为例)。旋钮的1、2脚分别与D触发器的D端和CLK端连接,根据上面所述旋钮的工作原理,正旋时1脚(D)先变高,2脚(CLK)上升沿时Q端输出1,反旋转时输出0, 端则相反。因此根据Q、 输出为10还是01就可以判断出转动方向。但是,如果继续正旋,Q、 将维持现状(图2中的④③),因此还必须检测脉冲个数来反映转动量。这时不用考虑1、2脚的相位,可将2个信号相与产生新的信号(图2中的⑤),可利用该信号分别和Q、 相与即可分辨出每次旋钮的转动。
后的输出为⑥和⑦,正旋时⑦线有脉冲,⑥线一直为低,反旋则两根线相反。至此完成了鉴相,下面要解决如何与单片机接口的问题。
1.2 扫描电路设计
用户操作面板时,为了能及时准确地识别哪个按钮和哪个旋钮动作,将按钮和旋钮统一扫描和编码,发送给主机。综合按钮和旋钮特点,根据实际需要采用了8×8的矩阵式键盘结构[3],前4行为按钮,后4行为旋钮。以列信号为扫描输出信号,行信号为检测输入信号。
扫描电路的核心是单片机。一般扫描电路用一个I/O口输出扫描信号,另一个I/O口读入检测信号。P89LPC922只有两组I/O双向口:P0口和P1口。P1口需要定义一些读写控制信号,所以只用一个P0口输出扫描信号及输入检测信号,这样P0口就存在读写控制和时序问题。既要输出列值又要读入行值,必须要有数据锁存器和缓冲器之类的芯片配合完成。设计时采用了数据锁存器74ALS373和总线接收/发送器74ALS245。单片机的引脚P1.4控制74ALS245的输出使能端,如图3中的②;P1.7控制74ALS373的数据锁存端,如图3中的①;P1.3控制74ALS245的数据传送方向,如图3中的③(这里为恒为低,从245到单片机的P0口)。
扫描电路的工作原理是:单片机先让②为高,使74ALS245输出为高阻态,然后从P0口输出列扫描数据,再给①高电平,延时后将①变低,使74ALS373锁存列扫描信号,将②变低使74ALS245输出有效,由于数据方向恒定,这样行值数据就从245输入到单片机的P0口。
为了将按钮和旋钮的扫描统一起来,我们把正旋和反旋当做不同的两个按钮按下,旋钮的正旋或反旋也对应的行值和列值。这里的巧妙之处就是采用了三态缓冲器74LS240,每个旋钮电路的输出信号⑥和⑦(即前面图2鉴相电路输出)分别接到74LS240的两组输入端,两组数据的输出都接到4根行线,由列扫描线控制输出哪一组数据。比如:扫描第二列,⑦对应那组输出到4根行线供单片机读入,此时⑥对应那组的输出被禁止。若第二列有旋钮正旋,则其对应的⑦上有脉冲,经240反相后,单片机检测到低电平数据,与按钮按下的情况一致。图3中只用了一片74LS240,可以接4个旋钮,这个电路可以扩充到四片74LS240接16个旋钮。
1.3 与主机通信电路设计
用串口与PC机通信要用串口连线,我们将其3、5脚引出,通过一片MAX232,即可与单片机的串口连接,其电路相对简单,这里不多做叙述了。外部晶振频率选用高频晶振12MHZ,用922自带的波特率发生器,设置波特率为9600,每个字节发送时间约1ms,可以满足高速率和准确性的要求。波特率太低影响速度,太高影响串口数据传输的正确性。