• I 编码器时序
  • II 电路设计
  • III 程序设计
  • IV 仿真
    • 1testbench
    • 2波形

I 编码器时序


A的上升沿时候如果B为低电平,则旋转编码器向右转。
A的下降沿B为高电平,则一次右转结束。
A上升沿时候如果B为高电平,则旋转编码器向左转
A的下降沿B为低电平,则一次左转结束。

II 电路设计

III 程序设计

module abcode(clk, rst_n,A, //A相B, //B相testcnt
);input   clk,rst_n;
input   A,B;
output  reg [3:0] testcnt;//10ms计数器,用于消抖。
reg ok_10ms;
reg [31:0]cnt0;
always@(posedge clk,negedge rst_n)
beginif(!rst_n)begincnt0 <= 0;ok_10ms <= 1'b0;endelse beginif(cnt0 < 32'd49_9999)begin//10ms消抖 //我的编码器 此值设置为4999可用!!!!!!!!!!!!!cnt0 <= cnt0 + 1'b1;ok_10ms <= 1'b0;endelse begincnt0 <= 0;ok_10ms <= 1'b1;endend
end//同步/消抖 A、B
reg A_reg,A_reg0;
reg B_reg,B_reg0;
wire A_Debounce;
wire B_Debounce;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginA_reg <= 1'b1;A_reg0 <= 1'b1;B_reg <= 1'b1;B_reg0 <= 1'b1;endelse beginif(ok_10ms)beginA_reg <= A;A_reg0 <= A_reg;B_reg <= B;B_reg0 <= B_reg;endend
endassign A_Debounce = A_reg0 && A_reg && A;
assign B_Debounce = B_reg0 && B_reg && B;//对消抖后的A进行上升沿,下降沿检测。
reg A_Debounce_reg;
wire A_posedge,A_negedge;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginA_Debounce_reg <= 1'b1;endelse beginA_Debounce_reg <= A_Debounce;end
end
assign A_posedge = !A_Debounce_reg && A_Debounce;
assign A_negedge = A_Debounce_reg && !A_Debounce;//对AB相编码器的行为进行描述
reg rotary_right;
reg rotary_left;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginrotary_right <= 1'b1;rotary_left <= 1'b1;endelse begin//A的上升沿时候如果B为低电平,则旋转编码器向右转if(A_posedge && !B_Debounce)beginrotary_right <= 1'b1;end//A上升沿时候如果B为高电平,则旋转编码器向左转else if(A_posedge && B_Debounce)beginrotary_left <= 1'b1;end//A的下降沿B为高电平,则一次右转结束else if(A_negedge && B_Debounce)beginrotary_right <= 1'b0;end//A的下降沿B为低电平,则一次左转结束else if(A_negedge && !B_Debounce)beginrotary_left <= 1'b0;endend
end//通过上面的描述,可以发现,
//“rotary_right”为上升沿的时候标志着一次右转
//“rotary_left” 为上升沿的时候标志着一次左转
//以下代码是对其进行上升沿检测
reg rotary_right_reg,rotary_left_reg;
wire rotary_right_pos,rotary_left_pos;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginrotary_right_reg <= 1'b1;rotary_left_reg <= 1'b1;endelse beginrotary_right_reg <= rotary_right;rotary_left_reg <= rotary_left;end
endassign rotary_right_pos = !rotary_right_reg && rotary_right;
assign rotary_left_pos = !rotary_left_reg && rotary_left;//用于测试的计数器 右转+1 左转-1
always@(posedge clk,negedge rst_n)beginif(!rst_n)testcnt <= 4'd0;else if(rotary_right_pos)testcnt <= testcnt + 4'd1;else if(rotary_left_pos)testcnt <= testcnt - 4'd1;
endendmodule

IV 仿真

1testbench

`timescale 1ns/1ns
`define clk_period 20module tb;reg clk; reg rst_n;reg A; //A相reg B; //B相wire[3:0] testcnt;abcode f1(.clk(clk), .rst_n(rst_n),.A(A), //A相.B(B), //B相.testcnt(testcnt)
);initial clk = 1'd0;always #(`clk_period/2) clk = ~ clk;initial beginrst_n = 1'b0;A = 1;B = 1;#(`clk_period*20)rst_n = 1'b1;#(`clk_period)//模拟右转A = 1;B = 1 ;#250_000_00;A = 0;B = 1 ;#250_000_00;A = 0;B = 0 ;#250_000_00;A = 1;B = 0 ;#250_000_00;A = 1;B = 1 ;#250_000_00;A = 0;B = 1 ;#250_000_00;A = 0;B = 0 ;#250_000_00;A = 1;B = 0 ;#250_000_00;A = 1;B = 1 ;#250_000_00;A = 0;B = 1 ;#250_000_00;A = 0;B = 0 ;#250_000_00;A = 1;B = 0 ;#250_000_00;
//------------------------------------------            A = 1'bz;B = 1'bz;#50_000_00;//模拟左转         B = 1;A = 1 ;#250_000_00;B = 0;A = 1 ;#250_000_00;B = 0;A = 0 ;#250_000_00;B = 1;A = 0 ;#250_000_00;B = 1;A = 1 ;#250_000_00;B = 0;A = 1 ;#250_000_00;B = 0;A = 0 ;#250_000_00;B = 1;A = 0 ;#250_000_00;B = 1;A = 1 ;#250_000_00;B = 0;A = 1 ;#250_000_00;B = 0;A = 0 ;#250_000_00;B = 1;A = 0 ;#250_000_00;
//------------------------------------------ #2000;$stop;end endmodule 

