搜索
bottom↓
回复: 16

关于旋转编码器需要2分频的实现疑惑

[复制链接]

出0入4汤圆

发表于 2019-5-13 16:04:58 | 显示全部楼层 |阅读模式
有一个旋转编码器,输出的是A,A-,B,B-信号,其中A,A-为反向信号,B,B-也为一对反向信号,A,B信号的高低电平变化的时序组成正反转和计数用。现在想对这组信号进行2分频使用。
我开始以为就一个简单的2分频电路就行。但仔细考虑下来不是那么简单的,分频后的信号方向不能改变,只是计数改变就不好弄了。用编程逻辑很容易实现2分频,但要把各信号之间的关联性考虑进来就不知道如何弄了。
请大家指导下。
不知道发在什么区,我就发这里了。如不合适,请版主帮忙移动下。谢谢各位。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入93汤圆

发表于 2019-5-13 16:08:22 | 显示全部楼层
按原样写驱动,成功以后把识别出的步数除以2

出0入4汤圆

 楼主| 发表于 2019-5-13 16:08:33 | 显示全部楼层
编码器时序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

 楼主| 发表于 2019-5-13 16:10:48 | 显示全部楼层
按原样写驱动,成功以后把识别出的步数除以2  不好意思啊,这个我没看明白

出0入4汤圆

 楼主| 发表于 2019-5-13 16:12:27 | 显示全部楼层
我只是把时序的波形改变,不要计数功能

出0入4汤圆

 楼主| 发表于 2019-5-13 16:13:19 | 显示全部楼层
计数功能是另外的设备在做

出0入4汤圆

 楼主| 发表于 2019-5-13 16:16:21 | 显示全部楼层
编程逻辑不知道能不能上电期间根据外部引脚电平初始化?对编程逻辑不是太熟

出0入0汤圆

发表于 2019-5-13 16:22:07 | 显示全部楼层
2分频   2倍频,傻傻分不清。

出0入0汤圆

发表于 2019-5-13 16:37:19 | 显示全部楼层
楼主应该要的是2倍频吧

出0入0汤圆

发表于 2019-5-13 16:53:03 来自手机 | 显示全部楼层
别人都要倍频,你要分频

出0入4汤圆

 楼主| 发表于 2019-5-13 16:53:30 | 显示全部楼层
我要分频,意思是原来转一圈有4096个信号,现在只要2048个信号,方向信号不能发生改变

出0入0汤圆

发表于 2019-5-13 17:20:30 | 显示全部楼层
从编码器读入信号有四种状态(00、01、11、10),输出两个IO口也是四种状态,
程序中根据输入的状态变化情况去改变输出的状态。
似乎不能当作简单的分频,而是要模拟出编码器信号,检测到输入增加两步,则输出增加一步。

出0入4汤圆

 楼主| 发表于 2019-5-14 09:02:25 | 显示全部楼层
根据两位坛友提供的思路,我考虑如下方式实现。不知是否可行。请大家指导下
根据a_in信号的上、下跳变信号,来触发检测b_in信号的转态,根据触发次数确认是采样数据或输出数据翻转。再输出。
现在的疑惑是如果在转动中方向发生改变,我这个是不是有可能出现错误


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-5-14 09:48:13 | 显示全部楼层
我做过类似项目。
按4倍频计数和判相,/4为不倍频输出,/8为二分频输出。

出0入4汤圆

 楼主| 发表于 2019-5-14 10:49:54 | 显示全部楼层
我做过类似项目。
按4倍频计数和判相,/4为不倍频输出,/8为二分频输出

能指导下吗,我这个思路是否正确,是否有遗漏的地方。现贴上描述语言,编译通过
module data_shilt(data_in_a,data_in_b,data_a,data_b);
input data_in_a;
input data_in_b;
output data_a;
output data_b;
reg data_a;
reg data_b;
reg [2:0]con1;//a的下降沿
reg [2:0]con2;//a的上升沿
//下降沿negedge
//上升沿posedge
always @(data_in_a)
begin
    if(data_in_a==1'b0)
    begin
            if(con1>=1)//32 or 16
                          begin
                          con1=0;
                          data_a<=1'b1;
                          end
                else
                 begin
                  data_a<=1'b0;
                  data_b<=data_in_b;
                  con1=1;
                  con2=0;
                 end
    end         
//
        else
        begin
            if(con2>=1)//
                          begin
                          con2=0;
                          data_b<=~data_b;
                          end
                else
                 begin
                  data_b<=~data_b;
                  con2=1;
                 end           
        end
end
endmodule
//

//
module data_s_16(a1_in,b1_in,a2_in,b2_in,a1_out,b1_out,a2_out,b2_out);
input a1_in;
input b1_in;
input a2_in;
input b2_in;
//
output a1_out;
output b1_out;
output a2_out;
output b2_out;
//
wire a1_out;
wire b1_out;
wire a2_out;
wire b2_out;
//
data_shilt data_r0(a1_in,b1_in,a1_out,b1_out);
data_shilt data_r1(a2_in,b2_in,a2_out,b2_out);

endmodule

           



出0入4汤圆

 楼主| 发表于 2019-5-14 11:04:14 | 显示全部楼层
我的思路是 //在a信号的第一个下降沿a出置低,b出等于b入,在a信号的第一个上升沿时b出取反,在a信号的第二次下降沿时a出置1,在a信号的第二次上升沿时b出取反

出0入0汤圆

发表于 2019-5-14 16:10:20 | 显示全部楼层
楼主用的是CPLD吧,不懂。
我想说的是,mcu(包括FPGA,CPLD)对编码器的4倍频判向计数算法成熟稳定可靠,这也是编码器广泛使用的基础。
坛子里有现成的代码。
二分频也就是将计数值右移3位即可。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 04:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表