本文介紹用dsPIC30F數字控制器的正交編碼器接口(QEI)模塊,對電機的速度和位置進(jìn)行控制的方法。提供了典型電機控制中轉子的速度和位置測量的代碼實(shí)例。
正交編碼器接口(QEI)模塊

圖1 正交編碼器接口信號

dsPIC30F的正交編碼器接口(QEI)模塊提供了一個(gè)與增量光編碼器的接口,允許從電機或機械系統中,獲得速度和相對轉子位置信息。QEI模塊提供16位時(shí)基,接受從增量編碼器連接的A、B和標志信號。電機速度和位置信息能用×2或×4分辨率進(jìn)行測量。
QEI模塊有兩個(gè)速度通道:A相(QEA)和B相(QEB)。兩個(gè)通道有對應關(guān)系,如果A相超前B相,則認為電機的方向是正轉或正向的。如果A相滯后B相,則認為電機的方向是反轉或反向的。第三個(gè)通道是INDX,稱(chēng)標志脈沖通道,電機轉子每旋轉一周產(chǎn)生一個(gè)脈沖,用于確立轉子絕對位置的基準。圖1是這三個(gè)信號的相對時(shí)間關(guān)系。
由解釋A相、B相和標志信號的邏輯譯碼器和精確計數的上/下計數器組成正交編碼器。數字濾波器在輸入信號時(shí)對信號進(jìn)行濾波。圖2是QEI模塊的方框圖。這些功能包括:
兩相信號和標志信號。
可編程譯碼器(提供計數器脈沖和計數方向)。
16位上/下位置計數器。
計數方向狀態(tài)。
×2和×4分辨率計數。
位置計數器復位的兩個(gè)模式。
普通用途16位定時(shí)器/計數器模式。
QEI或計數器事件產(chǎn)生中斷。
應用實(shí)例
圖3是典型的QEI應用實(shí)例,這里交流電機(ACIM)用正交編碼器作為反饋信息控制。
應用實(shí)例要求:
在0°-360°范圍內測量轉子角位置。已知增量編碼器光柵的數量,設置成相應的定標系數。用一個(gè)16位無(wú)符號變量表示。
測量角速度。已知的電機最高速度。用一個(gè)有符號16位變量表示,這里轉子正轉時(shí)符號是(+),反轉時(shí)符號是(-)的。
在本例中使用下面的電機和編碼器:
電機:Lesson Cat##102684,轉子速度3450RPM
編碼器:US數字模塊E3-500-500-IHT,分辨率500線(xiàn)。
QEI模塊初始化

圖3 典型應用方案

使能數字濾波器
使能數字濾波器在增量編碼器信號中濾波其他信號。對本例所用的結構,圖4說(shuō)明了輸入信號的濾波作用。
濾波器計算時(shí),編碼器最小脈沖寬度為最高電機速度。在這個(gè)實(shí)例中,最小脈沖寬度由下式確定:

所配置的濾波器濾出任何小于15祍的脈沖,運行14.75MIPS,能夠滿(mǎn)足濾波器的要求,濾波器分頻器由下式計算:
在QEI模塊中有可選擇參數,選擇64分頻,13祍以下的脈沖將被濾出。
增量脈沖計數器
在每個(gè)QEn引腳輸入增量脈沖計數器信號。為了盡可能提高分辨率,QEI配置成×4。×4計數模式時(shí),每個(gè)QEA和QEB信號沿到來(lái)時(shí),POSCNT寄存器增量計數或減量計數,圖5是×4配置的定時(shí)信號。
復位脈沖計數器
脈沖計數器由INDEX引腳復位。圖6是INDEX脈沖復位脈沖計數器的定時(shí)圖。
代碼實(shí)例
下面是QEI模塊初始化的代碼實(shí)例:
實(shí)例1:QEI模塊初始化
void InitQEI(viod)
{
ADPCFG|=0x0038;
//配置QEI引腳作為數字輸入
QEICONbit.QEIM=0; //禁止QEI模塊
QEICONbit.CNTERR=0; //清除計數錯誤
QEICONbit.QEISIDL=0; //睡眠期間連續工作
QEICONbit.SWPAB=0; //QEA和QEB交換
QEICONbit.PCDOUT=0; //標準I/O引腳工作
QEICONbit.POSRES=1;
//標志脈沖復位位置計數器
DELTCONbits.CEID=1; //禁止計數錯誤中斷
DELTCONbits.QEOUT=1;
//允許QEn引腳數字濾波器輸出
DELTCONbits.QECK=5;
//對QEn數字濾波器1:64時(shí)鐘分頻
DELTCONbits.INDOUT=1;
// 允許INDEX引腳數字濾波器輸出
DELTCONbits.INDCK=5;
//對INDEX數字濾波器1:64時(shí)鐘分頻
POSCNT=0;
//復位位置計數器
QEICONbit.QEIM=6;
//用INDEX位置計數器復位×4模式
Return;
}

