搜索
bottom↓
回复: 18

虚心求教:正交编码器信号是怎么处理的?

[复制链接]

出0入0汤圆

发表于 2010-5-15 10:11:31 | 显示全部楼层 |阅读模式
电机的编码器A,B信号,相位相差90度。电机正转A超前B,电机反转B超前A。
我之前用单片机计数器,电机在一个方向的时候很准,但是电机有抖动的时候处理不准,一般会多计数,我觉得只用单片机是处理不好的。
现在想加个小型CPLD解决此问题

请问用过的朋友,只做个加减计数器就能解决此问题吗,
做过的朋友,可以给点建议或者程序
先谢谢大家!

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-5-16 05:27:44 | 显示全部楼层
状态机
无非就是 00 10 11 01 四种状态,相邻的状态和头尾的状态可以进行切换且进行COUNTER + -,其他忽略即可。

出0入0汤圆

发表于 2010-5-16 11:00:42 | 显示全部楼层
用单片机或CPLD两者只有响应频率的区别,而不是说用单片机就处理不好,用了cpld就能解决问题,关键是你需要处理在平衡位置信号抖动的问题,就是说A或B的上升沿和下降沿都要处理,判断是加或减

出0入0汤圆

发表于 2010-5-16 23:12:04 | 显示全部楼层
在《基于altera fpga/cpld的电子系统设计及工程实践》P296 有对抖动处理的相应算法,没有验证过。

出0入0汤圆

发表于 2010-5-16 23:41:05 | 显示全部楼层
单片机完全可以处理好的。。。我做过的,一个脉冲都不丢

出0入0汤圆

发表于 2010-5-17 02:57:58 | 显示全部楼层
回复【5楼】niba
单片机完全可以处理好的。。。我做过的,一个脉冲都不丢
-----------------------------------------------------------------------

试问你做多少路编码器?你的编码器线数多少?电机能转多快?

反正我以前用ARM7 fiq最多做2路 2000线 3000转,而且这时候有一半的CPU时间用来中断~

补充现在的流行的单片机很多都有编码器接口的类型,想方便直接用吧~如STM32~或者TI dsp~流明M3~NXP 17xx

出0入0汤圆

 楼主| 发表于 2010-5-17 14:07:16 | 显示全部楼层
单片机,A,B信号分别连到中断口上,判断A是否超前B,来判断增加还是减少吗?我以前好像这么处理的,没处理好啊

电机350转/分,编码器是200 线的。步进电机,确实有时候抖动,造成读数增多,脉冲端加了102的滤波电容。
如果能用单片机处理好,就不用CPLD了,如果处理不好,就得增加CPLD了。
用的AVR MEGA128, 12m晶体。

继续请教!

出0入0汤圆

发表于 2010-5-20 11:14:13 | 显示全部楼层
void keyscan(void)
{
if( FIO1PIN2&0x20){A1=0x01 ;}
else{
A1=0 ;
}
if(FIO1PIN2&0x10){B1=0x01 ;}
   else{
B1=0 ;
}

if (oldA1 & (!A1&0x01))
        {
         if(mast!=0x55)return;
        if (!A1)
                {
                if(!B1)
                        {
                        if(xd<=9)
                        {xd++;}
                        else{xd=xd;}
                        }
                else
                        {
                         if(xd>=1)
                         {
                        xd--;
                        }
                        else{xd=xd;}
                        }
                }
        }
cpldwritechar(xd,100);//CPLD电机EN关
  oldA1=A1;
}
AVR不懂 计数慢要求不高的话单片机免强可以仔细看这个

出0入0汤圆

发表于 2010-5-20 13:50:33 | 显示全部楼层
一片7473就搞定了

两个D触发器

出0入0汤圆

发表于 2010-6-17 22:33:03 | 显示全部楼层
mark 不知道楼上是怎么实现的。

出0入0汤圆

发表于 2010-6-18 00:10:07 | 显示全部楼层
问六个就十元,我要是问600个那不得给我一千元啊……
http://www.21ic.com/invad/invad.htm

出0入0汤圆

发表于 2010-6-22 09:21:04 | 显示全部楼层
用FPGA做也出现了楼主所说的问题,后来加了滤波就好了.

出0入0汤圆

发表于 2010-6-22 17:01:23 | 显示全部楼层
不论用MCU还是CPLD处理,都必须有滤波环节才可靠

(原文件名:encode.JPG)

出0入0汤圆

发表于 2010-6-23 20:55:04 | 显示全部楼层
貌似和单片机没什么关系的吧,和信号有很大关系!

出0入0汤圆

发表于 2010-8-22 01:28:26 | 显示全部楼层
回复【13楼】shinehjx
不论用mcu还是cpld处理,都必须有滤波环节才可靠


(原文件名:encode.jpg)
引用图片
-----------------------------------------------------------------------

请教楼上高手 这点杂波该如何过滤啊?

出0入0汤圆

发表于 2010-8-22 02:27:31 | 显示全部楼层
回复【13楼】shinehjx  
不论用mcu还是cpld处理,都必须有滤波环节才可靠

(原文件名:encode.jpg)
-----------------------------------------------------------------------

module rotencodertop(
         iROTP,
         iROTN, // 旋转编码器的两个输入
         iCLK, //时钟,频率要比旋转高一些
         rot_event,// 有旋转事件出现时变高
         rot_left, //左转时变高
         );

input iROTP, iROTN, iCLK;
output rot_event, rot_left;

reg rot_q1, rot_q2, rot_q1_delay, rot_event, rot_left;
wire [1:0]rot_input;
assign rot_input = {iROTP,iROTN};

always@(posedge iCLK)
        begin
                case(rot_input)
                        2'b00:begin
                                rot_q1 <= 1'b0;
                                rot_q2 <= rot_q2;
                                end
                        2'b01:begin
                                rot_q1 <= rot_q1;
                                rot_q2 <= 1'b0;
                                end
                        2'b10:begin
                                rot_q1 <= rot_q1;
                                rot_q2 <= 1'b1;
                                end
                        2'b11:begin
                                rot_q1 <= 1'b1;
                                rot_q2 <= rot_q2;
                                end
                endcase
        end

always@(posedge iCLK)
        rot_q1_delay <= rot_q1;

always@(posedge iCLK)
        if((rot_q1 == 1'b1)&&(rot_q1_delay == 1'b0))
                begin
                        rot_event <= 1'b1;
                        rot_left <= rot_q2;
                end
        else
                begin
                        rot_event <= 1'b0;
                        rot_left <= rot_left;
                end


endmodule


就行了。。。用CPLD实现,占用资源很少。

出0入0汤圆

发表于 2010-8-22 02:28:22 | 显示全部楼层
上面代码是基本参考了xilinx的参考设计。

出0入0汤圆

发表于 2011-10-11 10:15:02 | 显示全部楼层
正交编码滤波处理
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 13:26

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

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