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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3567|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

單個(gè)旋轉(zhuǎn)編碼器旋轉(zhuǎn)時(shí)沒有問題,但是多個(gè)接到單片機(jī)上時(shí)旋轉(zhuǎn)會(huì)有錯(cuò)誤?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:985033 發(fā)表于 2022-6-7 11:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單個(gè)旋轉(zhuǎn)編碼器旋轉(zhuǎn)時(shí)沒有問題,但是多個(gè)接到單片機(jī)上時(shí)旋轉(zhuǎn)會(huì)有錯(cuò)誤,有時(shí)會(huì)自己旋轉(zhuǎn)改變,有大神知道是怎么回事嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:883242 發(fā)表于 2022-6-7 21:31 | 只看該作者
單片機(jī)跟不上旋轉(zhuǎn)編碼器運(yùn)動(dòng),丟脈沖了吧。絕對值編碼器不會(huì)出這種問題,AB相的一定是軟件寫的不好或者單片機(jī)太慢。
回復(fù)

使用道具 舉報(bào)

板凳
ID:390416 發(fā)表于 2022-6-7 22:27 | 只看該作者
代碼沒優(yōu)化好,
回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2022-6-8 00:08 | 只看該作者
代碼呢?接線圖呢?
你猜我猜不猜得到你的問題在哪?
回復(fù)

使用道具 舉報(bào)

5#
ID:985033 發(fā)表于 2022-6-8 09:16 | 只看該作者
void Encoder_EC11_Init(void)
{
/***避免上電時(shí)EC11旋鈕位置不確定導(dǎo)致一次動(dòng)作誤判***/               
                EC11_A1_Now=1;
                EC11_B1_Now=1;       
}

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

就是單個(gè)編碼器程序是這樣的,旋轉(zhuǎn)沒問題,然后多個(gè)也是類似這樣寫,旋轉(zhuǎn)后就會(huì)發(fā)生誤判正轉(zhuǎn)反轉(zhuǎn),有時(shí)也會(huì)自己串口顯示
回復(fù)

使用道具 舉報(bào)

6#
ID:1033120 發(fā)表于 2022-6-8 09:56 | 只看該作者
   這種情況一般是由于安裝時(shí)固定螺母或鎖緊電位器的鎖緊螺母過分?jǐn)Q緊,這里給到的建議是在螺母鎖緊后,轉(zhuǎn)軸要比螺母表面高出大約lmm以上。
回復(fù)

使用道具 舉報(bào)

7#
ID:985033 發(fā)表于 2022-6-8 10:03 | 只看該作者

那應(yīng)該怎么優(yōu)化呢
回復(fù)

使用道具 舉報(bào)

8#
ID:985033 發(fā)表于 2022-6-8 10:06 | 只看該作者
Hephaestus 發(fā)表于 2022-6-7 21:31
單片機(jī)跟不上旋轉(zhuǎn)編碼器運(yùn)動(dòng),丟脈沖了吧。絕對值編碼器不會(huì)出這種問題,AB相的一定是軟件寫的不好或者單片 ...

那軟件部分應(yīng)該怎么優(yōu)化呢,單個(gè)是沒問題的,但是單個(gè)以上就會(huì)這樣了
回復(fù)

使用道具 舉報(bào)

