標(biāo)題: 一定位一脈沖的EC11旋轉(zhuǎn)編碼器最簡潔的單片機(jī)驅(qū)動(dòng)代碼 [打印本頁]

作者: lkc8210    時(shí)間: 2021-7-2 19:11
標(biāo)題: 一定位一脈沖的EC11旋轉(zhuǎn)編碼器最簡潔的單片機(jī)驅(qū)動(dòng)代碼
先上代碼為敬
  1.             if(!PinA && PinA_O && PinB) {
  2.                 Now++;
  3.             }PinA_O = PinA;               
  4.             if(!PinB && PinB_O && PinA) {
  5.                 Now--;
  6.             }PinB_O = PinB;        
復(fù)制代碼
只有六行代碼就能用EC11對(duì)Now進(jìn)行加減操作

為什么這樣寫呢?
上時(shí)序圖
順時(shí)針轉(zhuǎn):


逆時(shí)針轉(zhuǎn):


我們看到,當(dāng)順時(shí)針轉(zhuǎn)時(shí)
Pin A會(huì)早于Pin B 轉(zhuǎn)低電平,反之亦然

代碼解讀:
!PinA && PinA_O && PinB//當(dāng)Pin A 為低電平而之前為高電平(即下降沿)并且Pin B為高電平
這一句就捕捉到順時(shí)針轉(zhuǎn)時(shí)序圖中箭指著的那一剎那的情況
于是Now加1

!PinB && PinB_O && PinA//當(dāng)Pin B 為低電平而之前為高電平(即下降沿)并且Pin A為高電平
這一句就捕捉到逆時(shí)針轉(zhuǎn)時(shí)序圖中箭指著的那一剎那的情況
于是Now減1



如果編碼器不加電容消抖
就用軟件消抖

  1.         if(ScanCount++ > 50) {        //其數(shù)值按單片機(jī)速度加減
  2.             ScanCount = 0;
  3.             if(PinA && !PinA_O && PinB) {
  4.                 Now++;
  5.             }PinA_O = PinA;               
  6.             if(PinB && !PinB_O && PinA) {
  7.                 Now--;
  8.             }PinB_O = PinB;                        
  9.             Now>9? Now = 0:_nop_();
  10.             Now<0? Now = 9:_nop_();
  11.         }
復(fù)制代碼
現(xiàn)附上小應(yīng)用實(shí)例一則
基如STC15F104E的EC11軟串口六位密碼檢查程序
如發(fā)現(xiàn)順逆時(shí)針相反,對(duì)調(diào)PinA/PinB 定義腳即可


上圖.c文件51hei下載: Encoder3_PW_Lock.zip (1.7 KB, 下載次數(shù): 467)


作者: haokey    時(shí)間: 2021-7-3 09:46
假如順時(shí)針扭了一點(diǎn)但沒到位之前逆時(shí)針扭回去了呢?
作者: lkc8210    時(shí)間: 2021-7-3 12:37
不考慮任何不正常操作
作者: zenghl    時(shí)間: 2021-7-3 14:49
代碼簡潔易懂
作者: dzbj    時(shí)間: 2021-7-3 17:04
haokey 發(fā)表于 2021-7-3 09:46
假如順時(shí)針扭了一點(diǎn)但沒到位之前逆時(shí)針扭回去了呢?

我覺得"ScanCount++"解決了你說的問題 就是說這之后得到的是一個(gè)確定值 要么轉(zhuǎn)了要么沒轉(zhuǎn) 即便按你說的哆嗦一下 那也是下一次監(jiān)測的事了

感覺這代碼寫的不錯(cuò)
作者: lkc8210    時(shí)間: 2021-7-3 23:41
dzbj 發(fā)表于 2021-7-3 17:04
我覺得"ScanCount++"解決了你說的問題 就是說這之后得到的是一個(gè)確定值 要么轉(zhuǎn)了要么沒轉(zhuǎn) 即便按你說的哆 ...

然而,并不能
之前的回覆草率了

先上時(shí)序圖



