- 积分
- 33
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 5
- 最后登录
- 1970-1-1
该用户从未签到
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
基于dsp的三相异步电机的速度检测算法的程序(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。
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;
EvaRegs.T1CON.all = 0x1742;// T1高速时钟128分频,使能比较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; // 工作在定向增减计数模式,允许比较操作
// 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;
}
这里还有个地方需要注意,我测试中发现,如果用0xffff*count得不到正确的数值,可能是与16进制数有关,所以建议使用65535*count。(这地方我也不清楚,希望知道的朋友给说说)
這個我來說下,我的理解是 CCS吧0XFFFF定義為一個16位的數據類型,而吧65535定義為32位的類型
这个程序谁能帮我完善?我个人水平有限完不成了,好心的也好,有偿的也要,都帮我看看,我QQ377279379。邮箱377279379@qq.com。有想法的可以联系我 |
|