![]() |
發(fā)布時間: 2023-12-13 22:46
正文摘要:EC11編碼器基于運算解碼的算法(原創(chuàng)) EC11旋轉(zhuǎn)編碼器是一種基于脈沖發(fā)生的裝置,它的編碼邏輯如下圖 單片機解碼方式主要有幾種: 1、MCU定時器自帶編碼器模式,如GD32、STM32等; 2、使用外部IO中斷,在 ... |
感謝樓主分享![]() |
代碼非常穩(wěn)定可靠!謝謝分享。。 |
zhang32568 發(fā)表于 2025-2-20 10:54 剛試了代碼非常穩(wěn)定可靠!謝謝分享。! |
我經(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)志位清零,等待下一個周期 } } } |
邰夏留 發(fā)表于 2025-2-18 09:57 我用的是模塊,應(yīng)該是加了電容消抖。軟件消抖這個不好處理,你可以測試下,不消抖有什么問題 |
zyhlove813 發(fā)表于 2023-12-13 23:11 請教一下樓主,這個怎么消抖的呢? |
kkfy888 發(fā)表于 2024-11-10 21:39 有心了 |
看了up的視頻,特意搜了關(guān)鍵字找到了^_^ |
講解的思路真的很清晰啊 |
編碼器,判斷誰先跳變,就當(dāng)起始![]() |
zyhlove813 發(fā)表于 2024-7-10 13:28 沒有沉,都在學(xué)習(xí)中。感謝大佬分享的算法 ![]() |
樓主鉆研精神可嘉,向你學(xué)習(xí)。 |
![]() |
youlinys 發(fā)表于 2023-12-31 21:35 通過不同的方法去實現(xiàn)目標(biāo),可能鍛煉自己的思維能力 ![]() |
講解得很詳細。UP厲害人。 |
zyhlove813 發(fā)表于 2023-12-25 21:04 好的,我去試一下,謝謝! |
lzuoxin 發(fā)表于 2023-12-25 18:09 正常應(yīng)該是要的,我是網(wǎng)購的模塊,帶電阻和電容濾波,不硬件濾波,你自己可以試下。 |
代碼精簡高效,向樓主學(xué)習(xí)了 |
樓主的算法還需要硬件消抖電路嗎 |
發(fā)表于 2023-12-24 19:28 共同學(xué)習(xí) ![]() |
樓主鉆研精神可嘉,學(xué)習(xí)了。 |
zyhlove813 發(fā)表于 2023-12-14 13:08 剛才看了下 是我定義的變量的問題 我的變量都是BIT 位類型的 編譯就出錯 樓主使用的是u8類型的 |
zyhlove813 發(fā)表于 2023-12-14 13:08 APP_EC11.C(59):C193: '-': BAD OPERAND TYPE 后段那個 減號 拆成2段就正常了 |
小白只能頂樓主 |
lzzasd 發(fā)表于 2023-12-14 11:56 編譯什么提示?我是keil4 C51 編譯正常,會不會少了個括號標(biāo)點之類的? |
經(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)暫存變量 |
講解的蠻詳細的,謝謝樓主的分享 |
好文章,需要認真學(xué)習(xí) |
同時貼上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; } |
Powered by 單片機教程網(wǎng)