青色虛線之間是一次完整的脈沖
Now++是發(fā)生在第一條青色虛線之后少少的時(shí)間
但一定早于哆嗦X 和 哆嗦Y
而Now++或Now--的先要條件是: 之前高電平+現(xiàn)在低電平(下降沿發(fā)生)
無論哆嗦X 還是 哆嗦Y所產(chǎn)生的都是之前低電平+現(xiàn)在高電平(上升沿發(fā)生)
不滿足Now++或Now--的先要條件

haokey兄所提出的問題,真正答案是:沒事發(fā)生


而"ScanCount++"所做的事是加長掃描時(shí)間去消抖
再上時(shí)序圖:



這是一個(gè)不干凈的脈沖
如果沒有"ScanCount++"



單片機(jī)會(huì)在黃色虛線那里判斷
結(jié)果在3,4,6判為成立

如果加上"ScanCount++"


就只會(huì)在2那里成立,避開了抖動(dòng)

當(dāng)然"ScanCount++ >"的數(shù)值要進(jìn)行調(diào)節(jié)
如果數(shù)值太大如圖



在2看到的就是B之前高電平+B現(xiàn)在低電平(B下降沿發(fā)生)+A高電平 = 逆時(shí)針轉(zhuǎn)了!
                       
       
                                                        

作者: haokey    時(shí)間: 2021-7-7 11:25
lkc8210 發(fā)表于 2021-7-3 23:41
然而,并不能
之前的回覆草率了

能不能幫忙分析一下有沒有其他不正常的情況?
作者: haokey    時(shí)間: 2021-7-7 12:20
lkc8210 發(fā)表于 2021-7-3 23:41
然而,并不能
之前的回覆草率了

探討一下,假如我改成這樣會(huì)怎樣:
if(!PinA&&PinB)
{PinA_O= 1;}
if(!PinB&&PinA)
{PinB_O= 1;}
                               
                               
if(PinA_O&& PinA)
{
        PinA_O = 0;
        if(!PinB)
        {
                Now++;
        }
}
                               
if(PinB_O&& PinB)
{
        PinB_O= 0;
        if(!PinA)
        {
                Now--;
        }
}                                               
作者: lkc8210    時(shí)間: 2021-7-7 17:20
haokey 發(fā)表于 2021-7-7 12:20
探討一下,假如我改成這樣會(huì)怎樣:
if(!PinA&&PinB)
{PinA_O= 1;}

這樣改是為了什么?
作者: yxlitol    時(shí)間: 2021-8-25 19:52
小白請(qǐng)教:請(qǐng)問,IF最后面大括號(hào)外面的PinA_O = PinA是什么意思?
if(PinA && !PinA_O && PinB) {
                Now++;
            }PinA_O = PinA;


