在電機控制中,實時獲取電機轉子位置是非常重要的。通過監測電機軸或機械設備運動的位置可以計算電機轉速。當電機轉動時,編碼盤傳感器(Encoder)會發出類似于正交PWM波的高低電平信號,對此信號進行解碼,可以得到電機轉動角度及方向。
DSC系列MCU的Quad Timer(TMR)外設可以對正交編碼信號解碼,有些客戶使用LPC55XX系列也需要解碼,本文用PLU模塊對Encoder的信號解碼,用計數器計數解碼信號,進而得到轉子位置及速度。
1. 標準推拉輸出
DSP系列MCU的Quad Timer(TMR)外設可以對正交編碼信號進行解碼,如下:
在進行解碼時,其實是兩個信號發生電平翻轉時進行計數,那么可以理解為對這兩個信號做異或運算,對結果信號上升沿和下降沿進行計數,就可實現解碼功能。利用可編程邏輯單元PLU對正交編碼信號做異或運算,利用CTIMER計數器對輸出信號進行計數,同樣可以達到Quad Timer(TMR)解碼效果。
2. 配置PLU與CTIMER
PLU(Programmable Logic Unit),即可編程邏輯單元,可創建小型組合與時序邏輯電路。LPC804與LPC55XX的PLU在使用上是完全相同的,包含了6個輸入、8個輸出、26個5輸入查找表(LUT)、4個觸發器(state Flip-Flops),詳細介紹如下: https://www.nxpic.org.cn/module/forum/thread-622667-1-1.html 用PIO_19與PIO_20產生類似于正交編碼信號,將兩路信號輸入PLU模塊的IN3與IN4,進行異或運算,再輸出到OUT5,將OUT5信號輸入到CTIMER計數器進行計數,如下:
以LPC55S69-EVK開發板為例,具體的引腳使用如下:
配置PLU與CTIMER引腳,如下:
打開PLU與CTIMER時鐘,如下:
添加PLU外設,如下:
配置CTIMER外設,在main.c文件中添加CTIMER初始化,上升沿與下降沿都可觸發計數器。假如電機轉一圈觸發4096次計數器,電機在旋轉60°時要控制電機變相,當計數器值為4096/6 = 682時,觸發一次ctimer中斷,在中斷處理函數中控制電機,如下:
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配置工具,選擇原理圖設計,做一個異或運算,如下:
點擊菜單欄File->Export->PLU source file將其導出為C文件,將C文件的內容復制到main函數中,如下:
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產生正交編碼信號,CTimer進行計數,當計數到682時會觸發中斷進入回調函數,計數器值(TC)會自動清零,重新計數,如下:
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. 測試結果 邏輯分析儀測試結果如下:
調試時,計數器的值如下所示:
示例代碼:LPC55S69_Project_motor_counter.zip
審核編輯:郭婷
-
電機控制
+關注
關注
3540文章
1897瀏覽量
269263 -
電機
+關注
關注
142文章
9088瀏覽量
146384 -
計數器
+關注
關注
32文章
2261瀏覽量
94986 -
TMR
+關注
關注
5文章
80瀏覽量
19059 -
plu
+關注
關注
1文章
6瀏覽量
7287
原文標題:利用可編程邏輯單元PLU與CTIMER計數器解碼電機
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
如何通過labview和NI USB 6341(4計數器)控制4相5線步進電機?
請分享Ctimer計數器捕獲程序的示例程序
基于VHDL的正交編碼脈沖電路解碼計數器設計
24進制計數器的設計
![24進制<b class='flag-5'>計數器</b>的設計](https://file.elecfans.com/web2/M00/49/4E/poYBAGKhwJ2AFHgDAAASYYcXMRA276.jpg)
同步計數器和異步計數器是什么 同步計數器和異步計數器的主要區別?
![同步<b class='flag-5'>計數器</b>和異步<b class='flag-5'>計數器</b>是什么 同步<b class='flag-5'>計數器</b>和異步<b class='flag-5'>計數器</b>的主要區別?](https://file.elecfans.com//web2/M00/9A/98/poYBAGQevHSAAJNiAAAbyqqassE241.png)
評論