找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

EC11編碼器基于運算解碼的算法(原創(chuàng))

查看數(shù): 5792 | 評論數(shù): 30 | 收藏 43
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2023-12-13 22:46

正文摘要:

EC11編碼器基于運算解碼的算法(原創(chuàng)) EC11旋轉(zhuǎn)編碼器是一種基于脈沖發(fā)生的裝置,它的編碼邏輯如下圖 單片機解碼方式主要有幾種: 1、MCU定時器自帶編碼器模式,如GD32、STM32等; 2、使用外部IO中斷,在 ...

回復(fù)

ID:1143041 發(fā)表于 2025-5-17 13:34
感謝樓主分享
ID:46750 發(fā)表于 2025-5-17 10:53
代碼非常穩(wěn)定可靠!謝謝分享。。
ID:21740 發(fā)表于 2025-2-21 16:54
zhang32568 發(fā)表于 2025-2-20 10:54
我經(jīng)常使用的程序。非常靈敏!定時器3毫秒以內(nèi)都毫不拖泥帶水。
sbit EC11_A = P3^5;           //EC11 A ...

剛試了代碼非常穩(wěn)定可靠!謝謝分享。!
ID:30165 發(fā)表于 2025-2-20 10:54
我經(jīng)常使用的程序。非常靈敏!定時器3毫秒以內(nèi)都毫不拖泥帶水。
sbit EC11_A = P3^5;           //EC11 A端
sbit EC11_B = P3^3;           //EC11 B端
void EC11_Display()
{
   static bit EC11_Flag=0,Left_Flag=0,Right_Flag=0;

   if((EC11_A)&&(EC11_B))//兩個都是1,表示開始第一個脈沖
     {
       EC11_Flag =1 ;//標(biāo)記為第一個信號收到,可以進行下一個信號
      }

    if(EC11_A!=EC11_B)//第二個信號
     {
       Left_Flag = EC11_A ; //記錄AB的信號狀態(tài)
       Right_Flag = EC11_B ;
      }

    if(EC11_Flag)
     {
       if((EC11_A==0)&&(EC11_B==0))// 第三個信號,處理第二個信號的值
         {
           if(Right_Flag)//右轉(zhuǎn)
          {
                //自己程序      
          }
     else if(Left_Flag) //左轉(zhuǎn)
         {                             
             //自己程序
          }
         EC11_Flag = 0; //把標(biāo)志位清零,等待下一個周期
       }
    }       
}
ID:471574 發(fā)表于 2025-2-19 15:59
邰夏留 發(fā)表于 2025-2-18 09:57
請教一下樓主,這個怎么消抖的呢?

我用的是模塊,應(yīng)該是加了電容消抖。軟件消抖這個不好處理,你可以測試下,不消抖有什么問題
ID:79034 發(fā)表于 2025-2-18 09:57
zyhlove813 發(fā)表于 2023-12-13 23:11
同時貼上lkc8210發(fā)表的算法:
//算法四: 編譯大小不錯,只適合單倍頻
uint8_t KeyA_Last;

請教一下樓主,這個怎么消抖的呢?
ID:471574 發(fā)表于 2024-11-14 11:34
kkfy888 發(fā)表于 2024-11-10 21:39
看了up的視頻,特意搜了關(guān)鍵字找到了^_^

有心了
ID:98767 發(fā)表于 2024-11-10 21:39
看了up的視頻,特意搜了關(guān)鍵字找到了^_^
ID:479134 發(fā)表于 2024-11-6 12:25
講解的思路真的很清晰啊
ID:433219 發(fā)表于 2024-10-7 16:32
編碼器,判斷誰先跳變,就當(dāng)起始
ID:228467 發(fā)表于 2024-7-19 18:49
zyhlove813 發(fā)表于 2024-7-10 13:28
這么特異的算法都沉底了

沒有沉,都在學(xué)習(xí)中。感謝大佬分享的算法
ID:63692 發(fā)表于 2024-7-19 14:35

樓主鉆研精神可嘉,向你學(xué)習(xí)。
ID:471574 發(fā)表于 2024-7-10 13:28
這么特異的算法都沉底了
ID:471574 發(fā)表于 2024-1-16 18:04
youlinys 發(fā)表于 2023-12-31 21:35
講解得很詳細。UP厲害人。

通過不同的方法去實現(xiàn)目標(biāo),可能鍛煉自己的思維能力
ID:983641 發(fā)表于 2023-12-31 21:35
講解得很詳細。UP厲害人。
ID:604453 發(fā)表于 2023-12-26 09:43
zyhlove813 發(fā)表于 2023-12-25 21:04
正常應(yīng)該是要的,我是網(wǎng)購的模塊,帶電阻和電容濾波,不硬件濾波,你自己可以試下。

好的,我去試一下,謝謝!
ID:471574 發(fā)表于 2023-12-25 21:04
lzuoxin 發(fā)表于 2023-12-25 18:09
樓主的算法還需要硬件消抖電路嗎

正常應(yīng)該是要的,我是網(wǎng)購的模塊,帶電阻和電容濾波,不硬件濾波,你自己可以試下。
ID:604453 發(fā)表于 2023-12-25 19:14
代碼精簡高效,向樓主學(xué)習(xí)了
ID:604453 發(fā)表于 2023-12-25 18:09
樓主的算法還需要硬件消抖電路嗎
ID:471574 發(fā)表于 2023-12-25 13:07
發(fā)表于 2023-12-24 19:28
樓主鉆研精神可嘉,學(xué)習(xí)了。

