什么是读写计数器介绍
读写计数器,即先写出计数器上面的数,然后再分别把它们读出来。把这个数按从小到大顺序进行排列。
读写计数器改进读取方法
在电机伺服控制系统中,需要一个脉冲计数器对电机码盘输出的脉冲进行计数。单片机根据脉冲的个数和电机旋转方向计算出电机的转角,进而实现对电机的伺服控制。如果脉冲计数器没有数据锁存功能,且单片机读取数值时,脉冲计数器恰好发生了进位或者借位,则读取的数值可能不准确,进而影响伺服控制系统的性能。针对没有锁存功能的脉冲计数器,提出了一种改进的读取方法,有效地避免了在读取过程中由于计数器进位或借位造成的读数偏差。
读写计数器四倍频与计数
对于增量式码盘,通常采用四倍频的方法提高光电码盘的测量精度,即在每个时钟信号周期内记录A相和B相的状态,如果AB相状态的变化顺序是10->11->01->00->10,则表示电机正转,计数器的值加1;如果AB相状态的变化顺序是11->10->00->01->11,则表示电机反转,计数器的值减1。其中计数器的时钟信号的频率至少是A相脉冲频率的4倍。
四倍频后的码盘信号需经计数器计数后,才能转化为相对位置。计数的功能可以由单片机内部定时器实现,也可以由专用电路实现。第一种方法硬件结构简单,但是增加了单片机的资源消耗,尤其在电机码盘的精度较高,电机转速较快的场合,计数器需要频率很高的时钟信号。例如电机码盘的精度为1000线,电机的额定转速是9000r/min,则A相或B相每ms产生的脉冲的个数是1000×9000/60/1000=150,四倍频后的脉冲个数是600个/ms,计数器的时钟信号的频率至少要达到0.6MHz,若时钟信号的频率达不到要求,则会产生检测误差。因此在实际应用中通常采用专用硬件电路实现四倍频和计数的功能,这种专用电路通常称为脉冲计数器。采用专用的硬件电路完成四倍频和计数的功能,可以提高单片机的运行效率,保证计数的正确性。
读写计数器问题的产生
在实际应用中通常采用专用硬 件电路实现四倍频和计数的功能。但是在有些应用场合,出于节约成本的考虑,电路中并没有配置锁存器。如果单片机读取脉冲计数器的计数值不能一次读取完毕,就可能产生这样的情况: 在单片机读取脉冲计数器的计数值的过程中,脉冲计数器中恰好发生了计数值的进位或者借位,则单片机得到的计数值就不是正确的值。
例如脉冲计数器的计数值有12位,计数范围从0到4095。单片机与脉冲计数器之间的数据总线宽度为8位,即单片机每次读取计数值的过程要分为2个步骤(高4位和低8位分别读取) ,然后合成为12位的数据。
如果在读取计数 值的高4位之后和读取低8位之前的这段时间里,发生了进位或者借位,则单片机读取的数据就会出现偏差。例如电机正转,当计数值为255(0x0FF) 时,单片机读取计数值,读取计数值的高4位得到0x0,此时发生了8位的进位,即脉冲计数器的计数值由0x0FF变成0x100,再读取计数值的低8位得到0x00,则最后合成的12位的计数值是0x000,而此时正确的计数值应该是0x0FF或0x100,得 到的计数值比真实的计数值小了256。依此类推,0x1FF、0x2FF,直到0xEFF的进位都会发生这样的问题。当电机反转时,计数值发生借位,与电机正 转的情况相反,得到的计数值比真实的计数值大256。
读写计数器问题的处理
处理的办法是在获取一个计数值的过程中进行3次读取: 先读取计数值的高4位,然后读 取计数值的低8位,然后读取计数值的高4位。判断前后2次读取的高4位是否相同,如果相同则认为在读取的过程中没有发生进位或借位,可以把高4位和低8位直接合成一个12位的数据;如果不相同,则认为在读取的过程中发生了进位或借位,需要进行相应的处理得到12位的正确数据。
从正转时计数值进位情况中可知,如果读取计数值的过程中发生了进位,则前后两次读取的高4位相差1或-15(第2次的值减第1次的值);反转时前后两次读取的高4位相差-1或15。通过前后两次读取的高4位的差,可以判断是否发生进位或借位,进而得到正确的计数值。
读写计数器设计
定时器、计数器和高速计数器是PLC用户程序设计中常用的软元件,运用FPGA并行执行的特点,针对ARM+FPGA架构的PLC系统,分析PLC对定时器、计数器和高速计数器的功能需求,设计了可以动态并行执行的定时和计数控制模块的体系结构。该定时和计数控制模块能够并行地实现PLC定时、计数和高速计数的功能,同时定时器控制模块和计数器控制模块是可重构的,可以根据具体工程应用来更改其内部的定时器或计数器的总数,实现对FPGA资源的灵活配置。
定时和计数控制模块的结构设计
为了使所设计的定时和计数控制模块实现PLC的定时、计数与高速计数的功能,在此将定时和计数控制模块分成三个模块,分别是定时器控制模块、计数器控制模块和高速计数器控制模块。
由定时和计数控制模块结构可知,定时器控制模块、计数器控制模块和高速计数器控制模块通过总线的形式与中央控制器进行数据的交互,它们的工作是相互独立的,能并行地工作。它们使用相同结构和功能的端口读写控制器与中央控制器进行数据交互,在相同的时刻只能有一个模块占用总线与中央控制器进行通信。
端口读写控制器结构及读写时序设计
端口读写控制器主要实现与中央控制器的接口,定时器控制模块、计数器控制模块和高速计数器控制模块根据读写时序,通过各自的端口读写控制器实现与中央控制器的数据交换。
RST复位线使用低电平复位,低电平的保持时间要大于40ns;ADDRC是模块地址线;RDC和WRC为低电平使能;ASK(1/2/3)与ANS(1/2/3)线均为低电平有效。读写控制模块通过判断RDC和WRC以及ADDRC的状态,控制组合逻辑三态门构成的32位双向I/O口DATAC进行数据的输入或输出。端口读写控制器的32位指令缓存可以存储一条指令,由29位data_in线输出对D28~D0即指令数据,由3位code_in线输出D31~D29即指令类型。CE指令执行标志线,只有定时器控制模块和计数器控制模块使用CE线,高速计数器控制模块未使用CE线。当存储有指令时,置BUSY(1/2/3)线和CE线为低电平,若通过clear线从指令执行器处接收到指令执行结束信息时,清除32位指令缓存内存储的指令数据,置BUSY(1/2/3)线和CE线为高电平。
BUSY(1/2/3)线为忙信号输出线,当中央控制器检测到BUSY(1/2/3)线为高电平时才可以对定时和计数器控制模块进行写操作,写入数据DATAC、写入地址ADDRC以及写信号线WRC的低电平保持时间不少于一个半时钟周期即30ns。当定时和计数器控制模块需要中央控制器对其进行读操作时,先通过定时和计数器控制模块读请求信号线ASK(1/2/3)发送一个时钟周期即20ns的请求脉冲,然后等待中央控制器读应答信号线ANS(1/2/3)上的应答脉冲,中央控制器发送应答脉冲20ns之后,通过置低读信号线 RDC 同时选中定时和计数器控制模块地址即可从DATAC读取三个时钟周期即60ns的数据。