logo资料库

QEP单元测速详细说明.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
南京理工大学 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
分享到:
收藏