2波形

【verilog】 AB相旋转编码器驱动(fpga,正交编码器,霍尔编码器驱动)相关推荐

  1. 【MSP432电机驱动设计—下篇】霍尔编码器测车轮运行距离与M/T综合公式法测速概念

    开发板型号为MSP432P401r 今日得以继续我的MSP432电赛速通之路,本篇使用MSP432编程学习霍尔编码器M/T公式法测速概念,最终实现用外部中断方式测得小车行走路程,文章学习讲解原理.附上 ...

  2. 记录智能车自制霍尔编码器(PCB篇)

    前文论述了智能车独轮车组自制编码器的可行性,昨天下单编码器今天就到货了,在此记录一下自制(抄板)年轻人的第一款编码器的历程. 到货的编码器 这种商品店家自然是不可能提供原理图和PCB,能有尺寸图已经是 ...

  3. 两相编码器的FPGA驱动

    两相编码器的驱动原理 根据A,B相的相位差,即相位的领先或落后来判断编码器转轴旋转方向,根据编码器旋转产生的脉冲来计数. 二.输出信号 1.信号序列 一般编码器输出信号除A.B两相(A.B两通道的信号 ...

  4. Arduino UNO控制带AB相磁通量式编码器电动推杆(测试阻尼)实录(L289N电机驱动)

    前段时间为了测试实验器材的阻尼,需要去开发一套装置来测试.提出用Arduino单片机来控制电动推杆(Linear Actuator)来制造相应速度的运动,搭配上测力计,从而根据来测得阻尼,在这里简单记 ...

  5. Arduino、AB相增量式光电编码器测位移和速度方向

    利用Arduino.增量式光电编码器测量速度.方向.位移. 学校的一个项目作业,实测有效,若有改进的地方还需大佬们指点. 材料: Arduino mega 2560 2个2k电阻(红白之间2k,红绿之 ...

  6. 07 TIM编码器和AB相电机测速

    AB相编码器 编码器分为光学和磁极. 编码器的性能指标单位:分辨率(转一圈输出多少个信号值) 精度390线的编码器:A相390个方波,B相390个方波.相位相差90°,实现4倍频,所以实现390*4= ...

  7. S7-1200PLC 通过高速计数器测量AB相编码器转速

    AB相编码器转速的测量 编码器Omron E6B2-CWZ5B 500脉冲/圈 测量编码器转速的两种方式: 方法一:在博图软件高速计数器的组态中,已经提供了捕捉编码器频率的组态选项. 频率的单位为:脉 ...

  8. 基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master

    基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master 顶层模块实现master对slave自定义的寄存器读取 带仿真模块 ID:153069768739840 ...

  9. 通过电机编码器AB相输出确定电机转向

    AB相输出相差90度,即当A相"正跳变"时如果B相是高电平那么是"正转",反之是"反转" 图片: 正转 反转 #include <Ti ...

  10. 伺服电机脉冲控制的多种方式(AB相脉冲,方向脉冲,CW/CCW脉冲)

    脉冲信号可以分为AB相脉冲,脉冲+方向,CW/CCW脉冲. 这三种信号格式,在十几年前或者还有明显的相对优缺点和适用场合,现在就已经无所谓了,即使在使用上还是有所区分,也基本上是由于历史习惯. 1.A ...

最新文章

  1. 《白话法律42讲》读后感
  2. 蓝桥杯_算法训练_矩阵乘法
  3. Python入门--模块的导入和使用
  4. eclipe安装中文语言包 CDT Pydev
  5. 解决自定义actionbar 两边空隙
  6. js基础之动画(一)
  7. wps表格怎么添加附页_关于WPS里面页码的问题
  8. 地球同步、地球静止、半同步、太阳同步、极地、莫尼亚轨道阐释
  9. android 多个sdcard路径,Android中访问sdcard路径的几种方式
  10. 计算机网络期末复习资料(一)单选题
  11. 计算机加密技术图片,基于Henon映射的图像加密技术
  12. 中国土地市场网爬虫——浏览器Cookie验证(简单)
  13. Chrome谷歌浏览器的安装
  14. python之JS逆向—破解DIDI外卖wsgsig
  15. 全球及中国冬装外套行业销售策略及竞争渠道研究报告(2022-2027年)
  16. 自动切换背景的登录页面
  17. SimpleDateFormat类
  18. Swift函数式编程十二(表格应用)
  19. 数据结构——用栈实现后缀表达式的计算
  20. 抓包工具?我只选Fiddler,全网最全教程!

热门文章

  1. 手机怎么打开html.chm,chm格式文件怎么打开,华为手机chm阅读器哪个好
  2. 消除IBM P750小机上的黄色报警灯
  3. n6 tenda 固件_腾达 Tenda N6 刷 TTDW 说明
  4. 使用Unicode字符集出现的错误总结
  5. IDEA代码规范插件P3C+代码注释模板
  6. 全网可达,交换机和路由器的配置,vlan
  7. 如何卸载Adobe Premiere Pro CC 2017和Adobe Photoshop CC 2018
  8. 2018年苏大计算机考研872真题及解析
  9. 黑马程序员—银行调度系统
  10. 使用Bitvise SSH代理访问