熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2023-12-13 22:46
正文摘要:EC11編碼器基于運(yùn)算解碼的算法(原創(chuàng)) EC11旋轉(zhuǎn)編碼器是一種基于脈沖發(fā)生的裝置,它的編碼邏輯如下圖 單片機(jī)解碼方式主要有幾種: 1、MCU定時(shí)器自帶編碼器模式,如GD32、STM32等; 2、使用外部IO中斷,在 ... |
感謝樓主分享![]() |
代碼非常穩(wěn)定可靠!謝謝分享!!! |
zhang32568 發(fā)表于 2025-2-20 10:54 剛試了代碼非常穩(wěn)定可靠!謝謝分享!!! |
我經(jīng)常使用的程序。非常靈敏!定時(shí)器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))//兩個(gè)都是1,表示開(kāi)始第一個(gè)脈沖 { EC11_Flag =1 ;//標(biāo)記為第一個(gè)信號(hào)收到,可以進(jìn)行下一個(gè)信號(hào) } if(EC11_A!=EC11_B)//第二個(gè)信號(hào) { Left_Flag = EC11_A ; //記錄AB的信號(hào)狀態(tài) Right_Flag = EC11_B ; } if(EC11_Flag) { if((EC11_A==0)&&(EC11_B==0))// 第三個(gè)信號(hào),處理第二個(gè)信號(hào)的值 { if(Right_Flag)//右轉(zhuǎn) { //自己程序 } else if(Left_Flag) //左轉(zhuǎn) { //自己程序 } EC11_Flag = 0; //把標(biāo)志位清零,等待下一個(gè)周期 } } } |
邰夏留 發(fā)表于 2025-2-18 09:57 我用的是模塊,應(yīng)該是加了電容消抖。軟件消抖這個(gè)不好處理,你可以測(cè)試下,不消抖有什么問(wèn)題 |
zyhlove813 發(fā)表于 2023-12-13 23:11 請(qǐng)教一下樓主,這個(gè)怎么消抖的呢? |
kkfy888 發(fā)表于 2024-11-10 21:39 有心了 |
看了up的視頻,特意搜了關(guān)鍵字找到了^_^ |
講解的思路真的很清晰啊 |
編碼器,判斷誰(shuí)先跳變,就當(dāng)起始![]() |
zyhlove813 發(fā)表于 2024-7-10 13:28 沒(méi)有沉,都在學(xué)習(xí)中。感謝大佬分享的算法 ![]() |
樓主鉆研精神可嘉,向你學(xué)習(xí)。 |
![]() |
youlinys 發(fā)表于 2023-12-31 21:35 通過(guò)不同的方法去實(shí)現(xiàn)目標(biāo),可能鍛煉自己的思維能力 ![]() |
講解得很詳細(xì)。UP厲害人。 |
zyhlove813 發(fā)表于 2023-12-25 21:04 好的,我去試一下,謝謝! |
lzuoxin 發(fā)表于 2023-12-25 18:09 正常應(yīng)該是要的,我是網(wǎng)購(gòu)的模塊,帶電阻和電容濾波,不硬件濾波,你自己可以試下。 |
代碼精簡(jiǎn)高效,向樓主學(xué)習(xí)了 |
樓主的算法還需要硬件消抖電路嗎 |
發(fā)表于 2023-12-24 19:28 共同學(xué)習(xí) ![]() |
樓主鉆研精神可嘉,學(xué)習(xí)了。 |
zyhlove813 發(fā)表于 2023-12-14 13:08 剛才看了下 是我定義的變量的問(wèn)題 我的變量都是BIT 位類型的 編譯就出錯(cuò) 樓主使用的是u8類型的 |
zyhlove813 發(fā)表于 2023-12-14 13:08 APP_EC11.C(59):C193: '-': BAD OPERAND TYPE 后段那個(gè) 減號(hào) 拆成2段就正常了 |
小白只能頂樓主 |
lzzasd 發(fā)表于 2023-12-14 11:56 編譯什么提示?我是keil4 C51 編譯正常,會(huì)不會(huì)少了個(gè)括號(hào)標(biāo)點(diǎn)之類的? |
經(jīng)過(guò)測(cè)試 樓主的程序運(yùn)行穩(wěn)定 算法精簡(jiǎn)高效 感謝樓主 只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB_Last ^ KeyB_Now)這段編譯報(bào)錯(cuò) 只好拆成2段 我也貼上我常用的 也是很穩(wěn)定 if (PinA != PinA_O) //當(dāng)A發(fā)生跳變時(shí)采集B當(dāng)前的狀態(tài),并將B與上一次的狀態(tài)進(jìn)行對(duì)比。 { //若A 0->1 時(shí),B 1->0 正轉(zhuǎn);若A 1->0 時(shí),B 0->1 正轉(zhuǎn); //若A 0->1 時(shí),B 0->1 反轉(zhuǎn);若A 1->0 時(shí),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上升沿時(shí),采集的B不變且為0 encoder_data++; //正轉(zhuǎn) if ((PinB_O == PinB) && (PinB == 1)) //A上升沿時(shí),采集的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上升沿時(shí),采集的B不變且為0 encoder_data--; //反轉(zhuǎn) if ((PinB_O == PinB) && (PinB == 1)) //A上升沿時(shí),采集的B不變且為1 encoder_data++; //正轉(zhuǎn) } PinA_O = PinA; //更新編碼器上一個(gè)狀態(tài)暫存變量 PinB_O = PinB; //更新編碼器上一個(gè)狀態(tài)暫存變量 |
講解的蠻詳細(xì)的,謝謝樓主的分享 |
好文章,需要認(rèn)真學(xué)習(xí) |
同時(shí)貼上lkc8210發(fā)表的算法: //算法四: 編譯大小不錯(cuò),只適合單倍頻 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 單片機(jī)教程網(wǎng)