QOUT 模块
QOUT 模块,全称 Quadrature Pulse Ouput Module,根据分频比,对编码器的位置信号进行分频输出正交位置信号,输出信号用于反馈至 PLC 或其他控制设备,进而完成对伺服电机的闭环控制。
结构框图

上图所示为 QOUT0 结构框图,主要由脉冲检测模块 (Pulse Detect Module) 、脉冲分频模块 (Pulse Divide Module) 、正交脉冲输出模块 (Quadrature Pulse Output Module) 和控制/状态/寄存器模块 (CSR Module) 组成。
另外,SYS_CLK 为 QOUT 的工作时钟,典型频率为 200 MHz。
脉冲检测模块
通过寄存器字段 QOUT_POS_SRC_SEL 选择位置数据的来源,硬件会根据 BLOCK 定时器的设置自动读取一次位置数据,通过与上次读取的位置数据做差,得出脉冲数量与方向的信息,结果保存在 QOUT_IN_PUL_DET 寄存器。
BLOCK 定时器的周期计算为 16384 * Tcntclk,若设置计数时钟为 200 MHz,此时对应的定时器周期为 81.92 us,这里的一个间隔周期我们称为一个 Block。
另外,通过寄存器字段 QOUT_TMR_FRE_DIV,可以调整定时器的频率,从而调整 BLOCK 定时器的周期,即调整 Block 的时间长度。
需注意,一个 Block 最大支持 1024 个脉冲的检测,若输入大于 1024 个脉冲,则按照 1024 个脉冲输入进行后续的算法计算,并且产生输入脉冲溢出状态,该状态可以作为中断源。
脉冲分频模块
脉冲检测模块后所得的输入脉冲数,会经过脉冲分频模块,进行脉冲数的转换,即根据分频比 N/M 进行输出脉冲数的转换。N/M 的设置通过寄存器 QOUT_N_M_DIV 配置,由于模块内部采用定点数的计算,所以这里需写入对应的无符号 Q20 定点数(无符号的 20-bit 小数位)。
假设 N/M = 3/11,那么设置的数值为 220 × 3 ÷ 11 = 285975.2727 ≈ 285976(小数部分直接进 1,采用 Round-up)。
脉冲输出均匀功能
通过寄存器 PUL_HOMO_EN = 0x1 使能脉冲输出均匀功能,此功能可以将一个 Block 的脉冲均匀话的输出,避免出现输出脉冲频率突变的情况。
正交脉冲输出模块
A/B 信号生成
正交信号在正转的时候,A 信号会超前 B 信号 90 度,下图给出正转时的正交输出信号:

根据上图这里有如下的定义:
-
Phase1:A = 1,B = 0
-
Phase2:A = 1,B = 1
-
Phase3:A = 0,B = 1
-
Phase4:A = 0,B = 0
故在正转的时候,相位的变化为 Phase1 → Phase2 → Phase3 → Phase4。
而在反转的时候,B 信号会超前 A 信号 90 度,下图给出反转时的正交输出信号。相位的变化则为 Phase4 → Phase3 → Phase2 → Phase1。

因此利用脉冲分频模块输出的脉冲信号,按照正转和反转的相位变化,就可以生成 QOUT_A 和 QOUT_B 的正交信号。另外当关闭 ABZ 输出模块,即 QOUT_EN = 0,A、B 信号均复位到低电平。
Z 信号生成
下图正转的例子,假设是 2 线正交编码器,也就是转 1 圈出 2 个脉冲。

下图先正转后反转的例子,同样是 2 线正交编码器。

Z 信号扩展功能
Z 信号扩展功能,是针对 Z 信号进行处理的功能,得到信号 Z_EXT,具体处理的流程如上图。在使能了 Z 信号扩展功能后,QOUT 的输出 QO_Z 则选择了 Z_EXT 的通路进行输出。
- 若使能对 Z 信号的上升沿进行处理,Z_EXT 在对应的在 QOUT_Z 的上升沿时刻产生上升沿,并且维持 t_zext
的时间后拉低,此时间可以通过寄存器控制。
- 若使能对 Z 信号的下降沿进行处理,Z_EXT 在对应的在 QOUT_Z 的下降沿时刻产生上升沿,并且维持 t_zext
的时间后拉低,此时间可以通过寄存器控制。
软件模式
QOUT 模块可以通过寄存器配置成软件模式,利用定时器的中断信号,软件介入进行用户的算法,计算需要输出脉冲周期 QOUT_PULSE_PRD、脉冲数量 QOUT_PULSE_NUM 以及脉冲方向 QOUT_PULSE_DIR 的数值,分别写入对应的寄存器。在更新信号来到的时候,则自动更新新的寄存器数值,产生对应的正交脉冲信号。
误差消除功能
QOUT 模块为了实现均匀输出脉冲信号,需要使能误差消除功能。具体的误差消除功能的说明如下:
假设当前 N/M = 3/11,那么 N/M 的定点化(20 bits 无符号小数)转化为:1048576 * 3/11 = 285975.272727 ≈ 285976 (N/M 的取值需要往大取整,向上舍入)
以上的计算的约数,带来了+0.727273 的误差。
由于 N/M 的定点数用于计算输出脉冲数,PG = Pin * N/M,所以每输入一个脉冲,则产生+0.7272723 的误差。
为了对此误差的消除,初始化可进行以下的配置:
-
通过寄存器使能误差消除功能,QOUT_ERR_CANCL_EN =0x1;
-
设置误差消除的阈值寄存器 QOUT_ERR_CANCL_TH = 1100,这里的取值方法,需取 N/M 的分母数的整数倍,由于 M=11,所以这里选取为误差消除阈值为 1100;
-
设置误差消除值寄存器 QOUT_ERR_CANCL_V = 800 ,这里的选值根据误差消除阈值进行设定,由于误差消除阈值为 1100,而误差为+0.727273,所以 QOUT_ERR_CANCL_V = 1100 * (+0.727273) = 800。
通过以上的配置,在 QOUT 使能后,每当检测到输入达到 1100 个脉冲,则自动对下一次的小数脉冲的累加和进行减 800 的操作,达到消除累计误差的效果,具体效果如下图所示。

中断状态
-
QOUT 的内部定时中断,即每完成一个 Block 的脉冲采集产生的中断信号,此中断用于软件模式
-
QOUT 输入检测溢出状态信号,即 QOUT 输入检测脉冲数量>1024