用dsPIC30F的QEI模塊測量交流電機速度和位置(05-100)
本文引用地址:http://www.ex-cimer.com/article/91537.htm
圖6 由標(biāo)志模式復(fù)位
用QEI計算角速度
在一個周期性中斷中執(zhí)行速度計算,因為角速度在一個固定時間周期中是增長的數(shù)字,這個中斷間隔,必須小于最大轉(zhuǎn)速的1/2轉(zhuǎn)所需時間。電機的轉(zhuǎn)速是3450RPM,所以在這個實例中選用4000RPM,以避免在任何速度計算時溢出。下式用于計算時間間隔:
實例3是定時器1的初始化,用于產(chǎn)生周期性中斷,dsPIC DSC運行在14.75MIPS。
實例3:定時器1初始化,產(chǎn)生0.0075秒ISR周期
void InitTMR1(void)
{
TMR1=0; //復(fù)位定時器計數(shù)器
T1CONbit.TON=0; //關(guān)閉定時器1
T1CONbit.TSIDL=0; //睡眠期間連續(xù)工作
T1CONbit.TGATE=0; //禁止進(jìn)入精確定時器
T1CONbit.TCS=0; //使用Tcy作為時鐘源
T1CONbit.TCK=2; //Tcy/64作為輸入時鐘
PR1=1728 ;
//用64預(yù)分頻器確定中斷周期=0.0075秒
IFSobit.T1IF=0; //清定時器1中斷標(biāo)志
IECobits.T1IE=1; //允許定時器1中斷
T1CONbits.TON=1; //打開定時器1
turn;
}
實例4是在周期性ISR中計算速度變量:
實例4:角速度計算實例
#define MAX_CNT_PER_REV(500*4-1)
#define MAXSPEED (unsigned int)(((unsigned long)MAX_CNT_PER_REV*2048)/125)
#define HALFMAXSPEED (MAXSPEED>>1)
int Speed;
void_attribute_((_interrupt_))_T1Interrupt(void)
{
IFSobits.T1IF=0;//清定時器1中斷標(biāo)志
PositionCalculation();
Speed=AngPos[0]- AngPos[1];
If(Speed>=0)
{
if (Speed>=(HALFMAXSPEED)
Speed=Speed-MAXSPEED;
}
else
{
if (Speed<-(HALFMAXSPEED)
Speed=Speed+MAXSPEED;
}
Speed*=2;
Return;
}
結(jié)語
從本文的編碼實例,可以得到表1所示數(shù)據(jù)。
如果測量的速度和角位置需要比較高的分辨率,可以用下列方法:
用比較長地時間周期精確計數(shù)。必須避免脈沖計數(shù)器寄存器POSCN溢出,所以在這種情況下推薦使用POSCN寄存器的精度。
使用輸入捕捉通道代替轉(zhuǎn)換每轉(zhuǎn)計數(shù)周期測量。
用每轉(zhuǎn)產(chǎn)生更多脈沖地增量計數(shù)器。
代碼實例選用dsPIC30F6010 DSC,開發(fā)工具是MPLAB IDE7.11和MPLAB C30 v1.31?!?/p>
(郭盛利)
分頻器相關(guān)文章:分頻器原理
評論