找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

求增量式正交旋转编码器的Verilog HDL鉴相代码

查看数: 5967 | 评论数: 8 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-12-28 13:22

正文摘要:

求增量式正交旋转编码器的Verilog HDL鉴相代码       需要使用大约13个增量式正交旋转编码器设定值,stm32的定时器不够用,用中断需要13个中断,不太方便,stm32的引脚也不太好分配。想用EPM ...

回复

ID:328014 发表于 2019-1-10 00:29
mark帮顶下
ID:199427 发表于 2018-12-31 08:56
      if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]==buffer1[1:1])) // D3和D0相同(D2和D1不同)
修改为

      if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]!=buffer1[1:1])) // D3和D0相同(D2和D1不同)
ID:199427 发表于 2018-12-30 19:18
添加代码后,排版格式乱了。再发一次。
wire A, B;
reg [1:0] ABtimes;
reg period;
reg [3:0] shift_register,  [3:0] buffer0,   [3:0] buffer1;
reg [15:0] Counter;


always @(posedge A or posedge B or negedge A or negedge B)     
begin
   ABtimes = ABtimes +1;
   shift_register[3:0] = {shift_register[2:0], 1};   //  拼接1到最低位


   if(ABtimes == 3)  //  00-01-10-11  编码器经过了 A上升、B上升、A下降和B下降四步
   begin
           if(period == 0)
           begin
                  period = 1;    // 第二个周期
                  buffer1 =  shift_register;     //  暂存第二个周期的移位寄存器值
           end
           else
           begin
                 period = 0;     // 第一个周期
                 buffer0 =  shift_register;     //  暂存第一个周期的移位寄存器值
           end
   end
     
   if((ABtimes == 3)&& (period == 1))  //  编码器经过四步和第二个周期
   begin
       if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]==buffer1[1:1])) // D3和D0相同(D2和D1不同)
            Counter <= Counter + 1;
      else
            Counter <= Counter - 1;


      shift_register <=  0;   //  清零
   end  


end



ID:199427 发表于 2018-12-30 15:37
谢谢 bucker 答复!没有完全理解您的思路。简单写了如下代码:


复制代码
没有测试。不知道对不对?



ID:439075 发表于 2018-12-30 11:18
简单的代码比较好做,可能对于抖动滤波做的不好,真正的消抖效果需要靠实际环境考核才能验证。
说个简单方法,先设法获取A、B相的上升沿和下降沿,每个沿都触发同一个移位寄存器,取本次(D1、D0)及上次(D3、D2)的锁存值共四位,即D3、D2、D1、D0。判断方式为D3和D0相同(D2和D1不同)则正向,相反则为反向。这个方法你通过波形图分析就可以推导出来。
ID:199427 发表于 2018-12-29 13:38
本帖最后由 wxyz 于 2018-12-29 15:04 编辑

旋转编码器的A和B分别用5.1K电阻上拉到3.3V,再用0.1uF电容对地滤波消除抖动和干扰。
借助单片机中断模式的思路:

在上升边沿触发模式下,A和B进行电平比较:
对A触发的中断:同加异减
对B触发的中断:同减异加

采用对A触发的上升沿中断模式,简单的Verilog HDL如下:

  1. always @(posedge RotaryEncoder01Aphase)  // A的上升沿
复制代码

根据以前单片机中断模式的调试经验,编码器有漏计数情况,计数不连续递增或递减,编码器的抖动干扰会造成漏计数情况。单片机可以采用延时消除抖动干扰,但Verilog HDL中不知道如何解决?




小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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