查看: 24190|回复: 96

【小脚丫Step FPGA】旋转式编码开关----微风细雨

  [复制链接]
  • TA的每日心情
    郁闷
    2017-12-4 18:33
  • 签到天数: 94 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-11-19 12:38:50 | 显示全部楼层 |阅读模式
    分享到:
           全阶段优化设计,英特尔Quartus Prime成就强大FPGA

    虽然之前的旋转编码开关没能秒杀到,但是还是想做一下这个模块驱动
           小型旋转编码器,又称旋转编码开关,是指具有一组有规律且严格时 序脉冲的开关电子元器件。通过与IC的配合,起到递增,递减,翻页等功能,例:鼠标的翻页,菜单的选择,音响的声音与调节,频率的调节,多仕炉的温度调节,医用器械的频率调节等。
           按结构可将其分为机械式旋转编码开关和光电式旋转编码开关。所谓机械式旋转编码开关,是指通过信号配合零件的规律转动或(移动)形成触点接触而产生规律脉冲的编码产品,其寿命具有较大的局限性;光电式旋转编码开关,是指通过光源耦合,形成的无接触点接触而产生规律脉冲的编码产品,其寿命极长。
           本节实验采用的是Pmod模块,先介绍一下开关结构。
           旋转编码结构:
    QQ截图20151119122907.png
            由于是机械结构,所以开关输出波形存在抖动。开关向右旋转时,A,B输出波形如下。可见A相波形先由低变高,或者说A相超前B相。
    QQ截图20151119122931.png
           当开关向左旋转时,波形类似,区别在于B输出波形,先由低变高,或者说A相滞后于B相。
           这样理解可能有点晦涩,那可以简单描述为,在A相的上升沿,若B相为低电平,则开关向右旋转。同理,在A相的上升沿,若B相为高电平,则开关向左旋转。
          
          旋转编码原理理解后,再看看开关自带的按键。只是一个按键下拉输出而已,结构如下:
    QQ截图20151119122922.png

           理解其原理之后,代码方面就简单许多。关键代码如下:
    1. always@(posedge clk,posedge rst)begin
    2.                 if(rst)begin
    3.                         A_Debounce_reg <= 1'b1;
    4.                 end
    5.                 else begin
    6.                         A_Debounce_reg <= A_Debounce;
    7.                 end
    8.         end
    9.         
    10.         assign A_pos = !A_Debounce_reg && A_Debounce;
    11.         assign A_neg = A_Debounce_reg && !A_Debounce;
    12.         
    13.         always@(posedge clk,posedge rst)begin
    14.                 if(rst)begin
    15.                         rotary_right <= 1'b1;
    16.                         rotary_left <= 1'b1;
    17.                 end
    18.                 else begin
    19.                         if(A_pos && !B_Debounce)begin
    20.                                 rotary_right <= 1'b1;
    21.                         end
    22.                         
    23.                         if(A_pos && B_Debounce)begin
    24.                                 rotary_left <= 1'b1;
    25.                         end
    26.                         
    27.                         if(A_neg && B_Debounce)begin
    28.                                 rotary_right <= 1'b0;
    29.                         end
    30.                         
    31.                         if(A_neg && !B_Debounce)begin
    32.                                 rotary_left <= 1'b0;
    33.                         end
    34.                 end
    35.         end

    36.         always@(posedge clk,posedge rst)begin
    37.                 if(rst)begin
    38.                         rotary_right_reg <= 1'b1;
    39.                         rotary_left_reg <= 1'b1;
    40.                 end
    41.                 else begin
    42.                         rotary_right_reg <= rotary_right;
    43.                         rotary_left_reg <= rotary_left;
    44.                 end
    45.         end

    46.         assign rotary_right_pos = !rotary_right_reg && rotary_right;
    47.         assign rotary_left_pos = !rotary_left_reg && rotary_left;

    48.         assign rotary_event = rotary_right_pos || rotary_left_pos;
    复制代码
    代码解释:
    A,B两相经过消抖,得到稳定的A_Debounce和B_Debounce。旋转的判断都是基于这两个消抖后的信号。根据之前的原理分析,在A相上升沿,B相为低电平时,将右转信号赋值为高电平。在A相下升沿,B相为高电平时,将右转信号赋值为低电平。同理处理左转信号。
    在得到左转和右转信号后,可以通过两者的上升沿进行旋转事件判断。通过rotary_event来决定是否进行其他操作,如LED是否移动,在通过判断左右转信号的上升沿来判断左转或者右转。

    源代码附在下来,如有需要回复可见。相信想学习FPGA的都能完成该项目!!!

    游客,如果您要查看本帖隐藏内容请回复






    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-23 14:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2015-11-19 13:15:59 | 显示全部楼层
    看看木木又有啥新动作,嘻嘻
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-4 18:33
  • 签到天数: 94 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-19 14:08:59 | 显示全部楼层
    caizhiwei 发表于 2015-11-19 13:15
    看看木木又有啥新动作,嘻嘻

    嘿嘿,谢谢关注。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-11-19 21:43:39 | 显示全部楼层
                   比我还快
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-4 18:33
  • 签到天数: 94 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-20 10:25:06 | 显示全部楼层
    suoma 发表于 2015-11-19 21:43
    比我还快

    有比我更快的。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2014-11-28 09:29
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2015-11-20 15:29:00 | 显示全部楼层
    看看,学习!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-11-20 16:55:03 | 显示全部楼层
    不错,学习下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-4 18:33
  • 签到天数: 94 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-20 18:05:04 | 显示全部楼层
    TONY-NING 发表于 2015-11-20 16:55
    不错,学习下

    宁神驾到有失远迎
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-4 18:33
  • 签到天数: 94 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-20 18:05:44 | 显示全部楼层
    liujincai 发表于 2015-11-20 15:29
    看看,学习!

    希望继续关注
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-3-23 12:01
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-11-25 14:20:06 | 显示全部楼层
    看看正需要旋转开关
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 15:33 , Processed in 0.188907 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.