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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3378|回復: 18
收起左側

單個旋轉編碼器旋轉時沒有問題,但是多個接到單片機上時旋轉會有錯誤?

  [復制鏈接]
ID:985033 發表于 2022-6-7 11:01 | 顯示全部樓層 |閱讀模式
單個旋轉編碼器旋轉時沒有問題,但是多個接到單片機上時旋轉會有錯誤,有時會自己旋轉改變,有大神知道是怎么回事嗎?
回復

使用道具 舉報

ID:883242 發表于 2022-6-7 21:31 | 顯示全部樓層
單片機跟不上旋轉編碼器運動,丟脈沖了吧。絕對值編碼器不會出這種問題,AB相的一定是軟件寫的不好或者單片機太慢。
回復

使用道具 舉報

ID:390416 發表于 2022-6-7 22:27 | 顯示全部樓層
代碼沒優化好,
回復

使用道具 舉報

ID:161164 發表于 2022-6-8 00:08 | 顯示全部樓層
代碼呢?接線圖呢?
你猜我猜不猜得到你的問題在哪?
回復

使用道具 舉報

ID:985033 發表于 2022-6-8 09:16 | 顯示全部樓層
void Encoder_EC11_Init(void)
{
/***避免上電時EC11旋鈕位置不確定導致一次動作誤判***/               
                EC11_A1_Now=1;
                EC11_B1_Now=1;       
}

/***********************************************************************
功能描述:編碼器旋轉方向分析
入口參數:無
返回值:無
***********************************************************************/
void Encoder_EC11_Scan1(void)
{
        if(EC11_A1_Now != EC11_A_Last)   //以A為時鐘,B為數據。正轉時AB反相,反轉時AB同相
        {
                        if(EC11_A1_Now == 0)
                        {
                                if(EC11_B1_Now == 1)      //只需要采集A的上升沿或下降沿的任意一個狀態,若A下降沿時B為1,正轉
                                        {
                                                printf("\r\n ECll_KEY1_CW \r\n");
                                        }                                                                       
                                        else                    //反轉
                                        {
                                                printf("\r\n ECll_KEY1_CCW \r\n");
                                        }
                        }
                       
                        EC11_A_Last = EC11_A1_Now;   //更新編碼器上一個狀態暫存變量
                        EC11_B_Last = EC11_B1_Now;   //更新編碼器上一個狀態暫存變量
        }
}

就是單個編碼器程序是這樣的,旋轉沒問題,然后多個也是類似這樣寫,旋轉后就會發生誤判正轉反轉,有時也會自己串口顯示
回復

使用道具 舉報

ID:1033120 發表于 2022-6-8 09:56 | 顯示全部樓層
   這種情況一般是由于安裝時固定螺母或鎖緊電位器的鎖緊螺母過分擰緊,這里給到的建議是在螺母鎖緊后,轉軸要比螺母表面高出大約lmm以上。
回復

使用道具 舉報

ID:985033 發表于 2022-6-8 10:03 | 顯示全部樓層

那應該怎么優化呢
回復

使用道具 舉報

ID:985033 發表于 2022-6-8 10:06 | 顯示全部樓層
Hephaestus 發表于 2022-6-7 21:31
單片機跟不上旋轉編碼器運動,丟脈沖了吧。絕對值編碼器不會出這種問題,AB相的一定是軟件寫的不好或者單片 ...

那軟件部分應該怎么優化呢,單個是沒問題的,但是單個以上就會這樣了
回復

使用道具 舉報

