久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21795|回復: 57
打印 上一主題 下一主題
收起左側

一定位一脈沖的EC11旋轉編碼器最簡潔的單片機驅動代碼

  [復制鏈接]
跳轉到指定樓層
樓主
先上代碼為敬
  1.             if(!PinA && PinA_O && PinB) {
  2.                 Now++;
  3.             }PinA_O = PinA;               
  4.             if(!PinB && PinB_O && PinA) {
  5.                 Now--;
  6.             }PinB_O = PinB;        
復制代碼
只有六行代碼就能用EC11對Now進行加減操作

為什么這樣寫呢?
上時序圖
順時針轉:


逆時針轉:


我們看到,當順時針轉時
Pin A會早于Pin B 轉低電平,反之亦然

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

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



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

  1.         if(ScanCount++ > 50) {        //其數值按單片機速度加減
  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.         }
復制代碼
現附上小應用實例一則
基如STC15F104E的EC11軟串口六位密碼檢查程序
如發現順逆時針相反,對調PinA/PinB 定義腳即可


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

評分

參與人數 4黑幣 +135 收起 理由
1499359105 + 10 絕世好帖!
dww465757120 + 30 很給力!
MOVEORDIE + 5 贊一個!
admin + 90 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏59 分享淘帖 頂7 踩
回復

使用道具 舉報

沙發
ID:569384 發表于 2021-7-3 09:46 | 只看該作者
假如順時針扭了一點但沒到位之前逆時針扭回去了呢?
回復

使用道具 舉報

板凳
ID:161164 發表于 2021-7-3 12:37 來自手機 | 只看該作者
不考慮任何不正常操作
回復

使用道具 舉報

地板
ID:46750 發表于 2021-7-3 14:49 | 只看該作者
代碼簡潔易懂
回復

使用道具 舉報

5#
ID:47286 發表于 2021-7-3 17:04 | 只看該作者
haokey 發表于 2021-7-3 09:46
假如順時針扭了一點但沒到位之前逆時針扭回去了呢?

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

感覺這代碼寫的不錯
回復

使用道具 舉報

6#
ID:161164 發表于 2021-7-3 23:41 | 只看該作者
dzbj 發表于 2021-7-3 17:04
我覺得"ScanCount++"解決了你說的問題 就是說這之后得到的是一個確定值 要么轉了要么沒轉 即便按你說的哆 ...

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

先上時序圖



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

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


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



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



單片機會在黃色虛線那里判斷
結果在3,4,6判為成立

如果加上"ScanCount++"


就只會在2那里成立,避開了抖動

當然"ScanCount++ >"的數值要進行調節
如果數值太大如圖



在2看到的就是B之前高電平+B現在低電平(B下降沿發生)+A高電平 = 逆時針轉了!
                       
       
                                                        
回復

使用道具 舉報

7#
ID:569384 發表于 2021-7-7 11:25 | 只看該作者
lkc8210 發表于 2021-7-3 23:41
然而,并不能
之前的回覆草率了

能不能幫忙分析一下有沒有其他不正常的情況?
回復

使用道具 舉報

8#
ID:569384 發表于 2021-7-7 12:20 | 只看該作者
lkc8210 發表于 2021-7-3 23:41
然而,并不能
之前的回覆草率了

探討一下,假如我改成這樣會怎樣:
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--;
        }
}                                               
回復

使用道具 舉報

9#
ID:161164 發表于 2021-7-7 17:20 | 只看該作者
haokey 發表于 2021-7-7 12:20
探討一下,假如我改成這樣會怎樣:
if(!PinA&&PinB)
{PinA_O= 1;}

這樣改是為了什么?
回復

使用道具 舉報

10#
ID:308267 發表于 2021-8-25 19:52 | 只看該作者
小白請教:請問,IF最后面大括號外面的PinA_O = PinA是什么意思?
if(PinA && !PinA_O && PinB) {
                Now++;
            }PinA_O = PinA;

回復

使用道具 舉報

11#
ID:308267 發表于 2021-8-25 19:57 | 只看該作者
PinA_O是怎么定義為下降沿的。空嫘恼埥
回復

