熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2020-3-11 21:22
正文摘要:之前一直沒(méi)用到過(guò),今天應(yīng)朋友要求幫忙寫一個(gè)EC11驅(qū)動(dòng),在網(wǎng)上搜了一圈,發(fā)現(xiàn)很多驅(qū)動(dòng)用起來(lái)并不是很順手。于是自己寫了一個(gè),供參考 ... |
| 多謝了,下載看看 |
|
用中斷的方式,AX,BX引起中斷(檢測(cè)上升沿,下降沿,實(shí)現(xiàn)四倍頻),然后簡(jiǎn)單的中斷處理就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; } 因?yàn)閭鹘y(tǒng)51單片機(jī)IO口多是準(zhǔn)雙向口,向IO口置1,就是讓該口成為輸入。 |
zpmpok001 發(fā)表于 2021-6-29 19:56 你這個(gè)程序吧,頂多就是個(gè)小白寫的,單片機(jī)用阻塞延時(shí)都是最low |
zhaobolove 發(fā)表于 2021-6-30 11:39 對(duì)的, |
|
void ec11_init(void) { P0_4 =1; P0_5 =1; } 這個(gè)函數(shù) 沒(méi)有使用, 沒(méi)有什么意義, 對(duì)吧? |
我?guī)啄昵耙矊懥艘粋(gè),扭動(dòng)時(shí)有時(shí)有點(diǎn)跳,有空換你的試試看![]() |
|
我也有EC11 代碼,不丟數(shù)據(jù) sbit IR_A=P2^0; sbit IR_B=P2^1; sbit IR_KEY=P2^2; // unsigned int NUM; 全局 編碼器值的通道 // 本模塊專用數(shù)據(jù),其他模塊只讀屬性 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++; //切換到下一個(gè)流水燈 //提示: LED_ID 是多少 } } NUM = LED_ShuDu[LED_ID ]; // =========取編碼器 數(shù)值========== KZ= ((char)IR_A<<1) + (char)IR_B; //取 IR引腳快照 switch(KZ) { case 0 : // 后半周 break; case 1 : //數(shù)據(jù) while(IR_A!=IR_B); //等待 跳過(guò)數(shù)據(jù)期 if(IR_A) { NUM--; } break; case 2 : //數(shù)據(jù) while(IR_A!=IR_B); //等待 跳過(guò)數(shù)據(jù)? if(IR_A) { NUM++; } break; case 3 : //前半周 無(wú)動(dòng)作 break; }// end switch(KZ) LED_ShuDu[LED_ID ]= NUM; //寫入速度 os_switch_task(); //退出 }// end while(1) }// end ec11 ( ) |
lihui2558 發(fā)表于 2021-6-29 09:53 旋轉(zhuǎn)下就知道了,不對(duì)的話,A,B引腳互換下就可以 |
| 樓主你好,咱們程序中怎么確定編碼器的正反轉(zhuǎn)呢, |
| 某一個(gè)寶搜索 鋪名"單片機(jī)開發(fā)與技術(shù)支持 "可以找到我 |
| 請(qǐng)叫我雷鋒 |
| 學(xué)習(xí)了,正想用這個(gè)。謝謝樓主無(wú)私奉獻(xiàn)。 |
2021-1-25 日在東莞工作的我把樓主的代碼移植到了項(xiàng)目中![]() |
Jeff_BlindCat 發(fā)表于 2020-7-3 20:57 好詩(shī)好詩(shī)。。 |
|
前輩探討藝精進(jìn), 萌新瑟瑟獲知新; 傳幫可帶新小白, 日學(xué)一至不廢春。 |
| 用51做高分辨率且高速時(shí)確實(shí)會(huì)丟脈沖,如果51像STM32有專門的硬件編碼器接口就好了 |
| 很好的實(shí)例,謝謝樓主的無(wú)私奉獻(xiàn)!少年強(qiáng)則國(guó)強(qiáng)!中國(guó)的發(fā)展都是因?yàn)槟銈冞@些無(wú)私奉獻(xiàn)的人而提速!一群人的力量總比一個(gè)人強(qiáng), |
| 很好的編程思路,學(xué)習(xí)了 |
|
void _ec11_drives(void)//中斷10us中調(diào)用 你好,這個(gè)是開一個(gè)定時(shí)器中斷,在中斷里調(diào)用對(duì)么? |
| void _ec11_drives(void)//你好,開一個(gè)10us的定時(shí)器中斷,然后在中斷里面調(diào)用它對(duì)么? |
lzzasd 發(fā)表于 2020-5-18 09:55 那就要改采樣的時(shí)間,沒(méi)有什么不適用的,任何代碼都不是說(shuō)可以直接使用,別人只是提供一個(gè)編程思想! |
boboxuexi 發(fā)表于 2020-5-12 16:12 我覺(jué)得EC11還好 20分辨率 要是再快點(diǎn)100分辨率可能就不適用了 速度一塊會(huì)丟脈沖 |
JACK_WEI 發(fā)表于 2020-3-14 10:10 塘廈鎮(zhèn), |
XTXB 發(fā)表于 2020-5-12 12:40 我沒(méi)發(fā)現(xiàn)會(huì)加1,改成static unsigned char CheckCnt,EC11Status=1;就不會(huì)了嗎? |
lzzasd 發(fā)表于 2020-5-12 13:27 你想表達(dá)什么意思呢? |
| 我編碼器重去年寫到現(xiàn)在(業(yè)余的時(shí)間)都沒(méi)有一個(gè)好用的,網(wǎng)上的參考N多,效果都不好,發(fā)現(xiàn)無(wú)論是IO中斷,還是電平比較都會(huì)丟脈沖或者因震蕩電壓干擾計(jì)數(shù),EC11還好一點(diǎn)一圈計(jì)數(shù)少,100分辨率編碼器的問(wèn)題就多了,所以編碼器直接接單片機(jī)IO口還是有問(wèn)題的,需要硬件上改改 |
試驗(yàn)了一下,效果挺好,不錯(cuò)的![]() 開機(jī)會(huì)加一,改了一下就可以了,static unsigned char CheckCnt,EC11Status=1; |
| 謝謝,學(xué)習(xí)了 |
| 謝謝大佬的無(wú)私分享 |
| 老鐵 你在東莞哪里 |
Powered by 單片機(jī)教程網(wǎng)