ID:161164 發表于 2022-6-8 10:29 | 顯示全部樓層
xyz_city 發表于 2022-6-8 09:16
void Encoder_EC11_Init(void)
{
/***避免上電時EC11旋鈕位置不確定導致一次動作誤判***/               

EC11_A_Last/EC11_B_Last 不會是共用的吧?

保險一點把EC11_A_Last/EC11_B_Last改為靜態變量
  1. void Encoder_EC11_Scan1(void)
  2. {
  3.         static bit EC11_A_Last = EC11_A1_Now, EC11_B_Last = EC11_B1_Now;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  4.         if(EC11_A1_Now != EC11_A_Last)   //以A為時鐘,B為數據。正轉時AB反相,反轉時AB同相
  5.         {
  6.                         if(EC11_A1_Now == 0)
  7.                         {
  8.                                 if(EC11_B1_Now == 1)      //只需要采集A的上升沿或下降沿的任意一個狀態,若A下降沿時B為1,正轉
  9.                                         {
  10.                                                 printf("\r\n ECll_KEY1_CW \r\n");
  11.                                         }                                                                       
  12.                                         else                    //反轉
  13.                                         {
  14.                                                 printf("\r\n ECll_KEY1_CCW \r\n");
  15.                                         }
  16.                         }
  17.                        
  18.                         EC11_A_Last = EC11_A1_Now;   //更新編碼器上一個狀態暫存變量
  19.                         EC11_B_Last = EC11_B1_Now;   //更新編碼器上一個狀態暫存變量
  20.         }
  21. }
復制代碼


回復

使用道具 舉報

ID:329625 發表于 2022-6-8 10:29 | 顯示全部樓層
建議調整一下代碼的邏輯與優先級問題
回復

使用道具 舉報

ID:213173 發表于 2022-6-8 10:55 | 顯示全部樓層
xyz_city 發表于 2022-6-8 09:16
void Encoder_EC11_Init(void)
{
/***避免上電時EC11旋鈕位置不確定導致一次動作誤判***/               

這段代碼用于STC15W系列單片機,在快慢手速操作下未見誤碼。你擴展成多個編碼器試試。
  1. void EC11(void)
  2. {
  3.         static unsigned char traitA=0,traitB=0;
  4.         //開關部分代碼略
  5.         //......
  6.         //順時針旋轉,每圈進階20
  7.         if(EC11_B && !EC11_A && traitA==0)          //第一特征碼
  8.         {
  9.                 traitA=1;
  10.         }
  11.         else if(!EC11_B && !EC11_A && traitA==1)//第二特征碼
  12.         {
  13.                 traitA=2;
  14.         }
  15.         else if(!EC11_B && EC11_A && traitA==2)//第三特征碼
  16.         {
  17.                 if(count>0)count--;
  18.                 traitA=3;
  19.         }
  20.         else if(EC11_B && EC11_A && traitA==3)//第四特征碼
  21.         {
  22.                 traitA=0;//清0
  23.         }
  24.         //逆時針旋轉
  25.         if(!EC11_B && EC11_A && traitB==0)          //第一特征碼
  26.         {
  27.                 traitB=1;
  28.         }
  29.         else if(!EC11_B && !EC11_A && traitB==1)//第二特征碼
  30.         {
  31.                 traitB=2;
  32.         }
  33.         else if(EC11_B && !EC11_A && traitB==2)//第三特征碼
  34.         {
  35.                 if(count<250)count++;
  36.                 traitB=3;
  37.         }
  38.         else if(EC11_B && EC11_A && traitB==3)//第四特征碼
  39.         {
  40.                 traitB=0;//清0
  41.         }
  42. }
復制代碼

回復

使用道具 舉報

ID:887371 發表于 2022-6-11 15:30 | 顯示全部樓層
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。
回復

使用道具 舉報

ID:161164 發表于 2022-6-11 15:56 來自手機 | 顯示全部樓層
datouyuan 發表于 2022-6-11 15:30
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。

愿聞其詳
回復

使用道具 舉報

ID:451718 發表于 2022-6-11 16:44 | 顯示全部樓層
datouyuan 發表于 2022-6-11 15:30
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。

EC11的判斷,最好還是丟到 1ms 的定時器中斷中去比較穩妥, 哪怕中斷級別低點都不是問題。 但是,如果放到外中斷 里面去執行,還真沒試過。  你不擔心按鍵壞了,程序一直停在中斷出不來么?   
回復

使用道具 舉報

ID:1018334 發表于 2022-6-11 19:21 | 顯示全部樓層

代碼沒優化好
回復

使用道具 舉報

ID:887371 發表于 2022-6-13 10:13 | 顯示全部樓層

ec11和電機編碼器時序是一樣的。
假設電機旋轉1圈有100個編碼器脈沖,電機最大轉速3000rpm,每秒編碼器脈沖可達6000Hz。用定時掃描中斷太頻繁了。

  1. //只開啟一個引腳變化中斷
  2. void p1_change_int(void) interrupt 8
  3. {//
  4.         bit bZZ=0;
  5.         if(PIN_A)
  6.         {
  7.                 if(!PIN_B)
  8.                         bZZ=1;
  9.         }
  10.         else
  11.         {
  12.                 if(PIN_B)
  13.                         bZZ=1;
  14.         }
  15.         if(bZZ)
  16.                 gPosition++;//正傳
  17.         else
  18.                 gPosition--;//反轉
  19.         INTFLG=0;//清除變化中斷
  20. }
  21. /*
  22. 定時分析gPosition變化,可得到EC11的狀態
  23. */
復制代碼
回復

使用道具 舉報

ID:887371 發表于 2022-6-13 10:17 | 顯示全部樓層
robinsonlin 發表于 2022-6-11 16:44
EC11的判斷,最好還是丟到 1ms 的定時器中斷中去比較穩妥, 哪怕中斷級別低點都不是問題。 但是,如果放 ...

不擔心。
我的代碼,中斷中不允許有長耗時操作。
回復

使用道具 舉報

ID:514317 發表于 2022-6-15 09:42 | 顯示全部樓層
datouyuan 發表于 2022-6-13 10:13
ec11和電機編碼器時序是一樣的。
假設電機旋轉1圈有100個編碼器脈沖,電機最大轉速3000rpm,每秒編碼器 ...

那是你沒試過中斷法,你試過就知道了干擾有多嚴重了,另外EC11和電機編碼器不一樣的地方是EC11更多干擾。
最好的方法是加電容硬件防抖加定時查詢狀態機
回復

使用道具 舉報

ID:887371 發表于 2022-6-15 13:55 | 顯示全部樓層
lzzasd 發表于 2022-6-15 09:42
那是你沒試過中斷法,你試過就知道了干擾有多嚴重了,另外EC11和電機編碼器不一樣的地方是EC11更多干擾。 ...

我的代碼就是中斷法,并且是實際使用過的。
該算法天然具備消抖功能。
加電容硬件防抖僅僅是為了減少進入中斷的次數,節約mcu開銷。主頻極低的mcu也能勝任。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产精品久久久 | 欧美精品一二区 | 欧美日韩精品国产 | 99成人| 男人天堂手机在线视频 | 久久久精品视频免费 | 久久精品高清视频 | 狠狠操你 | 国产精品综合网 | 欧美成人精品在线 | 水蜜桃亚洲一二三四在线 | 国产精品免费在线 | 久草视频在线播放 | 亚洲三区在线观看 | 午夜视频一区二区三区 | 久久久久久久一区二区三区 | 国产高清免费 | 日韩一区二区三区在线 | 亚洲国产欧美在线 | 成人免费视频网站在线观看 | 午夜精品一区 | 欧美精品综合在线 | 四虎影视免费在线 | 国产欧美性成人精品午夜 | 三级欧美 | 91精品国产91久久综合桃花 | 欧美日韩国产在线观看 | 亚洲精品乱码久久久久久黑人 | 国产精品久久免费观看 | 精品视频在线观看 | 九九热免费在线观看 | 亚洲区中文字幕 | 少妇久久久久 | 一区二区三区免费网站 | 一区二区成人 | 国产高清视频在线观看 | 久久久久国产一区二区三区四区 | 看片91| 欧美一级免费 | 国产精品一区二区日韩 | 四虎影视免费在线 |