使用道具 舉報

12#
ID:989992 發表于 2022-1-27 11:10 | 只看該作者
代碼簡潔
回復

使用道具 舉報

13#
ID:67925 發表于 2022-1-28 06:16 來自手機 | 只看該作者
按中鍵時如果有移位,可能會誤觸發一次加減
回復

使用道具 舉報

14#
ID:161164 發表于 2022-1-28 13:54 | 只看該作者
yxlitol 發表于 2021-8-25 19:52
小白請教:請問,IF最后面大括號外面的PinA_O = PinA是什么意思?
if(PinA && !PinA_O && PinB) {
       ...

記錄A腳電平
回復

使用道具 舉報

15#
ID:161164 發表于 2022-1-28 14:00 | 只看該作者
yxlitol 發表于 2021-8-25 19:57
PinA_O是怎么定義為下降沿的啊?真心請教

不是單單用PinA_O去看
要結合PinA
if(!PinA && PinA_O && PinB)的文字表達就是:
當"A腳現在是低電平" 與 "A腳前一次是高電平" 與 "B腳現在是高電平" 時成立

!PinA && PinA_O 這倆合起來才能判斷是否下降沿
回復

使用道具 舉報

16#
ID:161164 發表于 2022-1-28 14:03 | 只看該作者
cdhigh 發表于 2022-1-28 06:16
按中鍵時如果有移位,可能會誤觸發一次加減

如果編碼器太松就有可能
回復

使用道具 舉報

17#
ID:69115 發表于 2022-2-3 22:59 | 只看該作者
這個代碼寫的不錯 簡明有效 很實用
回復

使用道具 舉報

18#
ID:1004108 發表于 2022-2-5 01:12 | 只看該作者
代碼簡潔易懂
回復

使用道具 舉報

19#
ID:66287 發表于 2022-2-7 10:49 | 只看該作者
樓主代碼及其精簡,不錯!
實際上,只檢測A引腳的下降沿,由B引腳狀態決定加減更高效。
經實驗,無漏脈沖和多加多減現象。
void key()   //按鍵處理
{
      if((PinA_O== PinA)||(PinA ==1))  //不理會A引腳上升沿,低電平每個脈沖只做一次處理
         {
                 PinA_O= PinA;
                  return;
         }                                                         
       (PinB == 0) ? NUM-- : NUM++;   //根據引腳B的值,判斷正反轉
        PinA_O = PinA;                         //存儲引腳A狀態
}
采樣A引腳下降沿時B引腳狀態,同相減、異相加。
回復

使用道具 舉報

20#
ID:514317 發表于 2022-2-7 16:45 | 只看該作者
你這種處理方法我都試過了   用在EC11旋轉編碼器上勉強夠用  也存在其他處理占用時間而掉脈沖的情況   但如果脈沖要達到1K的速度   就掉脈沖嚴重
EC11還是可以用下的   
回復

使用道具 舉報

21#
ID:161164 發表于 2022-2-7 17:20 | 只看該作者
bhjyqjs 發表于 2022-2-7 10:49
樓主代碼及其精簡,不錯!
實際上,只檢測A引腳的下降沿,由B引腳狀態決定加減更高效。
經實驗,無漏脈沖 ...

妙啊~
回復

使用道具 舉報

22#
ID:67925 發表于 2022-2-8 01:32 來自手機 | 只看該作者
lkc8210 發表于 2022-1-28 14:03
如果編碼器太松就有可能

為什么我知道是因為我以前就是用類似的算法,后來全部換成更復雜的算法了。
看應用,如果誤加減影響不大則可以用,否則需要更魯棒性的算法
回復

使用道具 舉報

23#
ID:883031 發表于 2022-2-8 10:18 | 只看該作者
本帖最后由 cn_zhx 于 2022-2-8 14:43 編輯

其實,這里AB數據線產生的是格雷碼,如果我們采集時采用判斷AB兩線的變化,即,A或B來下降沿時,作出4次判斷,可以避免樓上所說的哆嗦,但是,要求采樣頻率要跟得上,可以采用加減速器的方法,
回復

使用道具 舉報

24#
ID:161164 發表于 2022-2-8 13:29 來自手機 | 只看該作者
cn_zhx 發表于 2022-2-8 10:18
其實,這里AB數據線產生的是格雷碼,如果我們采集時采用判斷AB兩線的變化,即,A或B來下降沿時,作出4次判 ...

什么是加減速器的方法?
可以詳細說說嗎?
回復

使用道具 舉報

25#
ID:883031 發表于 2022-2-8 14:40 | 只看該作者
齒輪傳動,小齒輪帶大齒輪,用大齒輪帶動編碼器旋轉,即可降低轉速
回復

使用道具 舉報

26#
ID:119977 發表于 2022-2-16 14:19 | 只看該作者
個人做法硬件加104電容  一個接外部中斷一個接普通IO    中斷后讀普通IO高低     正轉高或低   反轉低或高控制++ --      可靠高效無敵  一般人我不告訴他
回復

使用道具 舉報

27#
ID:509339 發表于 2022-2-17 14:27 | 只看該作者
hewayking 發表于 2022-2-16 14:19
個人做法硬件加104電容  一個接外部中斷一個接普通IO    中斷后讀普通IO高低     正轉高或低   反轉低或高 ...

難打別人不都是這樣嗎?
回復

使用道具 舉報

28#
ID:887371 發表于 2022-6-14 15:48 | 只看該作者
hewayking 發表于 2022-2-16 14:19
個人做法硬件加104電容  一個接外部中斷一個接普通IO    中斷后讀普通IO高低     正轉高或低   反轉低或高 ...

我也認為這種方法更好。
http://www.zg4o1577.cn/bbs/dpj-221520-1.html
這是用十速51mcu做的直流電機定位功能,非?煽繙蚀_,用于EC11要加104電容。
一定要用軟件消抖,要增加2個全局bit變量用于存儲AB引腳之前的狀態,但這樣增加了不少mcu開銷。
回復

使用道具 舉報

29#
ID:240452 發表于 2022-11-8 17:51 | 只看該作者
這個代碼我在STC15W408AS上調試通過。 為什么在STC8H1K08上不行,就是沒有操作EC11旋轉編碼器,電腦串口    不斷收到數據。                                                                                                                                                                                          
回復

使用道具 舉報

30#
ID:240452 發表于 2022-11-8 20:55 | 只看該作者
//00準雙向  01推挽輸出  10高阻輸入 11開漏輸出高阻輸入
P3M1 = B0000_0000;
P3M0 = B1010_0000;

增加這個后就可以了
回復

使用道具 舉報

31#
ID:240452 發表于 2022-11-8 20:55 | 只看該作者
stc8h默認是高阻
回復

使用道具 舉報

32#
ID:996773 發表于 2023-4-17 10:59 | 只看該作者
不用這么復雜,只要判斷兩個腳是11,然后延時毫秒多少。忘了,再判斷是不是10,就說明

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

等待的時候加一丟丟延時再執行就ok了
回復

使用道具 舉報

33#
ID:1085900 發表于 2023-6-26 22:21 | 只看該作者
hi等你 發表于 2023-4-17 10:59
不用這么復雜,只要判斷兩個腳是11,然后延時毫秒多少。忘了,再判斷是不是10,就說明

它旋轉了,如果判 ...

[em17
回復

使用道具 舉報

34#
ID:161164 發表于 2023-6-27 11:30 | 只看該作者
hi等你 發表于 2023-4-17 10:59
不用這么復雜,只要判斷兩個腳是11,然后延時毫秒多少。忘了,再判斷是不是10,就說明

它旋轉了,如果判 ...

看到"延時毫秒"和"中斷和定時器都不需要"
就知道你還沒弄懂
回復

使用道具 舉報

35#
ID:996773 發表于 2023-6-28 16:05 | 只看該作者
lkc8210 發表于 2023-6-27 11:30
看到"延時毫秒"和"中斷和定時器都不需要"
就知道你還沒弄懂



我就是不用定時器和中斷,這個資源用在更重要的地方,只需要判斷10和11就行,反轉判斷01和11.

已經成品用了好久了,手感也很好
回復

使用道具 舉報

36#
ID:1085441 發表于 2023-6-30 21:18 | 只看該作者
EC11不需要用延時,放在中斷程序中,占用資源很少,用的很穩定。
回復

使用道具 舉報

37#
ID:1085441 發表于 2023-6-30 21:21 | 只看該作者
微笑的小小 發表于 2022-11-8 17:51
這個代碼我在STC15W408AS上調試通過。 為什么在STC8H1K08上不行,就是沒有操作EC11旋轉編碼器,電腦串口     ...

STC15W的引腳默認是準雙向口,STC8H的引腳默認是高阻,初始化的時候需要設置為準雙向口。
回復

使用道具 舉報

38#
ID:1064915 發表于 2023-7-1 09:36 | 只看該作者
hi等你 發表于 2023-6-28 16:05
我就是不用定時器和中斷,這個資源用在更重要的地方,只需要判斷10和11就行,反轉判斷01和11.

已 ...

能否共享一下
回復

使用道具 舉報

39#
ID:398219 發表于 2023-9-22 15:41 | 只看該作者
謝謝樓主分享,我用的STC15W408AS。用樓主的例程,采用兩個外部中斷來檢測脈沖。能正常檢測到正轉和反轉。但是旋轉編碼器的旋轉速度稍微快點,就容易丟脈沖(脈沖速度快了,連成一片了),導致單片機采不到或者誤采到B相。求一下速度快點的解決辦法。count1和count2是正轉和反轉的脈沖計數,以后用于計算角度使用。
void exint0() interrupt 0       //INT0中斷入口
{       
        if(!P32 && PinA_O && P33)
        {
                count1++;
               
        }       
        PinA_O = P32;
}
//外部中斷服務程序1
void exint1() interrupt 2       //INT1中斷入口
{
        if(!P33 && PinB_O && P32)
        {
                count2++;
        }
        PinB_O = P33;
}
回復

使用道具 舉報

40#
ID:161164 發表于 2023-9-22 16:14 | 只看該作者
herui2128 發表于 2023-9-22 15:41
謝謝樓主分享,我用的STC15W408AS。用樓主的例程,采用兩個外部中斷來檢測脈沖。能正常檢測到正轉和反轉。 ...

用一個外中斷即可
  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)//按主循環周期調節
  27.                                 {
  28.                                         Delay_XD = 0;
  29.                                         Encoder_EN = 1;
  30.                                 }
  31.                         }else{
  32.                                 Delay_XD = 0;
  33.                         }
  34.                 }
  35.         }
  36. }
