熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)表于 2024-7-2 17:06 我就是這樣的,但是不知道為啥數(shù)據(jù)是錯誤的,我還加了104電容的硬件消抖 |
|
有在PIC單片機(jī)上使用編碼開關(guān)的程序代碼,小白想借鑒下 |
| 相當(dāng)簡潔的代碼。需要時間消化。 |
bhjyqjs 發(fā)表于 2022-2-7 10:49 高手啊! |
|
http://www.izizhuan.cn/bbs/dpj-233399-1.html 這個也是很簡潔,又新穎的EC11驅(qū)動 |
hewayking 發(fā)表于 2024-7-2 17:06 試了,很棒!史上最簡潔的代碼。 |
個人做法是a下降沿中斷 中斷后 判斷b高低 確定正反轉(zhuǎn)![]() |
| 之前測試很多代碼,效果均不理想,表現(xiàn)為正轉(zhuǎn)、反轉(zhuǎn)有誤判,從而導(dǎo)致計(jì)數(shù)不對。我想到的辦法是得到方向數(shù)據(jù)后(比如正轉(zhuǎn)定義為1,反轉(zhuǎn)定義為0),先修正方向,再結(jié)合中斷和方向二者,決定是否累加或累減計(jì)數(shù)值。方案是建立一個數(shù)組,包括10個元素,用來存儲獲得的方向,任何時刻記錄的是最近十次獲得的方向數(shù)據(jù),對數(shù)組的10個元素進(jìn)行累加,和超過5時,強(qiáng)制為正方向,反之為負(fù)方向。實(shí)測效果有所改善,計(jì)數(shù)值絕不會忽大忽小、重復(fù)出現(xiàn)等情況了。遺憾的是如果你反復(fù)正轉(zhuǎn)、反轉(zhuǎn)1下,那計(jì)數(shù)還是會有問題,即不會保持不變。但這種使用場景很少見吧?真要微調(diào),你多轉(zhuǎn)幾下,再反過來多轉(zhuǎn)幾下就行。有人會說,實(shí)際卡頓感與計(jì)數(shù)反映會不同步吧?理論上講是這樣,但單片機(jī)速度很快,實(shí)際感覺不到不同步。 |
| 要想多快都不丟步(相對哈,快到中斷處理都來不及不算哈),必須在中斷里來處理。這種中斷+輪詢判斷的方式,依然會丟步的。 |
| 這東西還是需要用狀態(tài)機(jī)來寫,只要描述好正常狀態(tài)遷移的關(guān)系,異常狀態(tài)處理,硬件上消抖不消抖都是可以處理好的。 |
| 完美的代碼效果應(yīng)該是轉(zhuǎn)動一下只計(jì)數(shù)一下,不能多增也不能不增,最重要的是!不論轉(zhuǎn)得多快還是多慢,都如此,那才是好代碼!從這個標(biāo)準(zhǔn)來說,我試驗(yàn)了上10款作者自詡為非常不錯的代碼,均不合格!當(dāng)然我自己也編不出合格的代碼來,一度懷疑是我買的EC11編碼器在硬件方面不合格,因?yàn)橹挥猩侠娮琛]有消抖電容。但符合這樣標(biāo)準(zhǔn)的編碼器效果是普遍存在的,比如十幾、二十年前的進(jìn)口功放機(jī),就采用了旋轉(zhuǎn)編碼器調(diào)整音量,那編碼器的使用效果才是我追求的,現(xiàn)在我的一個項(xiàng)目卡在編碼器上,怎么都不好用,肯定采用中斷來實(shí)現(xiàn),還沒找到合適的代碼,下一步寄加消抖電容看看誰的代碼最理想,再來匯報。 |
| 樓主的代碼很不錯,我這邊有另一種算法,也很精簡EC11編碼器基于運(yùn)算解碼的算法(原創(chuàng)),匯編后大小也基本一樣,有一個算法甚至更小 |
| 很好的優(yōu)化方法,學(xué)習(xí)了! |
diyage 發(fā)表于 2023-11-25 19:55 你說的這種情況,確實(shí)存在,也不能旋轉(zhuǎn)過快,且在部分EC11上表現(xiàn)明顯,即存在挑EC11現(xiàn)象,,后來我嘗試將KB對地接的104電容換成105的就改善了,也不挑EC11了,你可試試。 |
| 下載學(xué)習(xí)一下,正準(zhǔn)備用這個一定位一脈沖編碼器。 |
劉佑紅 發(fā)表于 2023-9-25 15:48 我跟你用的一樣,但是發(fā)現(xiàn)轉(zhuǎn)快了丟碼,慢很好 ![]() |
|
unsigned char key=0; static bit nextA; if (KA()!=nextA) {nextA=KA(); if (nextA==1) {if (KB()==1) key=6;else key=5;} else {if (KB()==0) key=6;else key=5;} } return key; |
haokey 發(fā)表于 2021-7-7 12:20 你這樣是不行的,會重復(fù)的加或減 |
|
以下是我之前采用拿來主義得到的,只對判斷后執(zhí)行部分稍作修改,應(yīng)用還不錯。 /************************參數(shù)設(shè)置***************************/ void canshu() //EC11旋轉(zhuǎn)編碼器一定位一脈沖 { static bit LastA = 0; //EC11旋轉(zhuǎn)編碼器的A引腳上一次的狀態(tài) static bit LastB = 0; //EC11旋轉(zhuǎn)編碼器的B引腳上一次的狀態(tài) if(KA != LastA) //判斷EC11旋轉(zhuǎn)編碼器A引腳是否等于上一次的狀態(tài) { if(KA == 0) //EC11旋轉(zhuǎn)編碼器旋轉(zhuǎn)后,判斷KA是否是低電平狀態(tài) { if(KB) //判斷KB引腳當(dāng)前狀態(tài),高電平則為正轉(zhuǎn) {num++;} else {num--;} } LastA = KA; //更新編碼器上一個狀態(tài)暫存變量 LastB = KB; //更新編碼器上一個狀態(tài)暫存變量 } } 現(xiàn)在看來LsaB變量似乎沒有用,有空了去掉它試試。對于正反向不同的EC11,我是通過調(diào)換num變量的加減方向來解決的。 |
| 我用一個外中斷,使用正常。 |
一般方法:先判斷跳變(同時觸發(fā)抖動計(jì)時連續(xù)判斷),再判斷另一個io的高低,![]() |
herui2128 發(fā)表于 2023-9-22 15:41 用一個外中斷即可
|
|
謝謝樓主分享,我用的STC15W408AS。用樓主的例程,采用兩個外部中斷來檢測脈沖。能正常檢測到正轉(zhuǎn)和反轉(zhuǎn)。但是旋轉(zhuǎn)編碼器的旋轉(zhuǎn)速度稍微快點(diǎn),就容易丟脈沖(脈沖速度快了,連成一片了),導(dǎo)致單片機(jī)采不到或者誤采到B相。求一下速度快點(diǎn)的解決辦法。count1和count2是正轉(zhuǎn)和反轉(zhuǎn)的脈沖計(jì)數(shù),以后用于計(jì)算角度使用。 void exint0() interrupt 0 //INT0中斷入口 { if(!P32 && PinA_O && P33) { count1++; } PinA_O = P32; } //外部中斷服務(wù)程序1 void exint1() interrupt 2 //INT1中斷入口 { if(!P33 && PinB_O && P32) { count2++; } PinB_O = P33; } |
hi等你 發(fā)表于 2023-6-28 16:05 能否共享一下 |
微笑的小小 發(fā)表于 2022-11-8 17:51 STC15W的引腳默認(rèn)是準(zhǔn)雙向口,STC8H的引腳默認(rèn)是高阻,初始化的時候需要設(shè)置為準(zhǔn)雙向口。 |
| EC11不需要用延時,放在中斷程序中,占用資源很少,用的很穩(wěn)定。 |
lkc8210 發(fā)表于 2023-6-27 11:30
我就是不用定時器和中斷,這個資源用在更重要的地方,只需要判斷10和11就行,反轉(zhuǎn)判斷01和11. 已經(jīng)成品用了好久了,手感也很好 |
hi等你 發(fā)表于 2023-4-17 10:59 看到"延時毫秒"和"中斷和定時器都不需要" 就知道你還沒弄懂 |
hi等你 發(fā)表于 2023-4-17 10:59 [em17 ![]() ![]() |
|
不用這么復(fù)雜,只要判斷兩個腳是11,然后延時毫秒多少。忘了,再判斷是不是10,就說明 它旋轉(zhuǎn)了,如果判斷出來是01就是反方向旋轉(zhuǎn)了,中斷和定時器都不需要,主程序留在 等待的時候加一丟丟延時再執(zhí)行就ok了 |
| stc8h默認(rèn)是高阻 |
|
//00準(zhǔn)雙向 01推挽輸出 10高阻輸入 11開漏輸出高阻輸入 P3M1 = B0000_0000; P3M0 = B1010_0000; 增加這個后就可以了 |
| 這個代碼我在STC15W408AS上調(diào)試通過。 為什么在STC8H1K08上不行,就是沒有操作EC11旋轉(zhuǎn)編碼器,電腦串口 不斷收到數(shù)據(jù)。 |
hewayking 發(fā)表于 2022-2-16 14:19 我也認(rèn)為這種方法更好。 http://www.izizhuan.cn/bbs/dpj-221520-1.html 這是用十速51mcu做的直流電機(jī)定位功能,非常可靠準(zhǔn)確,用于EC11要加104電容。 一定要用軟件消抖,要增加2個全局bit變量用于存儲AB引腳之前的狀態(tài),但這樣增加了不少mcu開銷。 |
hewayking 發(fā)表于 2022-2-16 14:19 難打別人不都是這樣嗎? |
個人做法硬件加104電容 一個接外部中斷一個接普通IO 中斷后讀普通IO高低 正轉(zhuǎn)高或低 反轉(zhuǎn)低或高控制++ -- 可靠高效無敵 一般人我不告訴他![]() |
| 齒輪傳動,小齒輪帶大齒輪,用大齒輪帶動編碼器旋轉(zhuǎn),即可降低轉(zhuǎn)速 |
cn_zhx 發(fā)表于 2022-2-8 10:18 什么是加減速器的方法? 可以詳細(xì)說說嗎? |
|
本帖最后由 cn_zhx 于 2022-2-8 14:43 編輯 其實(shí),這里AB數(shù)據(jù)線產(chǎn)生的是格雷碼,如果我們采集時采用判斷AB兩線的變化,即,A或B來下降沿時,作出4次判斷,可以避免樓上所說的哆嗦,但是,要求采樣頻率要跟得上,可以采用加減速器的方法, |
lkc8210 發(fā)表于 2022-1-28 14:03 為什么我知道是因?yàn)槲乙郧熬褪怯妙愃频乃惴ǎ髞砣繐Q成更復(fù)雜的算法了。 看應(yīng)用,如果誤加減影響不大則可以用,否則需要更魯棒性的算法 |
Powered by 單片機(jī)教程網(wǎng)