作者: yxlitol    時(shí)間: 2021-8-25 19:57
PinA_O是怎么定義為下降沿的?真心請(qǐng)教
作者: lovexiazai    時(shí)間: 2022-1-27 11:10
代碼簡潔
作者: cdhigh    時(shí)間: 2022-1-28 06:16
按中鍵時(shí)如果有移位,可能會(huì)誤觸發(fā)一次加減
作者: lkc8210    時(shí)間: 2022-1-28 13:54
yxlitol 發(fā)表于 2021-8-25 19:52
小白請(qǐng)教:請(qǐng)問,IF最后面大括號(hào)外面的PinA_O = PinA是什么意思?
if(PinA && !PinA_O && PinB) {
       ...

記錄A腳電平
作者: lkc8210    時(shí)間: 2022-1-28 14:00
yxlitol 發(fā)表于 2021-8-25 19:57
PinA_O是怎么定義為下降沿的?真心請(qǐng)教

不是單單用PinA_O去看
要結(jié)合PinA
if(!PinA && PinA_O && PinB)的文字表達(dá)就是:
當(dāng)"A腳現(xiàn)在是低電平" 與 "A腳前一次是高電平" 與 "B腳現(xiàn)在是高電平" 時(shí)成立

!PinA && PinA_O 這倆合起來才能判斷是否下降沿
作者: lkc8210    時(shí)間: 2022-1-28 14:03
cdhigh 發(fā)表于 2022-1-28 06:16
按中鍵時(shí)如果有移位,可能會(huì)誤觸發(fā)一次加減

如果編碼器太松就有可能
作者: xiexugang    時(shí)間: 2022-2-3 22:59
這個(gè)代碼寫的不錯(cuò) 簡明有效 很實(shí)用
作者: wasonking    時(shí)間: 2022-2-5 01:12
代碼簡潔易懂
作者: bhjyqjs    時(shí)間: 2022-2-7 10:49
樓主代碼及其精簡,不錯(cuò)!
實(shí)際上,只檢測A引腳的下降沿,由B引腳狀態(tài)決定加減更高效。
經(jīng)實(shí)驗(yàn),無漏脈沖和多加多減現(xiàn)象。
void key()   //按鍵處理
{
      if((PinA_O== PinA)||(PinA ==1))  //不理會(huì)A引腳上升沿,低電平每個(gè)脈沖只做一次處理
         {
                 PinA_O= PinA;
                  return;
         }                                                         
       (PinB == 0) ? NUM-- : NUM++;   //根據(jù)引腳B的值,判斷正反轉(zhuǎn)
        PinA_O = PinA;                         //存儲(chǔ)引腳A狀態(tài)
}
采樣A引腳下降沿時(shí)B引腳狀態(tài),同相減、異相加。
作者: lzzasd    時(shí)間: 2022-2-7 16:45
你這種處理方法我都試過了   用在EC11旋轉(zhuǎn)編碼器上勉強(qiáng)夠用  也存在其他處理占用時(shí)間而掉脈沖的情況   但如果脈沖要達(dá)到1K的速度   就掉脈沖嚴(yán)重
EC11還是可以用下的   
作者: lkc8210    時(shí)間: 2022-2-7 17:20
bhjyqjs 發(fā)表于 2022-2-7 10:49
樓主代碼及其精簡,不錯(cuò)!
實(shí)際上,只檢測A引腳的下降沿,由B引腳狀態(tài)決定加減更高效。
經(jīng)實(shí)驗(yàn),無漏脈沖 ...

妙啊~
作者: cdhigh    時(shí)間: 2022-2-8 01:32
lkc8210 發(fā)表于 2022-1-28 14:03
如果編碼器太松就有可能

為什么我知道是因?yàn)槲乙郧熬褪怯妙愃频乃惴,后來全部換成更復(fù)雜的算法了。
看應(yīng)用,如果誤加減影響不大則可以用,否則需要更魯棒性的算法
作者: cn_zhx    時(shí)間: 2022-2-8 10:18
本帖最后由 cn_zhx 于 2022-2-8 14:43 編輯

其實(shí),這里AB數(shù)據(jù)線產(chǎn)生的是格雷碼,如果我們采集時(shí)采用判斷AB兩線的變化,即,A或B來下降沿時(shí),作出4次判斷,可以避免樓上所說的哆嗦,但是,要求采樣頻率要跟得上,可以采用加減速器的方法,
作者: lkc8210    時(shí)間: 2022-2-8 13:29
cn_zhx 發(fā)表于 2022-2-8 10:18
其實(shí),這里AB數(shù)據(jù)線產(chǎn)生的是格雷碼,如果我們采集時(shí)采用判斷AB兩線的變化,即,A或B來下降沿時(shí),作出4次判 ...

什么是加減速器的方法?
可以詳細(xì)說說嗎?
作者: cn_zhx    時(shí)間: 2022-2-8 14:40
齒輪傳動(dòng),小齒輪帶大齒輪,用大齒輪帶動(dòng)編碼器旋轉(zhuǎn),即可降低轉(zhuǎn)速
作者: hewayking    時(shí)間: 2022-2-16 14:19
個(gè)人做法硬件加104電容  一個(gè)接外部中斷一個(gè)接普通IO    中斷后讀普通IO高低     正轉(zhuǎn)高或低   反轉(zhuǎn)低或高控制++ --      可靠高效無敵  一般人我不告訴他
作者: guojizhou    時(shí)間: 2022-2-17 14:27
hewayking 發(fā)表于 2022-2-16 14:19
個(gè)人做法硬件加104電容  一個(gè)接外部中斷一個(gè)接普通IO    中斷后讀普通IO高低     正轉(zhuǎn)高或低   反轉(zhuǎn)低或高 ...

