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

標(biāo)題: 單個(gè)旋轉(zhuǎn)編碼器旋轉(zhuǎn)時(shí)沒(méi)有問(wèn)題,但是多個(gè)接到單片機(jī)上時(shí)旋轉(zhuǎn)會(huì)有錯(cuò)誤? [打印本頁(yè)]

作者: xyz_city    時(shí)間: 2022-6-7 11:01
標(biāo)題: 單個(gè)旋轉(zhuǎn)編碼器旋轉(zhuǎn)時(shí)沒(méi)有問(wèn)題,但是多個(gè)接到單片機(jī)上時(shí)旋轉(zhuǎn)會(huì)有錯(cuò)誤?
單個(gè)旋轉(zhuǎn)編碼器旋轉(zhuǎn)時(shí)沒(méi)有問(wèn)題,但是多個(gè)接到單片機(jī)上時(shí)旋轉(zhuǎn)會(huì)有錯(cuò)誤,有時(shí)會(huì)自己旋轉(zhuǎn)改變,有大神知道是怎么回事嗎?

作者: Hephaestus    時(shí)間: 2022-6-7 21:31
單片機(jī)跟不上旋轉(zhuǎn)編碼器運(yùn)動(dòng),丟脈沖了吧。絕對(duì)值編碼器不會(huì)出這種問(wèn)題,AB相的一定是軟件寫的不好或者單片機(jī)太慢。
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2022-6-7 22:27
代碼沒(méi)優(yōu)化好,
作者: lkc8210    時(shí)間: 2022-6-8 00:08
代碼呢?接線圖呢?
你猜我猜不猜得到你的問(wèn)題在哪?
作者: xyz_city    時(shí)間: 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ù):無(wú)
返回值:無(wú)
***********************************************************************/
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)沒(méi)問(wèn)題,然后多個(gè)也是類似這樣寫,旋轉(zhuǎn)后就會(huì)發(fā)生誤判正轉(zhuǎn)反轉(zhuǎn),有時(shí)也會(huì)自己串口顯示
作者: 55tt    時(shí)間: 2022-6-8 09:56
   這種情況一般是由于安裝時(shí)固定螺母或鎖緊電位器的鎖緊螺母過(guò)分?jǐn)Q緊,這里給到的建議是在螺母鎖緊后,轉(zhuǎn)軸要比螺母表面高出大約lmm以上。
作者: xyz_city    時(shí)間: 2022-6-8 10:03
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2022-6-7 22:27
代碼沒(méi)優(yōu)化好,

那應(yīng)該怎么優(yōu)化呢
作者: xyz_city    時(shí)間: 2022-6-8 10:06
Hephaestus 發(fā)表于 2022-6-7 21:31
單片機(jī)跟不上旋轉(zhuǎn)編碼器運(yùn)動(dòng),丟脈沖了吧。絕對(duì)值編碼器不會(huì)出這種問(wèn)題,AB相的一定是軟件寫的不好或者單片 ...

那軟件部分應(yīng)該怎么優(yōu)化呢,單個(gè)是沒(méi)問(wèn)題的,但是單個(gè)以上就會(huì)這樣了
作者: lkc8210    時(shí)間: 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ù)制代碼



作者: 17337161031    時(shí)間: 2022-6-8 10:29
建議調(diào)整一下代碼的邏輯與優(yōu)先級(jí)問(wèn)題
作者: wulin    時(shí)間: 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ī),在快慢手速操作下未見(jiàn)誤碼。你擴(kuò)展成多個(gè)編碼器試試。
  1. void EC11(void)
  2. {
  3.         static unsigned char traitA=0,traitB=0;
  4.         //開(kāi)關(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ù)制代碼


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

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

EC11的判斷,最好還是丟到 1ms 的定時(shí)器中斷中去比較穩(wěn)妥, 哪怕中斷級(jí)別低點(diǎn)都不是問(wèn)題。 但是,如果放到外中斷 里面去執(zhí)行,還真沒(méi)試過(guò)。  你不擔(dān)心按鍵壞了,程序一直停在中斷出不來(lái)么?   
作者: wlstjzy    時(shí)間: 2022-6-11 19:21

代碼沒(méi)優(yōu)化好
作者: datouyuan    時(shí)間: 2022-6-13 10:13
lkc8210 發(fā)表于 2022-6-11 15:56
愿聞其詳

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

  1. //只開(kāi)啟一個(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ù)制代碼

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

不擔(dān)心。
我的代碼,中斷中不允許有長(zhǎng)耗時(shí)操作。
作者: lzzasd    時(shí)間: 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,每秒編碼器 ...

那是你沒(méi)試過(guò)中斷法,你試過(guò)就知道了干擾有多嚴(yán)重了,另外EC11和電機(jī)編碼器不一樣的地方是EC11更多干擾。
最好的方法是加電容硬件防抖加定時(shí)查詢狀態(tài)機(jī)
作者: datouyuan    時(shí)間: 2022-6-15 13:55
lzzasd 發(fā)表于 2022-6-15 09:42
那是你沒(méi)試過(guò)中斷法,你試過(guò)就知道了干擾有多嚴(yán)重了,另外EC11和電機(jī)編碼器不一樣的地方是EC11更多干擾。 ...

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲精品久 | 成人小视频在线 | 狠狠干影院 | 中文字幕av高清 | 91精品久久久久久久久久入口 | 亚洲精品成人网 | 午夜小电影| 国产成人精品久久二区二区91 | 国产视频1 | 99精品视频免费观看 | 亚州视频在线 | 国产午夜精品久久久久免费视高清 | 欧美视频在线观看 | av免费在线播放 | 亚洲导航深夜福利涩涩屋 | 国产三区av| 久久久久久成人 | 国产高清在线观看 | 国产亚洲精品精品国产亚洲综合 | 成人在线一区二区三区 | 欧美国产激情二区三区 | 日韩高清www | 亚洲精品一区二区二区 | 91精品国产91久久久久久吃药 | 日韩视频在线观看一区二区 | 亚洲不卡av在线 | 欧美日韩精品久久久免费观看 | 中文字幕免费在线观看 | 亚洲视频在线观看免费 | 亚洲免费三区 | 成人高清视频在线观看 | 成人精品国产免费网站 | 成人免费一区二区三区牛牛 | 久久久精品国产 | 久久一级免费视频 | 久久最新精品视频 | 中文字幕一区在线观看视频 | 最新黄色在线观看 | 亚洲精品在线看 | 亚洲日本中文字幕在线 | av网站免费看|