復制代碼



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费又色又爽又黄在线观看 | 337p日本欧洲亚洲大胆精蜜臀 | 欧美亚洲国语精品一区二区 | 亚洲美女一区 | 插插宗合网 | 91综合网| 日韩精品| 久草热在线 | 久久亚洲免费 | 国产一级视频在线观看 | 久久亚洲一区 | 精品国产乱码久久久久久闺蜜 | 99国内精品久久久久久久 | 日韩成人免费av | 欧美最猛黑人xxxx黑人 | 人人艹人人爽 | 亚洲国产成人精品女人久久久 | 日韩在线不卡 | 日日干夜夜操天天操 | av激情在线 | 久久一区二区三区四区 | 亚洲成人av | 精品欧美黑人一区二区三区 | 欧美精品一区三区 | 日韩精品一区在线 | 亚洲福利网 | 国产在线高清 | 欧美多人在线 | 999国产视频| 精品国产鲁一鲁一区二区张丽 | 精品久久久久一区二区国产 | 中文字幕日韩欧美 | 日韩电影免费在线观看中文字幕 | 亚洲国产精品一区二区第一页 | 在线永久看片免费的视频 | 动漫www.被爆羞羞av44 | 黄网站免费在线观看 | 日韩天堂av| 久久精品一 | 91色在线 | av在线三级|