在電機(jī)控制中,實時獲取電機(jī)轉(zhuǎn)子位置是非常重要的。通過監(jiān)測電機(jī)軸或機(jī)械設(shè)備運(yùn)動的位置可以計算電機(jī)轉(zhuǎn)速。當(dāng)電機(jī)轉(zhuǎn)動時,編碼盤傳感器(Encoder)會發(fā)出類似于正交PWM波的高低電平信號,對此信號進(jìn)行解碼,可以得到電機(jī)轉(zhuǎn)動角度及方向。
DSC系列MCU的Quad Timer(TMR)外設(shè)可以對正交編碼信號解碼,有些客戶使用LPC55XX系列也需要解碼,本文用PLU模塊對Encoder的信號解碼,用計數(shù)器計數(shù)解碼信號,進(jìn)而得到轉(zhuǎn)子位置及速度。
1. 標(biāo)準(zhǔn)推拉輸出
DSP系列MCU的Quad Timer(TMR)外設(shè)可以對正交編碼信號進(jìn)行解碼,如下:

在進(jìn)行解碼時,其實是兩個信號發(fā)生電平翻轉(zhuǎn)時進(jìn)行計數(shù),那么可以理解為對這兩個信號做異或運(yùn)算,對結(jié)果信號上升沿和下降沿進(jìn)行計數(shù),就可實現(xiàn)解碼功能。利用可編程邏輯單元PLU對正交編碼信號做異或運(yùn)算,利用CTIMER計數(shù)器對輸出信號進(jìn)行計數(shù),同樣可以達(dá)到Quad Timer(TMR)解碼效果。
2. 配置PLU與CTIMER
PLU(Programmable Logic Unit),即可編程邏輯單元,可創(chuàng)建小型組合與時序邏輯電路。LPC804與LPC55XX的PLU在使用上是完全相同的,包含了6個輸入、8個輸出、26個5輸入查找表(LUT)、4個觸發(fā)器(state Flip-Flops),詳細(xì)介紹如下: https://www.nxpic.org.cn/module/forum/thread-622667-1-1.html 用PIO_19與PIO_20產(chǎn)生類似于正交編碼信號,將兩路信號輸入PLU模塊的IN3與IN4,進(jìn)行異或運(yùn)算,再輸出到OUT5,將OUT5信號輸入到CTIMER計數(shù)器進(jìn)行計數(shù),如下:

以LPC55S69-EVK開發(fā)板為例,具體的引腳使用如下:

配置PLU與CTIMER引腳,如下:

打開PLU與CTIMER時鐘,如下:

添加PLU外設(shè),如下:

配置CTIMER外設(shè),在main.c文件中添加CTIMER初始化,上升沿與下降沿都可觸發(fā)計數(shù)器。假如電機(jī)轉(zhuǎn)一圈觸發(fā)4096次計數(shù)器,電機(jī)在旋轉(zhuǎn)60°時要控制電機(jī)變相,當(dāng)計數(shù)器值為4096/6 = 682時,觸發(fā)一次ctimer中斷,在中斷處理函數(shù)中控制電機(jī),如下:
uint32_t motor_flag = 0;
const ctimer_config_t CTIMER0_config = {
.mode = kCTIMER_IncreaseOnBothEdge,
.input = kCTIMER_Capture_0,
.prescale = 0
};
const ctimer_match_config_t CTIMER0_Match_0_config = {
.matchValue = 681,
.enableCounterReset = true,
.enableCounterStop = false,
.outControl = kCTIMER_Output_NoAction,
.outPinInitState = false,
.enableInterrupt = true
};
/*Single callback functions definition */
ctimer_callback_t CTIMER0_callback[] ={ctimer0_match0_callback};
static void CTIMER0_init(void) {
/* CTIMER0 peripheral initialization */
CTIMER_Init(CTIMER0, &CTIMER0_config);
/* Interrupt vector CTIMER0_IRQn priority settings in theNVIC. */
NVIC_SetPriority(CTIMER0_IRQn, 0);
/* Match channel 0 of CTIMER0 peripheral initialization*/
CTIMER_SetupMatch(CTIMER0, kCTIMER_Match_0, &CTIMER0_Match_0_config);
CTIMER_RegisterCallBack(CTIMER0,CTIMER0_callback, kCTIMER_SingleCallback);
CTIMER_StartTimer(CTIMER0);
}
void ctimer0_match0_callback(uint32_t flags)
{
motor_flag++;
}
下載PLU configure tool,下載鏈接如下:
https://www.nxp.com/mcu-plu-config-tool 打開PLU配置工具,選擇原理圖設(shè)計,做一個異或運(yùn)算,如下:

點(diǎn)擊菜單欄File->Export->PLU source file將其導(dǎo)出為C文件,將C文件的內(nèi)容復(fù)制到main函數(shù)中,如下:
PLU->LUT[4].INP_MUX[0] = 0x00000003; /* IN3 (IN3) */
PLU->LUT[4].INP_MUX[1] = 0x00000004; /* IN4 (IN4) */
PLU->LUT[4].INP_MUX[2] = 0x0000003F; /* default */
PLU->LUT[4].INP_MUX[3] = 0x0000003F; /* default */
PLU->LUT[4].INP_MUX[4] = 0x0000003F; /* default */
PLU->LUT_TRUTH[4] = 0x66666666; /* XOR01 (XOR01) STD 2INPUT XOR */
PLU->OUTPUT_MUX[5] = 0x00000004; /* LUT4 (XOR01) ->OUT5 */
利用GPIO產(chǎn)生正交編碼信號,CTimer進(jìn)行計數(shù),當(dāng)計數(shù)到682時會觸發(fā)中斷進(jìn)入回調(diào)函數(shù),計數(shù)器值(TC)會自動清零,重新計數(shù),如下:
while(1) {
GPIO_PortToggle(GPIO,0, 1u << 19);
SysTick_DelayTicks(5U);
GPIO_PortToggle(GPIO,0, 1u << 20);
SysTick_DelayTicks(5U);
motor_counter = CTIMER0->TC; }
3. 測試結(jié)果 邏輯分析儀測試結(jié)果如下:

調(diào)試時,計數(shù)器的值如下所示:

示例代碼:LPC55S69_Project_motor_counter.zip
審核編輯:郭婷
-
電機(jī)控制
+關(guān)注
關(guān)注
3601文章
2173瀏覽量
278982 -
電機(jī)
+關(guān)注
關(guān)注
145文章
9700瀏覽量
154752 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2321瀏覽量
98520 -
TMR
+關(guān)注
關(guān)注
5文章
110瀏覽量
19999 -
plu
+關(guān)注
關(guān)注
1文章
6瀏覽量
7386
原文標(biāo)題:利用可編程邏輯單元PLU與CTIMER計數(shù)器解碼電機(jī)
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何通過labview和NI USB 6341(4計數(shù)器)控制4相5線步進(jìn)電機(jī)?
請分享Ctimer計數(shù)器捕獲程序的示例程序
基于VHDL的正交編碼脈沖電路解碼計數(shù)器設(shè)計
利用復(fù)位端構(gòu)成的模6計數(shù)器電路
環(huán)形計數(shù)器和扭環(huán)形計數(shù)器
計數(shù)器的控制及應(yīng)用
24進(jìn)制計數(shù)器的設(shè)計
計數(shù)器原理
電子計數(shù)器的使用_電子計數(shù)器功能
同步計數(shù)器和異步計數(shù)器是什么 同步計數(shù)器和異步計數(shù)器的主要區(qū)別?
利用電機(jī)控制中PLU模塊與CTIMER計數(shù)器解碼電機(jī)
評論