難打別人不都是這樣嗎?
作者: datouyuan    時(shí)間: 2022-6-14 15:48
hewayking 發(fā)表于 2022-2-16 14:19
個(gè)人做法硬件加104電容  一個(gè)接外部中斷一個(gè)接普通IO    中斷后讀普通IO高低     正轉(zhuǎn)高或低   反轉(zhuǎn)低或高 ...

我也認(rèn)為這種方法更好。
http://www.torrancerestoration.com/bbs/dpj-221520-1.html
這是用十速51mcu做的直流電機(jī)定位功能,非?煽繙(zhǔn)確,用于EC11要加104電容。
一定要用軟件消抖,要增加2個(gè)全局bit變量用于存儲(chǔ)AB引腳之前的狀態(tài),但這樣增加了不少mcu開銷。
作者: 微笑的小小    時(shí)間: 2022-11-8 17:51
這個(gè)代碼我在STC15W408AS上調(diào)試通過。 為什么在STC8H1K08上不行,就是沒有操作EC11旋轉(zhuǎn)編碼器,電腦串口    不斷收到數(shù)據(jù)。                                                                                                                                                                                          
作者: 微笑的小小    時(shí)間: 2022-11-8 20:55
//00準(zhǔn)雙向  01推挽輸出  10高阻輸入 11開漏輸出高阻輸入
P3M1 = B0000_0000;
P3M0 = B1010_0000;

增加這個(gè)后就可以了
作者: 微笑的小小    時(shí)間: 2022-11-8 20:55
stc8h默認(rèn)是高阻
作者: hi等你    時(shí)間: 2023-4-17 10:59
不用這么復(fù)雜,只要判斷兩個(gè)腳是11,然后延時(shí)毫秒多少。忘了,再判斷是不是10,就說明

它旋轉(zhuǎn)了,如果判斷出來是01就是反方向旋轉(zhuǎn)了,中斷和定時(shí)器都不需要,主程序留在

等待的時(shí)候加一丟丟延時(shí)再執(zhí)行就ok了
作者: 17735215296    時(shí)間: 2023-6-26 22:21
hi等你 發(fā)表于 2023-4-17 10:59
不用這么復(fù)雜,只要判斷兩個(gè)腳是11,然后延時(shí)毫秒多少。忘了,再判斷是不是10,就說明

它旋轉(zhuǎn)了,如果判 ...

