音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
手動旋轉(zhuǎn)編碼器的正確計數(shù)
本人現(xiàn)在用到一手動的旋轉(zhuǎn)編碼器,用單片機(jī)的I/O口象檢測按鍵那樣對其進(jìn)行查詢計數(shù),在旋轉(zhuǎn)速度較慢時,可以對其計數(shù),但速度一快(比如20Hz)就不能對其正確計數(shù)了。由于在程式中還有其它事要做,有什么辦法得到正確的計數(shù)?謝謝各位。

2樓: >>參與討論
JTJHZJ
可以采用中斷處理事件
 
3樓: >>參與討論
scytrenbin
還有其它方法嗎?如果中斷口的抗干擾能力較差。
 
4樓: >>參與討論
gwnpeter
使用定時器的計數(shù)器功能!
 
5樓: >>參與討論
peiyuan1
不要在主程序中調(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
用硬件
 
7樓: >>參與討論
bbstom
這個問題應(yīng)該請廠家來這說說.
手動旋轉(zhuǎn)編碼器廠家,竟然沒有編碼器的時序圖,也沒程序參考. 我都是以鼠標(biāo)的那種為參考. 不管怎樣都不能萬無一失的掃描.用查詢方式不是問題;
用定時器是不可行的,一個編碼器至少接兩個I/O(按鍵不接時).而且當(dāng)有N多個
編碼器時,怎么辦呢. T0/T1夠用嗎?

我懷疑是編碼器時序圖并不跟鼠標(biāo)的一樣,因此按鼠標(biāo)那種時序圖便產(chǎn)生錯誤?


本打算作為一個器件的程序庫收藏,以作備用,還花了一天的時間來測試.如有空,回頭一定把它搞定.



8樓: >>參與討論
conwh
沒問題,只是軟件上有問題。不要簡單地使用查詢。
 
9樓: >>參與討論
bbstom
好,希望今天能搞定!
 
10樓: >>參與討論
scytrenbin
回復(fù)
請問,用查詢后,還需要做哪些工作?急!謝謝!!

11樓: >>參與討論
creatorwu
我都做過了,效果很好的
   我上次正好一個方案是用旋轉(zhuǎn)編碼器,我測試的時候用了兩個編碼器,
一個是國產(chǎn)的(沒有名字),一個是日本的(ALPS),國產(chǎn)的脈沖毛刺較多,
ALPS的比較好。
   我是采用20ms定時中斷(還可以設(shè)定更小,根據(jù)你的編碼器規(guī)格確定)查詢2 IO,然后判斷旋轉(zhuǎn)方向,有旋轉(zhuǎn)的時候發(fā)旋轉(zhuǎn)的消息給主程序,主程序做查詢的動作。程序基本沒有漏掉計數(shù)。

12樓: >>參與討論
李冬發(fā)
這東西應(yīng)該很簡單的啊
 
13樓: >>參與討論
javie
可以換一種編碼器啊
 
14樓: >>參與討論
scytrenbin
20ms是不是有點長?
我做過測試,20ms定時查詢的話,在旋轉(zhuǎn)快了的時候就會丟數(shù)據(jù),我9ms查詢一次都會丟數(shù)據(jù)。我最后不用定時,而是程式運行到那里的時候就查詢一次,共查詢?nèi)危@樣數(shù)據(jù)不會丟,但還是有一個問題沒有解決,就是在編碼器要完成一個脈沖時,如果再將其向相反方向旋轉(zhuǎn)時可能會誤判。不知怎樣解決。

15樓: >>參與討論
李冬發(fā)
你的算法有問題,你必須是對邊沿進(jìn)行檢測才行
這樣不可以提高一倍的分辨率

16樓: >>參與討論
bbstom
已測試可行。一個也不少!
使用的測試程序:
不用中斷,(測試程序中也有兩個中斷在運行。(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
用中斷方式的話
只用一個就行了,另外一個接普通I/O口即可.2ms查詢方式可以保證不漏判.
如果用A/D來做,只需一個A/D端即可,利用電阻分壓值判斷方向.用查詢方式,2ms也可以保證不漏判.當(dāng)然要根據(jù)A/D轉(zhuǎn)換時間調(diào)整

18樓: >>參與討論
powder
20ms可能漏判。以前試過。
 
19樓: >>參與討論
bbstom
中不中斷都兼容。
測試的程序不管用中斷或查詢都能正常,一個也不少!
下面是 程序的 核心 代碼。

有興趣的朋友,可聯(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
我也試過
我用的國產(chǎn)的編碼器。我用查詢方式做過對比,如果6MS(2MS一次,共采集3次)采集一次有效數(shù)據(jù),這樣有可能丟數(shù)據(jù)(我的程式運行一周有時可能要超過2MS),如果用主程序每運行一次就采樣一次的話,可能干擾濾不掉,有時會多出數(shù)據(jù)。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
51通過i2c配置ov7120,有人做過嗎?
請教關(guān)于keil c
幫忙來分析分析這個東東
SyncMos  SM8952 是哪家的?
我能不能用sm5964c40p來替代sm89516Ac25p?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號