|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
手動旋轉(zhuǎn)編碼器的正確計數(shù) |
| 作者:scytrenbin 欄目:單片機(jī) |
本人現(xiàn)在用到一手動的旋轉(zhuǎn)編碼器,用單片機(jī)的I/O口象檢測按鍵那樣對其進(jìn)行查詢計數(shù),在旋轉(zhuǎn)速度較慢時,可以對其計數(shù),但速度一快(比如20Hz)就不能對其正確計數(shù)了。由于在程式中還有其它事要做,有什么辦法得到正確的計數(shù)?謝謝各位。 |
| 2樓: | >>參與討論 |
| 作者: JTJHZJ 于 2005/9/27 16:46:00 發(fā)布:
可以采用中斷處理事件 |
|
| 3樓: | >>參與討論 |
| 作者: scytrenbin 于 2005/9/27 17:28:00 發(fā)布:
還有其它方法嗎?如果中斷口的抗干擾能力較差。 |
|
| 4樓: | >>參與討論 |
| 作者: gwnpeter 于 2005/9/27 20:27:00 發(fā)布:
使用定時器的計數(shù)器功能! |
|
| 5樓: | >>參與討論 |
| 作者: peiyuan1 于 2005/9/27 20:35:00 發(fā)布:
不要在主程序中調(diào)用一次檢測函數(shù)再調(diào)用一次功能函數(shù)。應(yīng)該。。。 定時器頻率用1000左右,在定時器中檢測編碼獲得旋轉(zhuǎn)方向,并存儲到旋轉(zhuǎn)次數(shù)變量中。主程序中只檢測旋轉(zhuǎn)次數(shù)變量,如果變量值不等于1或-1,例如等于3,這是直接按3來進(jìn)行處理。 不要在主程序中調(diào)用一次檢測函數(shù)再調(diào)用一次功能函數(shù)。 |
|
| 6樓: | >>參與討論 |
| 作者: yizhonghou 于 2005/9/27 20:54:00 發(fā)布:
用硬件 |
|
| 7樓: | >>參與討論 |
| 作者: bbstom 于 2005/9/27 23:24:00 發(fā)布:
這個問題應(yīng)該請廠家來這說說. 手動旋轉(zhuǎn)編碼器廠家,竟然沒有編碼器的時序圖,也沒程序參考. 我都是以鼠標(biāo)的那種為參考. 不管怎樣都不能萬無一失的掃描.用查詢方式不是問題; 用定時器是不可行的,一個編碼器至少接兩個I/O(按鍵不接時).而且當(dāng)有N多個 編碼器時,怎么辦呢. T0/T1夠用嗎? 我懷疑是編碼器時序圖并不跟鼠標(biāo)的一樣,因此按鼠標(biāo)那種時序圖便產(chǎn)生錯誤? 本打算作為一個器件的程序庫收藏,以作備用,還花了一天的時間來測試.如有空,回頭一定把它搞定. |
|
| 8樓: | >>參與討論 |
| 作者: conwh 于 2005/9/28 1:00:00 發(fā)布:
沒問題,只是軟件上有問題。不要簡單地使用查詢。 |
|
| 9樓: | >>參與討論 |
| 作者: bbstom 于 2005/9/28 8:37:00 發(fā)布:
好,希望今天能搞定! |
|
| 10樓: | >>參與討論 |
| 作者: scytrenbin 于 2005/9/28 8:39:00 發(fā)布:
回復(fù) 請問,用查詢后,還需要做哪些工作?急!謝謝!! |
|
| 11樓: | >>參與討論 |
| 作者: creatorwu 于 2005/9/28 8:47:00 發(fā)布:
我都做過了,效果很好的 我上次正好一個方案是用旋轉(zhuǎn)編碼器,我測試的時候用了兩個編碼器, 一個是國產(chǎn)的(沒有名字),一個是日本的(ALPS),國產(chǎn)的脈沖毛刺較多, ALPS的比較好。 我是采用20ms定時中斷(還可以設(shè)定更小,根據(jù)你的編碼器規(guī)格確定)查詢2 IO,然后判斷旋轉(zhuǎn)方向,有旋轉(zhuǎn)的時候發(fā)旋轉(zhuǎn)的消息給主程序,主程序做查詢的動作。程序基本沒有漏掉計數(shù)。 |
|
| 12樓: | >>參與討論 |
| 作者: 李冬發(fā) 于 2005/9/28 14:19:00 發(fā)布:
這東西應(yīng)該很簡單的啊 |
|
| 13樓: | >>參與討論 |
| 作者: javie 于 2005/9/28 14:21:00 發(fā)布:
可以換一種編碼器啊 |
|
| 14樓: | >>參與討論 |
| 作者: scytrenbin 于 2005/9/28 18:58:00 發(fā)布:
20ms是不是有點長? 我做過測試,20ms定時查詢的話,在旋轉(zhuǎn)快了的時候就會丟數(shù)據(jù),我9ms查詢一次都會丟數(shù)據(jù)。我最后不用定時,而是程式運行到那里的時候就查詢一次,共查詢?nèi)危@樣數(shù)據(jù)不會丟,但還是有一個問題沒有解決,就是在編碼器要完成一個脈沖時,如果再將其向相反方向旋轉(zhuǎn)時可能會誤判。不知怎樣解決。 |
|
| 15樓: | >>參與討論 |
| 作者: 李冬發(fā) 于 2005/9/28 19:34:00 發(fā)布:
你的算法有問題,你必須是對邊沿進(jìn)行檢測才行 這樣不可以提高一倍的分辨率 |
|
| 16樓: | >>參與討論 |
| 作者: bbstom 于 2005/9/29 10:14:00 發(fā)布:
已測試可行。一個也不少! 使用的測試程序: 不用中斷,(測試程序中也有兩個中斷在運行。(1毫秒和20毫秒的)) 使用查詢方式也可行。 原來的問題是太過于模仿WINDWS的 NULL_KEY,KEY_UP, KEY_DOWN,KEY_PRESS事件。實踐發(fā)現(xiàn)是12MHZ的51不好做到。 現(xiàn)在就一個: KEY_MOVE +方向碼。 一個KEY_MOVE 等于 {KEY_UP,KEY_DOWN,KEY_RESS,NULL_KEY}四個過程。 |
|
| 17樓: | >>參與討論 |
| 作者: szxw 于 2005/9/29 20:39:00 發(fā)布:
用中斷方式的話 只用一個就行了,另外一個接普通I/O口即可.2ms查詢方式可以保證不漏判. 如果用A/D來做,只需一個A/D端即可,利用電阻分壓值判斷方向.用查詢方式,2ms也可以保證不漏判.當(dāng)然要根據(jù)A/D轉(zhuǎn)換時間調(diào)整 |
|
| 18樓: | >>參與討論 |
| 作者: powder 于 2005/9/30 1:52:00 發(fā)布:
20ms可能漏判。以前試過。 |
|
| 19樓: | >>參與討論 |
| 作者: bbstom 于 2005/9/30 8:21:00 發(fā)布:
中不中斷都兼容。 測試的程序不管用中斷或查詢都能正常,一個也不少! 下面是 程序的 核心 代碼。 有興趣的朋友,可聯(lián)系聯(lián)系。 void CALLBACK_WINPROC() { .... OS_ENTER_CRITICAL(); // 以中斷方式運行 CallBack_ProA = GetKeyHitHook; // 在定時的1亳秒中斷運行 OS_EXIT_CRITICAL(); while(TRUE) { // OS_ENTER_CRITICAL(); // GetKeyHitHook(); // 以查詢方式運行 // OS_EXIT_CRITICAL(); DoSomeThingCode(); TOGGLE_WD(); } } //END SUB //===============================================================// // FUNCTION: GetKeyHitHook() //===============================================================// void GetKeyHitHook(void) { if( PX_1 ^ PX2 ) { if( !PX_1 ) { SWITCH(TBUTTON.BTN1_STATUS) { case KEY_PRESS: TBUTTON.BTN1_STATUS=KEY1_UP; TBUTTON.BTN1_CODE=BUTTON1_RIGH; break; case NULL_PRESS: TBUTTON.BTN1_STATUS=KEY1_DWN; TBUTTON.BTN1_CODE=BUTTON1_LEFT; break; } } else if(!PX2) { SWITCH(TBUTTON.BTN1_STATUS) { case KEY_PRESS: TBUTTON.BTN1_STATUS=KEY1_UP; TBUTTON.BTN1_CODE=BUTTON1_LEFT; break; case NULL_PRESS: TBUTTON.BTN1_STATUS=KEY1_DWN; TBUTTON.BTN1_CODE=BUTTON1_RIGH; break; } } } else { if((!PX_1) && (!PX2)) { TBUTTON.BTN1_STATUS=KEY_PRESS; } else if(PX_1 && PX2) { if(TBUTTON.BTN1_STATUS==KEY1_UP) { TBUTTON.KEY_STATUS=KEY_MOVE; } TBUTTON.BTN1_STATUS=NULL_PRESS; } } }//END SUB |
|
| 20樓: | >>參與討論 |
| 作者: scytrenbin 于 2005/9/30 15:39:00 發(fā)布:
我也試過 我用的國產(chǎn)的編碼器。我用查詢方式做過對比,如果6MS(2MS一次,共采集3次)采集一次有效數(shù)據(jù),這樣有可能丟數(shù)據(jù)(我的程式運行一周有時可能要超過2MS),如果用主程序每運行一次就采樣一次的話,可能干擾濾不掉,有時會多出數(shù)據(jù)。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |