![]() |
發布時間: 2020-3-11 21:22
正文摘要:之前一直沒用到過,今天應朋友要求幫忙寫一個EC11驅動,在網上搜了一圈,發現很多驅動用起來并不是很順手。于是自己寫了一個,供參考 ... |
多謝了,下載看看 |
用中斷的方式,AX,BX引起中斷(檢測上升沿,下降沿,實現四倍頻),然后簡單的中斷處理就OK。 sbit AX = P3^3; sbit BX = P3^2; void int0_Routine() interrupt 0 { if (AX==1) { if (BX==1) {++cnt;} else {--cnt;} } else {if (BX==0) {++cnt;} else {--cnt;} } } void int1_Routine() interrupt 2 { if (BX==1) { if (AX==1) {--cnt;} else {++cnt;} } else {if (AX==0) {--cnt;} else {++cnt;} } } |
謝謝樓主的分享。 |
void ec11_init(void) { P0_4 =1; P0_5 =1; } 因為傳統51單片機IO口多是準雙向口,向IO口置1,就是讓該口成為輸入。 |
zpmpok001 發表于 2021-6-29 19:56 你這個程序吧,頂多就是個小白寫的,單片機用阻塞延時都是最low |
zhaobolove 發表于 2021-6-30 11:39 對的, |
void ec11_init(void) { P0_4 =1; P0_5 =1; } 這個函數 沒有使用, 沒有什么意義, 對吧? |
我幾年前也寫了一個,扭動時有時有點跳,有空換你的試試看![]() |
我也有EC11 代碼,不丟數據 sbit IR_A=P2^0; sbit IR_B=P2^1; sbit IR_KEY=P2^2; // unsigned int NUM; 全局 編碼器值的通道 // 本模塊專用數據,其他模塊只讀屬性 char KZ; //快照 void ec11 ( ) _task_ EC11 { while(1) { // =========選擇 流水燈ID========== IR_KEY=1; if(IR_KEY==0)//按鍵按下 {//選擇流水燈ID yc(20); if(IR_KEY==0)//按鍵按下 { (LED_ID >LED_NUM_MAX-1) ? LED_ID=0 : LED_ID++; //切換到下一個流水燈 //提示: LED_ID 是多少 } } NUM = LED_ShuDu[LED_ID ]; // =========取編碼器 數值========== KZ= ((char)IR_A<<1) + (char)IR_B; //取 IR引腳快照 switch(KZ) { case 0 : // 后半周 break; case 1 : //數據 while(IR_A!=IR_B); //等待 跳過數據期 if(IR_A) { NUM--; } break; case 2 : //數據 while(IR_A!=IR_B); //等待 跳過數據? if(IR_A) { NUM++; } break; case 3 : //前半周 無動作 break; }// end switch(KZ) LED_ShuDu[LED_ID ]= NUM; //寫入速度 os_switch_task(); //退出 }// end while(1) }// end ec11 ( ) |
lihui2558 發表于 2021-6-29 09:53 旋轉下就知道了,不對的話,A,B引腳互換下就可以 |
樓主你好,咱們程序中怎么確定編碼器的正反轉呢, |
某一個寶搜索 鋪名"單片機開發與技術支持 "可以找到我 |
請叫我雷鋒 |
學習了,正想用這個。謝謝樓主無私奉獻。 |
2021-1-25 日在東莞工作的我把樓主的代碼移植到了項目中![]() |
Jeff_BlindCat 發表于 2020-7-3 20:57 好詩好詩。。 |
前輩探討藝精進, 萌新瑟瑟獲知新; 傳幫可帶新小白, 日學一至不廢春。 |
用51做高分辨率且高速時確實會丟脈沖,如果51像STM32有專門的硬件編碼器接口就好了 |
很好的實例,謝謝樓主的無私奉獻!少年強則國強!中國的發展都是因為你們這些無私奉獻的人而提速!一群人的力量總比一個人強, |
很好的編程思路,學習了 |
void _ec11_drives(void)//中斷10us中調用 你好,這個是開一個定時器中斷,在中斷里調用對么? |
void _ec11_drives(void)//你好,開一個10us的定時器中斷,然后在中斷里面調用它對么? |
lzzasd 發表于 2020-5-18 09:55 那就要改采樣的時間,沒有什么不適用的,任何代碼都不是說可以直接使用,別人只是提供一個編程思想! |
boboxuexi 發表于 2020-5-12 16:12 我覺得EC11還好 20分辨率 要是再快點100分辨率可能就不適用了 速度一塊會丟脈沖 |
JACK_WEI 發表于 2020-3-14 10:10 塘廈鎮, |
XTXB 發表于 2020-5-12 12:40 我沒發現會加1,改成static unsigned char CheckCnt,EC11Status=1;就不會了嗎? |
lzzasd 發表于 2020-5-12 13:27 你想表達什么意思呢? |
我編碼器重去年寫到現在(業余的時間)都沒有一個好用的,網上的參考N多,效果都不好,發現無論是IO中斷,還是電平比較都會丟脈沖或者因震蕩電壓干擾計數,EC11還好一點一圈計數少,100分辨率編碼器的問題就多了,所以編碼器直接接單片機IO口還是有問題的,需要硬件上改改 |
試驗了一下,效果挺好,不錯的![]() 開機會加一,改了一下就可以了,static unsigned char CheckCnt,EC11Status=1; |
謝謝,學習了 |
謝謝大佬的無私分享 |
老鐵 你在東莞哪里 |