mark帮顶下 |
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不同) |
添加代码后,排版格式乱了。再发一次。 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 |
谢谢 bucker 答复!没有完全理解您的思路。简单写了如下代码: |
简单的代码比较好做,可能对于抖动滤波做的不好,真正的消抖效果需要靠实际环境考核才能验证。 说个简单方法,先设法获取A、B相的上升沿和下降沿,每个沿都触发同一个移位寄存器,取本次(D1、D0)及上次(D3、D2)的锁存值共四位,即D3、D2、D1、D0。判断方式为D3和D0相同(D2和D1不同)则正向,相反则为反向。这个方法你通过波形图分析就可以推导出来。 |
本帖最后由 wxyz 于 2018-12-29 15:04 编辑 旋转编码器的A和B分别用5.1K电阻上拉到3.3V,再用0.1uF电容对地滤波消除抖动和干扰。 借助单片机中断模式的思路: 在上升边沿触发模式下,A和B进行电平比较: 采用对A触发的上升沿中断模式,简单的Verilog HDL如下:
根据以前单片机中断模式的调试经验,编码器有漏计数情况,计数不连续递增或递减,编码器的抖动干扰会造成漏计数情况。单片机可以采用延时消除抖动干扰,但Verilog HDL中不知道如何解决? |