使用ATtiny2313A AVR微控制器即可实现高速读取正交编码器信号

描述

高速读取正交编码器信号(例如,1MHz,或1m/s,分辨率为1μm)通常需要专用硬件。本设计方案展示了一个简单的方案,仅使用ATtiny2313A AVR微控制器即可实现此功能。当然,微控制器也可以通过串行接口连接到其他设备,或者测量位置可以显示在本地LCD上,可以连接到端口PB。此外,可以添加一个或多个LED来指示错误情况。

PCB打样

图1用ATtiny2313A读取正交信号; Z索引信号是可选的。

在这个实现中,中断处理程序非常重要。它在不到1μs的时间内读取输入信号A和B.差分信号AP/N和BP/N由SN75157接收器处理,如果编码器输出逻辑电平信号,则不需要。

处理器配置为端口PD引脚的任何更改产生中断。该中断是中断向量表中的最后一个,因此

可以省去跳转指令,从而减少2-3个时钟(100-150ns)的中断服务时间。

先前和当前信号之间的异或操作( A 旧 ? B new或 A new ? B old )确定当前位置是否从前一个增加或减少。 old 和 B old 是改变状态前的A和B信号, A new 和 B new 是中断后的值。中断处理程序位于 PCIsubroutine1.txt 文件中。

中断处理程序的执行时间为800-850ns(16-17个时钟)。为了最大限度地缩短ISR的执行时间,一些寄存器专门用于它,主程序不能使用它:

R10保存SREG并测试激活新的中断

R11和R12用于新旧状态

R24和R25用于位置传感器

要计算当前位置,需要只有一个时钟周期。缺点是该位置只能有65536个值。您可以使用3或4个字节确定位置,在这种情况下,子程序执行时间从添加必要指令后增加到18-19个周期(使用寄存器对R24,R26,R28或R30)。

中断处理程序在退出当前ISR之前检查新中断。通过在SREG中设置位T来指示该情况。执行此检查,执行时间增加3个周期。我们使用RB6029(每转4,000个脉冲)以最大速度测试子程序的操作,没有检测到错误。

在激活中断之前,PCIE2值必须放在寄存器R12中(读取PIND寄存器)在启用PCINT2中断并设置SREG -I标志之前。

如果要使用Z索引信号,该位置将存储在三个寄存器中,为1,024,000个值? (4,000次计数/旋转; 256次旋转)。读取数据的中断处理程序更复杂,如 PCIsubroutine2.txt 中所示。长度为19个周期,或当Z激活时当前位置递增时为20个周期。

如果Z索引处于激活状态,我们清除角度位置,增加转数,并检查先前的角度价值是3,999。在该子程序中,检测到三个错误:一个用于重叠的新中断(如前一种情况),另外两个与Z索引相关(检查先前角位置的正确性)。错误计数器寄存器rerr1,rerr2和rerr3应由用户定义。要初始化系统,请运行 InitIndexZ.txt ,等待Z处于活动状态。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分