感谢楼主分享![]() |
代码非常稳定可靠!谢谢分享!!! |
zhang32568 发表于 2025-2-20 10:54 刚试了代码非常稳定可靠!谢谢分享!!! |
我经常使用的程序。非常灵敏!定时器3毫秒以内都毫不拖泥带水。 sbit EC11_A = P3^5; //EC11 A端 sbit EC11_B = P3^3; //EC11 B端 void EC11_Display() { static bit EC11_Flag=0,Left_Flag=0,Right_Flag=0; if((EC11_A)&&(EC11_B))//两个都是1,表示开始第一个脉冲 { EC11_Flag =1 ;//标记为第一个信号收到,可以进行下一个信号 } if(EC11_A!=EC11_B)//第二个信号 { Left_Flag = EC11_A ; //记录AB的信号状态 Right_Flag = EC11_B ; } if(EC11_Flag) { if((EC11_A==0)&&(EC11_B==0))// 第三个信号,处理第二个信号的值 { if(Right_Flag)//右转 { //自己程序 } else if(Left_Flag) //左转 { //自己程序 } EC11_Flag = 0; //把标志位清零,等待下一个周期 } } } |
邰夏留 发表于 2025-2-18 09:57 我用的是模块,应该是加了电容消抖。软件消抖这个不好处理,你可以测试下,不消抖有什么问题 |
zyhlove813 发表于 2023-12-13 23:11 请教一下楼主,这个怎么消抖的呢? |
kkfy888 发表于 2024-11-10 21:39 有心了 |
看了up的视频,特意搜了关键字找到了^_^ |
讲解的思路真的很清晰啊 |
编码器,判断谁先跳变,就当起始![]() |
zyhlove813 发表于 2024-7-10 13:28 没有沉,都在学习中。感谢大佬分享的算法 ![]() |
楼主钻研精神可嘉,向你学习。 |
![]() |
youlinys 发表于 2023-12-31 21:35 通过不同的方法去实现目标,可能锻炼自己的思维能力 ![]() |
讲解得很详细。UP厉害人。 |
zyhlove813 发表于 2023-12-25 21:04 好的,我去试一下,谢谢! |
lzuoxin 发表于 2023-12-25 18:09 正常应该是要的,我是网购的模块,带电阻和电容滤波,不硬件滤波,你自己可以试下。 |
代码精简高效,向楼主学习了 |
楼主的算法还需要硬件消抖电路吗 |
发表于 2023-12-24 19:28 共同学习 ![]() |
楼主钻研精神可嘉,学习了。 |
zyhlove813 发表于 2023-12-14 13:08 刚才看了下 是我定义的变量的问题 我的变量都是BIT 位类型的 编译就出错 楼主使用的是u8类型的 |
zyhlove813 发表于 2023-12-14 13:08 APP_EC11.C(59):C193: '-': BAD OPERAND TYPE 后段那个 减号 拆成2段就正常了 |
小白只能顶楼主 |
lzzasd 发表于 2023-12-14 11:56 编译什么提示?我是keil4 C51 编译正常,会不会少了个括号标点之类的? |
经过测试 楼主的程序运行稳定 算法精简高效 感谢楼主 只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB_Last ^ KeyB_Now)这段编译报错 只好拆成2段 我也贴上我常用的 也是很稳定 if (PinA != PinA_O) //当A发生跳变时采集B当前的状态,并将B与上一次的状态进行对比。 { //若A 0->1 时,B 1->0 正转;若A 1->0 时,B 0->1 正转; //若A 0->1 时,B 0->1 反转;若A 1->0 时,B 1->0 反转 if (PinA == 1) //EC11_A和上一次状态相比,为上升沿 { if ((PinB_O == 1) && (PinB == 0)) //EC11_B和上一次状态相比,为下降沿 encoder_data++; //正转 if ((PinB_O == 0) && (PinB == 1)) //EC11_B和上一次状态相比,为上升沿 encoder_data--; //反转 //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<// if ((PinB_O == PinB) && (PinB == 0)) //A上升沿时,采集的B不变且为0 encoder_data++; //正转 if ((PinB_O == PinB) && (PinB == 1)) //A上升沿时,采集的B不变且为1 encoder_data--; //反转 } else //EC11_A和上一次状态相比,为下降沿 { if ((PinB_O == 1) && (PinB == 0)) //EC11_B和上一次状态相比,为下降沿 encoder_data--; //反转 if ((PinB_O == 0) && (PinB == 1)) //EC11_B和上一次状态相比,为上升沿 encoder_data++; //正转 //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<// if ((PinB_O == PinB) && (PinB == 0)) //A上升沿时,采集的B不变且为0 encoder_data--; //反转 if ((PinB_O == PinB) && (PinB == 1)) //A上升沿时,采集的B不变且为1 encoder_data++; //正转 } PinA_O = PinA; //更新编码器上一个状态暂存变量 PinB_O = PinB; //更新编码器上一个状态暂存变量 |
讲解的蛮详细的,谢谢楼主的分享 |
好文章,需要认真学习 |
同时贴上lkc8210发表的算法: //算法四: 编译大小不错,只适合单倍频 uint8_t KeyA_Last; uint8_t KeyB_Last; uint8_t KeyA_Now; uint8_t KeyB_Now; int EC_Counter; void Encoder_Ini() { KeyA_Last = P10; KeyB_Last = P11; } void Encoder_Run() { KeyA_Now=P10; KeyB_Now=P11; if(!KeyA_Now && KeyA_Last && KeyB_Now) { EC_Counter++; } KeyA_Last=KeyA_Now; if(!KeyB_Now && KeyB_Last && KeyA_Now) { EC_Counter--; } KeyB_Last=KeyB_Now; } |