共同學(xué)習(xí)
ID:537530 發(fā)表于 2023-12-24 19:28
樓主鉆研精神可嘉,學(xué)習(xí)了。
ID:514317 發(fā)表于 2023-12-16 10:42
zyhlove813 發(fā)表于 2023-12-14 13:08
編譯什么提示?我是keil4 C51 編譯正常,會不會少了個括號標(biāo)點之類的?

剛才看了下   是我定義的變量的問題    我的變量都是BIT 位類型的   編譯就出錯
樓主使用的是u8類型的   
ID:514317 發(fā)表于 2023-12-16 10:27
zyhlove813 發(fā)表于 2023-12-14 13:08
編譯什么提示?我是keil4 C51 編譯正常,會不會少了個括號標(biāo)點之類的?

APP_EC11.C(59):C193: '-': BAD OPERAND TYPE
后段那個 減號   拆成2段就正常了
ID:417804 發(fā)表于 2023-12-15 09:54
小白只能頂樓主
ID:471574 發(fā)表于 2023-12-14 13:08
lzzasd 發(fā)表于 2023-12-14 11:56
經(jīng)過測試   樓主的程序運行穩(wěn)定    算法精簡高效    感謝樓主
只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB ...

編譯什么提示?我是keil4 C51 編譯正常,會不會少了個括號標(biāo)點之類的?
ID:514317 發(fā)表于 2023-12-14 11:56
經(jīng)過測試   樓主的程序運行穩(wěn)定    算法精簡高效    感謝樓主
只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB_Last ^ KeyB_Now)這段編譯報錯   只好拆成2段
我也貼上我常用的   也是很穩(wěn)定


if (PinA != PinA_O)        //當(dāng)A發(fā)生跳變時采集B當(dāng)前的狀態(tài),并將B與上一次的狀態(tài)進行對比。
        {                                   //若A 0->1 時,B 1->0 正轉(zhuǎn);若A 1->0 時,B 0->1 正轉(zhuǎn);
                                                                                //若A 0->1 時,B 0->1 反轉(zhuǎn);若A 1->0 時,B 1->0 反轉(zhuǎn)
                if (PinA == 1)     //EC11_A和上一次狀態(tài)相比,為上升沿
                {
                if ((PinB_O == 1) && (PinB == 0))   //EC11_B和上一次狀態(tài)相比,為下降沿
                        encoder_data++;                         //正轉(zhuǎn)
                if ((PinB_O == 0) && (PinB == 1))   //EC11_B和上一次狀態(tài)相比,為上升沿               
                        encoder_data--;                        //反轉(zhuǎn)
                //>>>>>>>>>>>>>>>>下面為正轉(zhuǎn)一次再反轉(zhuǎn)或反轉(zhuǎn)一次再正轉(zhuǎn)處理<<<<<<<<<<<<<<<<//
                if ((PinB_O == PinB) && (PinB == 0))  //A上升沿時,采集的B不變且為0
                    encoder_data++;                                 //正轉(zhuǎn)
                if ((PinB_O == PinB) && (PinB == 1))  //A上升沿時,采集的B不變且為1
                        encoder_data--;                                //反轉(zhuǎn)
                }

                else                    //EC11_A和上一次狀態(tài)相比,為下降沿
                {
                if ((PinB_O == 1) && (PinB == 0))   //EC11_B和上一次狀態(tài)相比,為下降沿
                        encoder_data--;                        //反轉(zhuǎn)
                if ((PinB_O == 0) && (PinB == 1))   //EC11_B和上一次狀態(tài)相比,為上升沿
                        encoder_data++;                         //正轉(zhuǎn)
                //>>>>>>>>>>>>>>>>下面為正轉(zhuǎn)一次再反轉(zhuǎn)或反轉(zhuǎn)一次再正轉(zhuǎn)處理<<<<<<<<<<<<<<<<//
                if ((PinB_O == PinB) && (PinB == 0))  //A上升沿時,采集的B不變且為0
                    encoder_data--;                                //反轉(zhuǎn)
                if ((PinB_O == PinB) && (PinB == 1))  //A上升沿時,采集的B不變且為1   
                        encoder_data++;                                 //正轉(zhuǎn)
                }
                PinA_O = PinA;   //更新編碼器上一個狀態(tài)暫存變量
                PinB_O = PinB;   //更新編碼器上一個狀態(tài)暫存變量
ID:156220 發(fā)表于 2023-12-14 10:14
講解的蠻詳細的,謝謝樓主的分享
ID:1064915 發(fā)表于 2023-12-14 08:28
好文章,需要認真學(xué)習(xí)
ID:471574 發(fā)表于 2023-12-13 23:11
同時貼上lkc8210發(fā)表的算法:
//算法四: 編譯大小不錯,只適合單倍頻
uint8_t KeyA_Last;
uint8_t KeyB_Last;
uint8_t KeyA_Now;
uint8_t KeyB_Now;
int EC_Counter;

void Encoder_Ini()
{
    KeyA_Last = P10;
    KeyB_Last = P11;
}

void Encoder_Run()
{
        KeyA_Now=P10;
        KeyB_Now=P11;
        if(!KeyA_Now && KeyA_Last && KeyB_Now)
        {
                EC_Counter++;
  }
        KeyA_Last=KeyA_Now;
        if(!KeyB_Now && KeyB_Last && KeyA_Now)
        {
                EC_Counter--;
  }
        KeyB_Last=KeyB_Now;
}

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表