李松涛, 刘丽伟, 张 瑶, 宋永霞
(长春工业大学计算机科学与工程学院,吉林长春 130012)
波形分析仪是随着数字处理技术的发展而发展起来的一种综合了高速采集、存储、显示、分析和处理功能于一身的新型电子测量设备。其控制面板起着与外界交换信息的作用,在综合考虑各个方面因素之后设计了以下所述的控制面板。
C8051F020单片机是高度集成的片上系统。在一个芯片内集成了2个多通道ADC子系统(每个子系统包括1个可编程增益放大器和1个模拟多路选择器)、2个电压输出DAC、2个电压比较器 、电压基准 、SMBus/I2C 总线接口、UART 、SPI总线接口、5个通用的16位定时器、1个具有5个捕捉/比较模块的可编程计数器/定时器阵列(PCA)、内部振荡器、8个8位通用数字I/O端口和64KBFLASH程序存储器以及8051兼容的高速微控制器内核[1]。
C8051F020的ADC0子系统包括:1个9通道的可配置模拟多路开关(AMUX0)、1个可编程增益放大器(PGA0)和1个100 ksps的12位分辨率的逐次逼近寄存器型ADC。
ADC中集成了跟踪保持电路和可编程窗口检测器。AMUX0、PGA0、数据转换方式及窗口检测器都可用软件通过特殊功能寄存器来配置。只有当 ADC0控制寄存器(ADC0CN)中的AD0EN位被置1时,ADC子系统才被允许工作。当AD0EN位为0时,ADC子系统处于低功耗关断方式。
ADC0端口均可通过编程设置成为单端输入或差分输入。差分输入时的端口配对为0-1,2-3,4-5,6-7,此设置由通道选择寄存器AMUX0SL的低4位和通道配置寄存器AMUX0CF的低4位确定。在AMX0CF中,位3~0各对应2个引脚通道。位值=0,表示是独立的单端输入(复位值均为单端输入);位值=1,表示是差分输入对。
C8051F系列单片机中ADC的速率都可用编程设置,但最少要用16个系统时钟。一般在转换之前还自动加上3个系统时钟的跟踪/保持捕获时间(>1.5 μs)。设置F020内ADC速率的方法是通过配置寄存器ADC0CF的位7~3来进行的,其复位值为 11111(位 7~3=SYSCLK/CLKSAR-1)。
一般在启动ADC之前都要处于跟踪方式,控制寄存器ADC0CN的位6如果为“0”,则一直处于跟踪方式(此时4种启动方式都可比跟踪启动快3个系统时钟);如果为“1”,则有4种跟踪启动方式可选择,即对ADC0CN中的位3~2赋值:00为向ADBUSY写1时跟踪(软件命令);01为定时器3溢出跟踪;10为CNVSTR上升沿跟踪(外部信号);11为定时器2溢出跟踪[2]。
智能仪表功能往往很多,设定的量程、参数也很多。如果仍是用一键一个功能,势必要有一个很大的键盘,则面板相应扩大,既不美观,又增加成本。因此,在这类仪表中,键盘需要设计成一键多义。
在一键多义的情况下,一个命令不是由一次按键组成,而是由一个按键序列组成。也就是说,对一个按键含义的解释,不仅取决于本次按键,还取决于以前按了些什么键。因此,对于一键多义的监控程序,首先要判断一个按键序列(而不是一次按键)是否已构成一个合法命令。若已构成合法命令,则执行命令,否则等待新按键输入。因此,一键多义键盘管理程序主要解决键盘按键序列的识别和如何根据键盘的按键序列去找相应的操作程序这两个问题。上述问题可用“一图三表”的方法来解决,即建立一张键图,依靠分析程序状态表,分析程序入口表和动作例行子程序表来完成[3]。其中,分析程序状态表总共分为4栏,分别为现状态PSTi、键码、下一状态、动作例行子程序编号。
编码开关工作波形如图1所示。
图1 编码开关工作波形
编码开关有3个引脚和5个引脚的,对于5个引脚的编码开关,其中2个引脚是按键功能,另外3个引脚对应编码开关的左旋和右旋功能,与只有3个引脚的功能相同,与引脚1、引脚2相连的是2个长短不一的金属静片,与引脚3相连的是一周有12或24个齿的金属动片。当编码开关旋转时可出现4种状态:即引脚3与引脚1相连,引脚3与引脚2及引脚1全相连,引脚3与引脚2相连,引脚3与引脚2及引脚1全断开。
在实际使用中,一般将引脚3接地作为数据输入端。而引脚1、引脚2作为数据输出端与单片机I/O口相连。本设计中用到3个编码开关,其中一个将引脚1与单片机的P2.0相连,引脚2与单片机的P2.1相连。当编码开关左旋或右旋时,P2.0和P2.1就会周期性地产生图1所示的波形,如果是12点的脉冲电位器旋转一圈,就会产生12组这样的波形,24点的脉冲电位器就会产生24组这样的波形;一组波形(或一个周期)包含了4个工作状态。因此,只要检测出P2.0和P2.1的波形,就能识别脉冲电位器是否旋转,是左旋还是右旋[4]。
键盘部分采用6*6矩阵键盘,P7.0~P7.5为行线,P3.0~P3.5为列线。P3.0与P7.0交叉处为一键,P7口接10 kΩ的上拉电阻至3.3 V。3个编码开关的引脚1、引脚2直接与单片机的I/O引脚相连,选择 P2.0~P2.5,引脚 3接地,引脚4和引脚5用作按键使用[5]。在此仅以接P2.0和P2.1引脚的编码开关为例,其电路图如图2所示。
图2 编码开关控制电路图
模数转换部分使用内部电压基准,故将VREF引脚与VREF0引脚相连即可。采用电位器调节模拟量的输入,单端输入,电位器阻值为10 kΩ,基准电压典型值为2.43 V,电源电压采用3.3 V供电。为使基准电压达到最大,需要一个阻值约为3.75 kΩ的电阻与电位器串联接到模拟端口,电位器的引脚4和引脚5也用作按键使用,硬件电路如图3所示。
图3 电位器控制电路图
在键盘分析中,运用一个工作状态寄存器保存键盘的现状态,当键盘扫描到一个按键时,根据现状态的值从分析程序入口表中找到分析程序状态表地址,从该地址处进入分析程序状态表,找到相匹配的值,把下一状态送到现状态单元里,取出动作号,根据动作号计算出动作子程序入口地址,再执行相应子程序[6-8]。键码匹配子程序流程如图4所示。
图4 键码匹配子程序流程
由图1可以看出,引脚1和引脚2有同时为高电平的情况,之后,如果引脚2比引脚1先到达高电平,则表示左旋;如果引脚1比引脚2先到达高电平,则表示右旋,编程时依据这个特点来判断引脚1和引脚2的状态即可。以引脚1接P2.0,引脚2接P2.1为例:
sbit CodingsWitch_A=P2^0;
sbit CodingsWitch_B=P2^1;
int CodingsWitchPolling1()
{static uchar Aold,Bold; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
static uchar st; //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态
if(CodingsWitch_A&&CodingsWitch_B)
st=1;
if(st) //如果st为1执行下面的步骤
{if(CodingsWitch_A==0&&CodingsWitch_B==0)
{if(Bold) //为高说明编码开关在向加大的方向转
{st=0;tmp++;}
if(Aold) //为高说明编码开关在向减小的方向转
{st=0;tmp--;}}}
Aold=CodingsWitch_A;Bold=CodingsWitch_B;
return tmp;}
通过设置ADC0控制寄存器ADC0CN位3~2(AD0CM1~0)ADC转换启动方式选择位来启动ADC转换:位 3~2为00时,向AD0BUSY(ADC0CN位4)写1启动 ADC转换;位3~2为01时,定时器 3溢出启动ADC转换;位3~2为10时,CNVSTR上升沿启动ADC转换;位3~2为11时,定时器2溢出启动ADC转换。文中采用第一种启动方式。
由于单片机的工作量并不大,所以软件设计时采用查询的方式。单片机不断地查询键盘、编码开关以及电位器的状态,如果有变化时,单片机将动作信息传递给ARM主MCU,等待主MCU的处理。由于单片机模数转换的速度非常快,因此在程序中加延时以便可以观察到模数转换的变化量,另外硬件设计时没有考虑滤波,故用软件实现滤波。一般的滤波方法有限幅滤波法、中位值滤波法、算术平均滤波法等,现在就提出一种新的滤波方法,由于使用12位的ADC,但只要8位就可以达到所要的精度,所以,可以采用去掉低4位的方法来实现滤波的目的。由于篇幅有限,下面只给出程序的一部分,以AIN0为例:
void ADC0scan1()
{AMX0SL=0x00;
AD0BUSY=1; //启动A/D转换
delay(10);
a2=ADC0H; //ADC0高八位数据字
a1=ADC0L; //ADC0低八位数据字
a0=a2<<8;
a=a0+a1;
ad1=a>>4; //去掉低四位,已达到滤波的目的
while(AD0INT)//一次 A/D转换结束
{if(ad1_last!=ad1)
{output1=abs(ad1-ad1_last);
delay(10000);
ad1_last=ad1;break;}//ad1_last为全局变量,保存上次转换数据
else output1=0;
break;}}
介绍了用于波形分析仪的一键多义的按键管理程序,对于多按键的仪表仪器的控制具有通用性;无限圈编码开关同样在各种仪器中有着广泛的应用;基于去掉低4位的软件滤波方法对于精度要求不高的场合也是相当适用的。C8051F020通过对整个面板的监控,最终通过串口把动作信息传送给ARM微处理器,由ARM对波形分析仪内部电路及显示界面做出相应的处理。
[1]苑文举,赵孔新,刘丽伟,等.基于GPRS的汽车防盗无线远程报警器[J].长春工业大学学报:自然科学版,2008,29(4):391-394.
[2]潘琢金,施国君.C8051Fxxx高速SOC单片机原理及应用[M].北京:北京航空航天大学出版社,2003.
[3]李志全.智能仪表设计原理及其应用[M].北京:国防工业出版社,1998.
[4]陈国杰.数码电位器的单片机接口方法及其编程[J].电子技术,2000(4):38-40.
[5]潘文诚.智能仪器中一种菜单式人机界面的软硬件设计[J].浙江科技学院学报,2007,19(3):182-185.
[6]王必胜,张其善,吴今培.基于状态转移法的键盘程序设计[J].电子测量技术,2008,31(3):51-54.
[7]张静宇,单学民.智能仪器监控程序的自动化设计法[J].南京师范大学学报,2000,23(2):39-43.
[8]孙海,于全福.智能仪表中多层次键盘程序设计[J].化工自动化及仪表,2005,32(2):71-74.