1.概述
4.軟件中的測速處理流程
5.測速處理代碼
6.測試方法
7.測試結果
8.參考資料
1. 概述
在電機控制中,大部分都有速度環控制,電機轉子速度的獲取可以從絕對值編碼器直接讀取、測量霍爾編碼器每隔 60 °的脈沖信號時間進行計算、測量增量編碼器多個脈沖(M 法)或單個脈沖之間(T 法)的時間來計算, 本文主要講述如何使用 NXP RT1170 的增強型 QDC 外設和增量編碼器測量電機轉子速度的方法。
2. 正交編碼器信號與測速方法介紹
正交編碼器輸出 A、B、Z 信號,3 個信號都為方波信號,當電機正向旋轉時,A 信號超前 B 信號 90 度,反轉時 B 信號超前 A 信號 90度,Z 信號為歸零信號,轉子轉一圈產生一瞬間的脈沖信號,主要用于圈數計數或 A、B 信號的脈沖數歸零,下圖為編碼器 A、B 信號示意圖,圖片來自 RT1170 參考手冊。
速度的測量的可以通過讀取編碼器的脈沖計數(兩次速度環控制周期之間的脈沖數)計算出間隔角度,RT1170 的 QDC 自動捕獲兩次速度環之間脈沖數的定時器計數,從而知道時間:T = 定時器計數 * (1/定時器頻率)。
當兩次速度環之間有多個脈沖時,相當于 M 法測速;當電機速度很快,中間只有一個脈沖計數時,相當于 T 法。
3. RT1170 QDC 解碼器用于測速的寄存器介紹
RT1170 的 QDC 外設檢測 A、B 信號邊沿(可開啟濾波和反向),判斷相位關系,對位置寄存器 UPOS、LPOS 進行加或者減操作,當反向時,寄存器 CTRL2 的 DIR 位給出方向信息。
在速度環中每次讀取 POSD 寄存器時,QDC 自動將保存兩次速度環之間的脈沖差值的 POSD 保存到 POSDH,同時清零 POSD,同時將這些脈沖之間所經過脈沖計數由POSDPER保存到POSDPERH 供軟件讀取。
LASTEDGE( Last Edge Time Hold Register )對兩次脈沖數之間進行計數,主要用于 T 法測速和 0 速檢測(當 LASTEDGE 計滿溢出時判斷為速度為 0 速,因為長時間沒有脈沖邊沿產生)。
下圖為 QDC 外設信號流程和寄存器框圖。
4. 軟件中的測速處理流程
如圖所示,當兩次速度環之間有脈沖數時,即 POSDH 不為 0 時,使用脈沖數除以時間的方式進行速度計算,按下圖左方處理,如果兩次速度環之間有方向變化判定為 0 速(剛好反向的情況)。
如果兩次速度環周期之間沒有脈沖,則使用 LASTEDGEH 來進行速度估算,因為電機速度太低,長時間沒有脈沖產生,如果電機是勻速的,估算的速度就比較準確的,根據方向使用 Speed = C/M 計算,當 LASTEDGEH 太大時,判定電機停止為 0 速。
5. 測速處理代碼
QDC 測速代碼,其處理和上圖中的處理流程一致,軟件只需要較少的操作即可計算出速度。代碼如下所示:
其他初始化代碼詳見工程文件。
bool_t MCDRV_EncSpeedCalUpdate(enc_block_t *this)
{
int64_t i64Numerator;
s_statusPass = FALSE;
// Read POSDH, POSDPERH and LASTEDGEH
this->ui16Dummy = this->pENC_base->POSD;
this->sSpeed.i16POSDH = this->pENC_base->POSDH;
this->sSpeed.ui16POSDPERH = this->pENC_base->POSDPERH;
this->sSpeed.ui16LASTEDGEH = this->pENC_base->LASTEDGEH;
// POSDH == 0
if(this->sSpeed.i16POSDH != 0)
{
// Shaft is moving during speed measurement interval
this->sSpeed.i16PosDiff = this->sSpeed.i16POSDH;
this->sSpeed.ui16Period = this->sSpeed.ui16POSDPERH;
this->sSpeed.ui16Period_1 = this->sSpeed.ui16Period;
if(this->sSpeed.i16PosDiff > 0)
{
this->sSpeed.i8SpeedSign = 1;
}
else
{
this->sSpeed.i8SpeedSign = -1;
}
if(this->sSpeed.i8SpeedSign == this->sSpeed.i8SpeedSign_1)
{
// Calculate speed
i64Numerator = ((int64_t)(this->sSpeed.i16PosDiff) * this->sSpeed.f32SpeedCalConst); // Q16.0 * Q5.27 = Q21.27
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4; // Q5.27 -> Q1.31
}
else
{
this->sSpeed.f32Speed = 0;
}
this->sSpeed.i8SpeedSign_1 = this->sSpeed.i8SpeedSign;
}
else
{
// Shaft is NOT moving during speed measurement interval
this->sSpeed.ui16Period = this->sSpeed.ui16LASTEDGEH;
if((uint32_t)(this->sSpeed.ui16Period) > 0xF000UL)
{
// Shaft hasn't been moving for a long time
this->sSpeed.f32Speed = 0;
this->sSpeed.i8SpeedSign_1 = this->sSpeed.i8SpeedSign;
}
else
{
// Speed estimation in low speed region
if(this->sSpeed.ui16Period > this->sSpeed.ui16Period_1)
{
if(this->sSpeed.i8SpeedSign > 0)
{
i64Numerator = ((int64_t)(1.0) * this->sSpeed.f32SpeedCalConst);
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4;
}
else
{
i64Numerator = ((int64_t)(-1.0) * this->sSpeed.f32SpeedCalConst);
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4;
}
}
}
}
this->sSpeed.f16SpeedFilt = GDFLIB_FilterIIR1_F16(MLIB_Conv_F16l(this->sSpeed.f32Speed), &this->sSpeed.sENCSpeedFilter);
this->sSpeed.fltSpeed = MLIB_ConvSc_FLTsf(this->sSpeed.f16SpeedFilt, this->sSpeed.fltSpeedFrac16ToAngularCoeff);
return s_statusPass;
}
6.測試方法
使用其他電機拖動帶增量編碼器的伺服電機穩定轉至 1500 RPM,使用激光測速儀進行測速,伺服電機的增量編碼器信號是差分信號,經過功率板將差分信號轉換到單端信號,最后連接到 RT1170 開發板 ENC1 對應的 GPIO 口中,如果電機增量編碼器 AB 輸出信號單端信號可直接連接至 RT1170 開發板。
最后可以在 IAR 中通過 LiveWatch 窗口查看速度變量,檢查與用激光測速器測的速度是否一致。
拖動伺服電機轉至 1500RPM
信號連接實物圖
AB 信號連接原理圖
7. 測試結果
IAR DEBUG 后,在 IAR 的 live Watch 窗口中查看 Encoder_Measure_SpeedRPM 變量,其值為 1500RPM 左右,說明測速還是比較準確的。
參考資料
參考手冊:
IMXRT1170RM.pdf
i.MX RT1170 Processor Reference Manual
-
電機
+關注
關注
142文章
9050瀏覽量
145912
發布評論請先 登錄
相關推薦
評論