[em17
作者: lkc8210    時(shí)間: 2023-6-27 11:30
hi等你 發(fā)表于 2023-4-17 10:59
不用這么復(fù)雜,只要判斷兩個(gè)腳是11,然后延時(shí)毫秒多少。忘了,再判斷是不是10,就說明

它旋轉(zhuǎn)了,如果判 ...

看到"延時(shí)毫秒"和"中斷和定時(shí)器都不需要"
就知道你還沒弄懂
作者: hi等你    時(shí)間: 2023-6-28 16:05
lkc8210 發(fā)表于 2023-6-27 11:30
看到"延時(shí)毫秒"和"中斷和定時(shí)器都不需要"
就知道你還沒弄懂



我就是不用定時(shí)器和中斷,這個(gè)資源用在更重要的地方,只需要判斷10和11就行,反轉(zhuǎn)判斷01和11.

已經(jīng)成品用了好久了,手感也很好

作者: cnfloatleaf    時(shí)間: 2023-6-30 21:18
EC11不需要用延時(shí),放在中斷程序中,占用資源很少,用的很穩(wěn)定。
作者: cnfloatleaf    時(shí)間: 2023-6-30 21:21
微笑的小小 發(fā)表于 2022-11-8 17:51
這個(gè)代碼我在STC15W408AS上調(diào)試通過。 為什么在STC8H1K08上不行,就是沒有操作EC11旋轉(zhuǎn)編碼器,電腦串口     ...

STC15W的引腳默認(rèn)是準(zhǔn)雙向口,STC8H的引腳默認(rèn)是高阻,初始化的時(shí)候需要設(shè)置為準(zhǔn)雙向口。
作者: joyb    時(shí)間: 2023-7-1 09:36
hi等你 發(fā)表于 2023-6-28 16:05
我就是不用定時(shí)器和中斷,這個(gè)資源用在更重要的地方,只需要判斷10和11就行,反轉(zhuǎn)判斷01和11.

已 ...

能否共享一下
作者: herui2128    時(shí)間: 2023-9-22 15:41
謝謝樓主分享,我用的STC15W408AS。用樓主的例程,采用兩個(gè)外部中斷來檢測脈沖。能正常檢測到正轉(zhuǎn)和反轉(zhuǎn)。但是旋轉(zhuǎn)編碼器的旋轉(zhuǎn)速度稍微快點(diǎn),就容易丟脈沖(脈沖速度快了,連成一片了),導(dǎo)致單片機(jī)采不到或者誤采到B相。求一下速度快點(diǎn)的解決辦法。count1和count2是正轉(zhuǎn)和反轉(zhuǎn)的脈沖計(jì)數(shù),以后用于計(jì)算角度使用。
void exint0() interrupt 0       //INT0中斷入口
{       
        if(!P32 && PinA_O && P33)
        {
                count1++;
               
        }       
        PinA_O = P32;
}
//外部中斷服務(wù)程序1
void exint1() interrupt 2       //INT1中斷入口
{
        if(!P33 && PinB_O && P32)
        {
                count2++;
        }
        PinB_O = P33;
}
作者: lkc8210    時(shí)間: 2023-9-22 16:14
herui2128 發(fā)表于 2023-9-22 15:41
謝謝樓主分享,我用的STC15W408AS。用樓主的例程,采用兩個(gè)外部中斷來檢測脈沖。能正常檢測到正轉(zhuǎn)和反轉(zhuǎn)。 ...

用一個(gè)外中斷即可
  1. uint Delay_XD = 0;
  2. bit Encoder_EN = 1;
  3. void exint0() interrupt 0       //INT0中斷入口
  4. {
  5.         if(Encoder_EN)
  6.         {
  7.                 if(!P33)
  8.                 {
  9.                         count1++;
  10.                 }else{
  11.                         count2++;
  12.                 }
  13.                 Encoder_EN = 0;
  14.         }
  15. }
  16. void main()
  17. {
  18.         //your code
  19.         while(1)
  20.         {
  21.                 //your code
  22.                 if(!Encoder_EN)
  23.                 {
  24.                         if(P32)
  25.                         {
  26.                                 if(Delay_XD++>=1000)//按主循環(huán)周期調(diào)節(jié)
  27.                                 {
  28.                                         Delay_XD = 0;
  29.                                         Encoder_EN = 1;
  30.                                 }
  31.                         }else{
  32.                                 Delay_XD = 0;
  33.                         }
  34.                 }
  35.         }
  36. }
復(fù)制代碼




作者: wkman    時(shí)間: 2023-9-22 19:34
一般方法:先判斷跳變(同時(shí)觸發(fā)抖動(dòng)計(jì)時(shí)連續(xù)判斷),再判斷另一個(gè)io的高低,
作者: 君工創(chuàng)    時(shí)間: 2023-9-22 23:34
我用一個(gè)外中斷,使用正常。
作者: 劉佑紅    時(shí)間: 2023-9-25 15:48
以下是我之前采用拿來主義得到的,只對(duì)判斷后執(zhí)行部分稍作修改,應(yīng)用還不錯(cuò)。
/************************參數(shù)設(shè)置***************************/
void        canshu()                                //EC11旋轉(zhuǎn)編碼器一定位一脈沖
{
        static bit LastA = 0;                 //EC11旋轉(zhuǎn)編碼器的A引腳上一次的狀態(tài)
        static bit LastB = 0;                //EC11旋轉(zhuǎn)編碼器的B引腳上一次的狀態(tài)
               
  if(KA != LastA)                         //判斷EC11旋轉(zhuǎn)編碼器A引腳是否等于上一次的狀態(tài)
  {
    if(KA == 0)                                //EC11旋轉(zhuǎn)編碼器旋轉(zhuǎn)后,判斷KA是否是低電平狀態(tài)
         {
                if(KB)                         //判斷KB引腳當(dāng)前狀態(tài),高電平則為正轉(zhuǎn)
                        {num++;}                                                
                else
                        {num--;}                                                       
         }       
     LastA = KA;                         //更新編碼器上一個(gè)狀態(tài)暫存變量
     LastB = KB;                         //更新編碼器上一個(gè)狀態(tài)暫存變量
   }
}

現(xiàn)在看來LsaB變量似乎沒有用,有空了去掉它試試。對(duì)于正反向不同的EC11,我是通過調(diào)換num變量的加減方向來解決的。
作者: zhxzhx    時(shí)間: 2023-9-28 09:49
haokey 發(fā)表于 2021-7-7 12:20
探討一下,假如我改成這樣會(huì)怎樣:
if(!PinA&&PinB)
{PinA_O= 1;}

你這樣是不行的,會(huì)重復(fù)的加或減
作者: zhxzhx    時(shí)間: 2023-9-28 09:57
  unsigned char key=0;
  static bit nextA;
  if (KA()!=nextA)
    {nextA=KA();
      if (nextA==1)
        {if (KB()==1) key=6;else key=5;}
      else
        {if (KB()==0) key=6;else key=5;}
    }
return key;
作者: diyage    時(shí)間: 2023-11-25 19:55
劉佑紅 發(fā)表于 2023-9-25 15:48
以下是我之前采用拿來主義得到的,只對(duì)判斷后執(zhí)行部分稍作修改,應(yīng)用還不錯(cuò)。
/************************ ...

我跟你用的一樣,但是發(fā)現(xiàn)轉(zhuǎn)快了丟碼,慢很好
作者: hhp008    時(shí)間: 2023-11-29 14:12
下載學(xué)習(xí)一下,正準(zhǔn)備用這個(gè)一定位一脈沖編碼器。
作者: 劉佑紅    時(shí)間: 2023-11-29 15:01
diyage 發(fā)表于 2023-11-25 19:55
我跟你用的一樣,但是發(fā)現(xiàn)轉(zhuǎn)快了丟碼,慢很好

你說的這種情況,確實(shí)存在,也不能旋轉(zhuǎn)過快,且在部分EC11上表現(xiàn)明顯,即存在挑EC11現(xiàn)象,,后來我嘗試將KB對(duì)地接的104電容換成105的就改善了,也不挑EC11了,你可試試。
作者: skyrusher    時(shí)間: 2023-11-29 16:40
很好的優(yōu)化方法,學(xué)習(xí)了!
作者: zyhlove813    時(shí)間: 2023-12-14 17:37
樓主的代碼很不錯(cuò),我這邊有另一種算法,也很精簡EC11編碼器基于運(yùn)算解碼的算法(原創(chuàng)),匯編后大小也基本一樣,有一個(gè)算法甚至更小
作者: shennognshi    時(shí)間: 2024-1-19 14:17
完美的代碼效果應(yīng)該是轉(zhuǎn)動(dòng)一下只計(jì)數(shù)一下,不能多增也不能不增,最重要的是!不論轉(zhuǎn)得多快還是多慢,都如此,那才是好代碼!從這個(gè)標(biāo)準(zhǔn)來說,我試驗(yàn)了上10款作者自詡為非常不錯(cuò)的代碼,均不合格!當(dāng)然我自己也編不出合格的代碼來,一度懷疑是我買的EC11編碼器在硬件方面不合格,因?yàn)橹挥猩侠娮。沒有消抖電容。但符合這樣標(biāo)準(zhǔn)的編碼器效果是普遍存在的,比如十幾、二十年前的進(jìn)口功放機(jī),就采用了旋轉(zhuǎn)編碼器調(diào)整音量,那編碼器的使用效果才是我追求的,現(xiàn)在我的一個(gè)項(xiàng)目卡在編碼器上,怎么都不好用,肯定采用中斷來實(shí)現(xiàn),還沒找到合適的代碼,下一步寄加消抖電容看看誰的代碼最理想,再來匯報(bào)。
作者: nearsea    時(shí)間: 2024-1-19 14:51
這東西還是需要用狀態(tài)機(jī)來寫,只要描述好正常狀態(tài)遷移的關(guān)系,異常狀態(tài)處理,硬件上消抖不消抖都是可以處理好的。
作者: cooleaf    時(shí)間: 2024-1-19 14:56
要想多快都不丟步(相對(duì)哈,快到中斷處理都來不及不算哈),必須在中斷里來處理。這種中斷+輪詢判斷的方式,依然會(huì)丟步的。
作者: shennognshi    時(shí)間: 2024-1-26 16:36
之前測試很多代碼,效果均不理想,表現(xiàn)為正轉(zhuǎn)、反轉(zhuǎn)有誤判,從而導(dǎo)致計(jì)數(shù)不對(duì)。我想到的辦法是得到方向數(shù)據(jù)后(比如正轉(zhuǎn)定義為1,反轉(zhuǎn)定義為0),先修正方向,再結(jié)合中斷和方向二者,決定是否累加或累減計(jì)數(shù)值。方案是建立一個(gè)數(shù)組,包括10個(gè)元素,用來存儲(chǔ)獲得的方向,任何時(shí)刻記錄的是最近十次獲得的方向數(shù)據(jù),對(duì)數(shù)組的10個(gè)元素進(jìn)行累加,和超過5時(shí),強(qiáng)制為正方向,反之為負(fù)方向。實(shí)測效果有所改善,計(jì)數(shù)值絕不會(huì)忽大忽小、重復(fù)出現(xiàn)等情況了。遺憾的是如果你反復(fù)正轉(zhuǎn)、反轉(zhuǎn)1下,那計(jì)數(shù)還是會(huì)有問題,即不會(huì)保持不變。但這種使用場景很少見吧?真要微調(diào),你多轉(zhuǎn)幾下,再反過來多轉(zhuǎn)幾下就行。有人會(huì)說,實(shí)際卡頓感與計(jì)數(shù)反映會(huì)不同步吧?理論上講是這樣,但單片機(jī)速度很快,實(shí)際感覺不到不同步。
作者: hewayking    時(shí)間: 2024-7-2 17:06
個(gè)人做法是a下降沿中斷     中斷后   判斷b高低   確定正反轉(zhuǎn)
作者: shennognshi    時(shí)間: 2024-9-20 15:54
hewayking 發(fā)表于 2024-7-2 17:06
個(gè)人做法是a下降沿中斷     中斷后   判斷b高低   確定正反轉(zhuǎn)

試了,很棒!史上最簡潔的代碼。
作者: zyhlove813    時(shí)間: 2024-9-27 08:22
http://www.torrancerestoration.com/bbs/dpj-233399-1.html
這個(gè)也是很簡潔,又新穎的EC11驅(qū)動(dòng)
作者: w645053932    時(shí)間: 2025-1-16 12:31
bhjyqjs 發(fā)表于 2022-2-7 10:49
樓主代碼及其精簡,不錯(cuò)!
實(shí)際上,只檢測A引腳的下降沿,由B引腳狀態(tài)決定加減更高效。
經(jīng)實(shí)驗(yàn),無漏脈沖 ...

高手啊!
作者: youlinys    時(shí)間: 2025-2-15 15:21
相當(dāng)簡潔的代碼。需要時(shí)間消化。
作者: KJSD    時(shí)間: 2025-6-4 18:49
有在PIC單片機(jī)上使用編碼開關(guān)的程序代碼,小白想借鑒下





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1