用QEI計算角度位置
控制算法采用小數運算,需要將位置計數器結果變換成一個(gè)符號小數。下式用于計算每轉最大計數值。
MAX_COUNT_PER_REV=PULSES_PER_REV×COUNT_INC_PER_REV-1=500×4-1=1999

這里分辨率為0.18°。
用這個(gè)結果,位置計數變量需要將0到1999變換成有符號16位小數值0到32767。下面的公式是定標系數。

標志脈沖配置自動(dòng)地復位POSCNT。
編碼實(shí)例
實(shí)例2:用QEI計算角位置
int AngPos[2]={0,0};
//用于速度計算的兩個(gè)變量
int POSCNTcopy=0;
{
POSCNTcopy=(int)POSCNT;
If (POSCNTcopy<0)
POSCNTcopy=- POSCNTcopy;
AngPos[1]= AngPos[0]
AngPos[0]=(unsigned int)(((unsigned long) POSCNTcopy*2048)/125;
//0<=POSCNT<=19991到0<=POSCNT<=32752
return;
}


用QEI計算角速度
在一個(gè)周期性中斷中執行速度計算,因為角速度在一個(gè)固定時(shí)間周期中是增長(cháng)的數字,這個(gè)中斷間隔,必須小于最大轉速的1/2轉所需時(shí)間。電機的轉速是3450RPM,所以在這個(gè)實(shí)例中選用4000RPM,以避免在任何速度計算時(shí)溢出。下式用于計算時(shí)間間隔:
實(shí)例3是定時(shí)器1的初始化,用于產(chǎn)生周期性中斷,dsPIC DSC運行在14.75MIPS。
實(shí)例3:定時(shí)器1初始化,產(chǎn)生0.0075秒ISR周期
void InitTMR1(void)
{
TMR1=0; //復位定時(shí)器計數器
T1CONbit.TON=0; //關(guān)閉定時(shí)器1
T1CONbit.TSIDL=0; //睡眠期間連續工作
T1CONbit.TGATE=0; //禁止進(jìn)入精確定時(shí)器
T1CONbit.TCS=0; //使用Tcy作為時(shí)鐘源
T1CONbit.TCK=2; //Tcy/64作為輸入時(shí)鐘
PR1=1728 ;
//用64預分頻器確定中斷周期=0.0075秒
IFSobit.T1IF=0; //清定時(shí)器1中斷標志
IECobits.T1IE=1; //允許定時(shí)器1中斷
T1CONbits.TON=1; //打開(kāi)定時(shí)器1
turn;
}
實(shí)例4是在周期性ISR中計算速度變量:
實(shí)例4:角速度計算實(shí)例
#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;//清定時(shí)器1中斷標志
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;
}
結語(yǔ)
從本文的編碼實(shí)例,可以得到表1所示數據。
如果測量的速度和角位置需要比較高的分辨率,可以用下列方法:
用比較長(cháng)地時(shí)間周期精確計數。必須避免脈沖計數器寄存器POSCN溢出,所以在這種情況下推薦使用POSCN寄存器的精度。
使用輸入捕捉通道代替轉換每轉計數周期測量。
用每轉產(chǎn)生更多脈沖地增量計數器。
代碼實(shí)例選用dsPIC30F6010 DSC,開(kāi)發(fā)工具是MPLAB IDE7.11和MPLAB C30 v1.31?!?br>(郭盛利)
聯(lián)系客服