9#
ID:161164 發(fā)表于 2022-6-8 10:29 | 只看該作者
xyz_city 發(fā)表于 2022-6-8 09:16
void Encoder_EC11_Init(void)
{
/***避免上電時(shí)EC11旋鈕位置不確定導(dǎo)致一次動(dòng)作誤判***/               

EC11_A_Last/EC11_B_Last 不會(huì)是共用的吧?

保險(xiǎn)一點(diǎn)把EC11_A_Last/EC11_B_Last改為靜態(tài)變量
  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為時(shí)鐘,B為數(shù)據(jù)。正轉(zhuǎn)時(shí)AB反相,反轉(zhuǎn)時(shí)AB同相
  5.         {
  6.                         if(EC11_A1_Now == 0)
  7.                         {
  8.                                 if(EC11_B1_Now == 1)      //只需要采集A的上升沿或下降沿的任意一個(gè)狀態(tài),若A下降沿時(shí)B為1,正轉(zhuǎn)
  9.                                         {
  10.                                                 printf("\r\n ECll_KEY1_CW \r\n");
  11.                                         }                                                                       
  12.                                         else                    //反轉(zhuǎn)
  13.                                         {
  14.                                                 printf("\r\n ECll_KEY1_CCW \r\n");
  15.                                         }
  16.                         }
  17.                        
  18.                         EC11_A_Last = EC11_A1_Now;   //更新編碼器上一個(gè)狀態(tài)暫存變量
  19.                         EC11_B_Last = EC11_B1_Now;   //更新編碼器上一個(gè)狀態(tài)暫存變量
  20.         }
  21. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

10#
ID:329625 發(fā)表于 2022-6-8 10:29 | 只看該作者
建議調(diào)整一下代碼的邏輯與優(yōu)先級(jí)問題
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2022-6-8 10:55 | 只看該作者
xyz_city 發(fā)表于 2022-6-8 09:16
void Encoder_EC11_Init(void)
{
/***避免上電時(shí)EC11旋鈕位置不確定導(dǎo)致一次動(dòng)作誤判***/               

這段代碼用于STC15W系列單片機(jī),在快慢手速操作下未見誤碼。你擴(kuò)展成多個(gè)編碼器試試。
  1. void EC11(void)
  2. {
  3.         static unsigned char traitA=0,traitB=0;
  4.         //開關(guān)部分代碼略
  5.         //......
  6.         //順時(shí)針旋轉(zhuǎn),每圈進(jìn)階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.         //逆時(shí)針旋轉(zhuǎn)
  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. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

12#
ID:887371 發(fā)表于 2022-6-11 15:30 | 只看該作者
怎么沒有一個(gè)采用外中斷或端口變化中斷做的。
這種方法占用mcu時(shí)間極少,適用面廣(0~MHz級(jí)),極其可靠。
回復(fù)

使用道具 舉報(bào)

13#
ID:161164 發(fā)表于 2022-6-11 15:56 來自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-6-11 15:30
怎么沒有一個(gè)采用外中斷或端口變化中斷做的。
這種方法占用mcu時(shí)間極少,適用面廣(0~MHz級(jí)),極其可靠。

愿聞其詳
回復(fù)

使用道具 舉報(bào)

14#
ID:451718 發(fā)表于 2022-6-11 16:44 | 只看該作者
datouyuan 發(fā)表于 2022-6-11 15:30
怎么沒有一個(gè)采用外中斷或端口變化中斷做的。
這種方法占用mcu時(shí)間極少,適用面廣(0~MHz級(jí)),極其可靠。

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

使用道具 舉報(bào)

15#
ID:1018334 發(fā)表于 2022-6-11 19:21 | 只看該作者

代碼沒優(yōu)化好
回復(fù)

使用道具 舉報(bào)

16#
ID:887371 發(fā)表于 2022-6-13 10:13 | 只看該作者

ec11和電機(jī)編碼器時(shí)序是一樣的。
假設(shè)電機(jī)旋轉(zhuǎn)1圈有100個(gè)編碼器脈沖,電機(jī)最大轉(zhuǎn)速3000rpm,每秒編碼器脈沖可達(dá)6000Hz。用定時(shí)掃描中斷太頻繁了。

  1. //只開啟一個(gè)引腳變化中斷
  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--;//反轉(zhuǎn)
  19.         INTFLG=0;//清除變化中斷
  20. }
  21. /*
  22. 定時(shí)分析gPosition變化,可得到EC11的狀態(tài)
  23. */
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

17#
ID:887371 發(fā)表于 2022-6-13 10:17 | 只看該作者
robinsonlin 發(fā)表于 2022-6-11 16:44
EC11的判斷,最好還是丟到 1ms 的定時(shí)器中斷中去比較穩(wěn)妥, 哪怕中斷級(jí)別低點(diǎn)都不是問題。 但是,如果放 ...

不擔(dān)心。
我的代碼,中斷中不允許有長耗時(shí)操作。
回復(fù)

使用道具 舉報(bào)

18#
ID:514317 發(fā)表于 2022-6-15 09:42 | 只看該作者
datouyuan 發(fā)表于 2022-6-13 10:13
ec11和電機(jī)編碼器時(shí)序是一樣的。
假設(shè)電機(jī)旋轉(zhuǎn)1圈有100個(gè)編碼器脈沖,電機(jī)最大轉(zhuǎn)速3000rpm,每秒編碼器 ...

那是你沒試過中斷法,你試過就知道了干擾有多嚴(yán)重了,另外EC11和電機(jī)編碼器不一樣的地方是EC11更多干擾。
最好的方法是加電容硬件防抖加定時(shí)查詢狀態(tài)機(jī)
回復(fù)

使用道具 舉報(bào)

19#
ID:887371 發(fā)表于 2022-6-15 13:55 | 只看該作者
lzzasd 發(fā)表于 2022-6-15 09:42
那是你沒試過中斷法,你試過就知道了干擾有多嚴(yán)重了,另外EC11和電機(jī)編碼器不一樣的地方是EC11更多干擾。 ...

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

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久精 | 日本色综合 | 久草视频免费看 | 日韩视频在线免费观看 | 日韩黄色在线视频 | 国产美女福利 | 欧美精品一区二 | 99超碰在线观看 | 国产农村妇女aaaaa视频 | 五月天婷婷在线观看 | 日韩亚洲在线 | 欧美亚洲国产精品 | 日本韩国三级 | 国产激情 | 婷婷激情六月 | 91久久精品日日躁夜夜躁欧美 | 波多野结衣在线观看一区二区 | 黄av在线| 国产在线中文字幕 | 久久久一| 九九视频免费观看 | 国产香蕉视频在线观看 | 中文字幕在线免费视频 | 超碰在线看 | 白浆在线 | 天天爽夜夜操 | 日韩精品大片 | 免费毛片在线 | 69精品视频| 日本黄网站 | 久久免费视频网站 | 91蝌蚪少妇偷拍 | 91理论片午午伦夜理片久久 | 依人久久 | 夜夜草视频 | 国产精品国产三级国产专区53 | 激情综合五月天 | 黄www| 三级在线看 | 国产午夜精品视频 | 欧美a级成人淫片免费看 |