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

標題: 單個旋轉編碼器旋轉時沒有問題,但是多個接到單片機上時旋轉會有錯誤? [打印本頁]

作者: xyz_city    時間: 2022-6-7 11:01
標題: 單個旋轉編碼器旋轉時沒有問題,但是多個接到單片機上時旋轉會有錯誤?
單個旋轉編碼器旋轉時沒有問題,但是多個接到單片機上時旋轉會有錯誤,有時會自己旋轉改變,有大神知道是怎么回事嗎?

作者: Hephaestus    時間: 2022-6-7 21:31
單片機跟不上旋轉編碼器運動,丟脈沖了吧。絕對值編碼器不會出這種問題,AB相的一定是軟件寫的不好或者單片機太慢。
作者: 人人學會單片機    時間: 2022-6-7 22:27
代碼沒優化好,
作者: lkc8210    時間: 2022-6-8 00:08
代碼呢?接線圖呢?
你猜我猜不猜得到你的問題在哪?
作者: xyz_city    時間: 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;   //更新編碼器上一個狀態暫存變量
        }
}

就是單個編碼器程序是這樣的,旋轉沒問題,然后多個也是類似這樣寫,旋轉后就會發生誤判正轉反轉,有時也會自己串口顯示
作者: 55tt    時間: 2022-6-8 09:56
   這種情況一般是由于安裝時固定螺母或鎖緊電位器的鎖緊螺母過分擰緊,這里給到的建議是在螺母鎖緊后,轉軸要比螺母表面高出大約lmm以上。
作者: xyz_city    時間: 2022-6-8 10:03
人人學會單片機 發表于 2022-6-7 22:27
代碼沒優化好,

那應該怎么優化呢
作者: xyz_city    時間: 2022-6-8 10:06
Hephaestus 發表于 2022-6-7 21:31
單片機跟不上旋轉編碼器運動,丟脈沖了吧。絕對值編碼器不會出這種問題,AB相的一定是軟件寫的不好或者單片 ...

那軟件部分應該怎么優化呢,單個是沒問題的,但是單個以上就會這樣了
作者: lkc8210    時間: 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. }
復制代碼



作者: 17337161031    時間: 2022-6-8 10:29
建議調整一下代碼的邏輯與優先級問題
作者: wulin    時間: 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. }
復制代碼


作者: datouyuan    時間: 2022-6-11 15:30
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。
作者: lkc8210    時間: 2022-6-11 15:56
datouyuan 發表于 2022-6-11 15:30
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。

愿聞其詳
作者: robinsonlin    時間: 2022-6-11 16:44
datouyuan 發表于 2022-6-11 15:30
怎么沒有一個采用外中斷或端口變化中斷做的。
這種方法占用mcu時間極少,適用面廣(0~MHz級),極其可靠。

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

代碼沒優化好
作者: datouyuan    時間: 2022-6-13 10:13
lkc8210 發表于 2022-6-11 15:56
愿聞其詳

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. */
復制代碼

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

不擔心。
我的代碼,中斷中不允許有長耗時操作。
作者: lzzasd    時間: 2022-6-15 09:42
datouyuan 發表于 2022-6-13 10:13
ec11和電機編碼器時序是一樣的。
假設電機旋轉1圈有100個編碼器脈沖,電機最大轉速3000rpm,每秒編碼器 ...

那是你沒試過中斷法,你試過就知道了干擾有多嚴重了,另外EC11和電機編碼器不一樣的地方是EC11更多干擾。
最好的方法是加電容硬件防抖加定時查詢狀態機
作者: datouyuan    時間: 2022-6-15 13:55
lzzasd 發表于 2022-6-15 09:42
那是你沒試過中斷法,你試過就知道了干擾有多嚴重了,另外EC11和電機編碼器不一樣的地方是EC11更多干擾。 ...

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 羞羞网站在线观看 | 9l蝌蚪porny中文自拍 | 久草福利在线观看 | 成人精品一区二区三区 | 亚洲激情欧美激情 | 免费视频国产 | 91新视频 | 国产视频一二三 | 亚洲精品蜜桃 | 黄色片久久 | 五月天色综合 | 婷婷伊人网 | 亚洲欧美日韩色图 | 午夜精品国产 | 午夜美女福利 | 狠狠干夜夜操 | 国产综合在线视频 | 懂色av一区二区夜夜嗨 | 毛片毛片毛片 | 免费一级大片 | 欧美精品一二三 | 免费三片在线播放 | 在线观看国产小视频 | 亚洲久久久 | 亚洲精品一区二三区 | 毛片网站在线观看 | 午夜国产一区 | 色人人| 日本婷婷| 日本不卡在线 | 亚洲欧美日韩成人 | 久久久久性 | 欧美视频久久 | 成人免费看片39 | 国产精品久久久国产盗摄 | 国产理论在线观看 | 精品一区二区三区四区五区 | 成人在线免费看 | 国产黄色免费网站 | 综合导航| 亚洲高清视频在线 |