南京理工大学
QEP 单元测速详细说明
这段时间一直在做开关磁阻电机的电流斩波控制,到今天终于调通。QEP
测速部分,发现许多网友不是很清楚。这里我把详细的步骤给大家说说,希望能
给也在用这部分的人一些帮助。
我用的是给 CAP1,CAP2 两路互差 90 度的方波信号。进入 DSP 自动四倍频
(这样可以在每个四倍频的上升沿检测到 CAP1 和 CAP2 的上升或下降沿)后作
为定时器 T2 的时基,也就是说,一旦 CAP1,CAP2 使用了 QEP,T2 的定时计
数器每增一或者减一都是由四倍频后的脉冲上升沿触发的。至于是增加一还是减
少一,是由 CAP1 先于 CAP2(增计数),还是后于 CAP2(减计数)控制的。
对于速度的计算,我用的是两个脉冲用了多少时间来计算的。当在 QEP 单元
捕获到第一个脉冲时,把定时器 1 计数器的值放入一个变量中,我设为 T1CNT0,
等到 QEP 捕获到下个脉冲时,把定时器 1 计数器的值放入 T1CNT1。这样
(T1CNT1-TICNT0)/f_T1=t,这里 f_T1 是定时器 T1 的计数频率,t 就是 QEP 两个
脉冲之间所用的时间。你可以算出 QEP(T2 计数器)两个脉冲所走的角度(如:
一圈光电编码盘会产生 6 个脉冲,四倍频后就是 24 个脉冲,两个脉冲之间就是
360/24=15 度),这样就可以算出角速度了。
在这里你需要控制的是两个量,一个是定时器 T2 的计数器,一个是定时器
T1 的计数器:
1) 定时器 T2 的计数器,每增加一个(假设 CAP1 超前于 CAP2),则表示转
过了 15 度(如:一圈光电编码盘会产生 6 个脉,四倍频后就是 24 个脉冲,两个
脉冲之间就是 360/24=15 度)。
你还需要考虑到两次采样正好卡在 T2 计数器到 FFFF 的情况,所以 T2 计数
器两次采样后要进行一下比较,如果后者大于前者,说明,两次采样没有卡在
FFFFh 之间,反之则要 T2CNT1-T2CNT0+65535。
2)定时器 T1 的计数器,定时器 T1 计数器是用来测量两次捕获时间用的。
要 考 虑 到 两 次 捕 获 中 T1 可 能 已 经 过 了 好 几 个 周 期 , 所 以
(T1CNT1-TICNT0+65535*count)/f_T1=t,count 是计算两次捕获中 T1 过了几个周
期。可以通过中断的方式给 count 计数,每到 T1 的周期中断,count=count+1。
在每次计算完速度后让 count 为 0。
1
南京理工大学
3)这里还有个地方需要注意,我测试中发现,如果用 0xffff*count 得不到正
确的数值,可能是与 16 进制数有关,所以建议使用 65535*count。(这地方我也
不清楚,确实是比较古怪的问题,可以单步调试看看中间结果,或许就能找出问
题了)。
下面是我的寄存器的相关设置,大家可以参考一下:
void InitEv(void)
{
// Initialize EVA Timer 1:
EvaRegs.GPTCONA.all = 0;
EvaRegs.T1PR = 0xffff;
EvaRegs.T1CMPR = 0x0000;
EvaRegs.EVAIMRA.bit.T1PINT = 1;//允许周期中断
EvaRegs.EVAIFRA.bit.T1PINT = 1;//复位中断标志位
EvaRegs.T1CNT = 0x0000;
f=75000000/128
// Initialize EVA Timer 2:
EvaRegs.T2PR = 0xffff;
EvaRegs.EVAIMRB.bit.T2PINT = 1;//允许周期中断
EvaRegs.EVAIFRB.bit.T2PINT = 1;
EvaRegs.T2CNT = 0x0000;// Clear the counter for GP timer 2
EvaRegs.T2CON.all =0x1872; // 工作在定向增减计数模式,允许比较操作
EvaRegs.T1CON.all = 0x1742;// T1 高 速 时 钟 128 分 频 , 使 能 比 较
2
南京理工大学
// Initialize EVA CAP 1/2/3:
EvaRegs.CAPCON.bit.CAPRES=0;
EvaRegs.CAPCON.bit.CAPQEPN=0;
EvaRegs.CAPCON.bit.CAP3EN=1;
EvaRegs.CAPCON.bit.CAP3TSEL=1;
EvaRegs.CAPCON.bit.CAP12TSEL=0;
EvaRegs.CAPCON.bit.CAP3TOADC=0;
EvaRegs.CAPCON.bit.CAP3EDGE=1;
EvaRegs.CAPFIFO.all=0;//清除 FIFO
EvaRegs.EVAIMRC.all=0x0004;//使能 CAP3 的中断
EvaRegs.EXTCON.bit.QEPIE=0;
EvaRegs.EXTCON.bit.QEPIQEL=0;
}
3