| 多谢了,下载看看 |
|
用中断的方式,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; |
| 谢谢,学习了 |
| 谢谢大佬的无私分享 |
| 老铁 你在东莞哪里 |