码迷,mamicode.com
首页 > 其他好文 > 详细

verilog之:旋转编码器驱动

时间:2015-11-18 12:42:09      阅读:506      评论:0      收藏:0      [点我收藏+]

标签:

旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。

 

工作原理: 增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在Eltra编码器中角位移的转换采用了光电扫描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。

 

 

顺时针运动

逆时针运动

A B

1 1

0 1

0 0

1 0

A B

1 1

1 0

0 0

0 1

增量编码器 

 

 

 技术分享

增量编码器给出两相方波,它们的相位差90°,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比,得到旋转方向的信息。还有一个特殊信号称为Z或零通道,该通道给出编码器的绝对零位,此信号是一个方波与A通道方波的中心线重合。

 技术分享

增量型编码器精度取决于机械和电气两种因素,这些因素有:光栅分度误差、光盘偏心、轴承偏心、电子读数装置引入的误差以及光学部分的不精确性。确定编码器精度的测量单位是电气上的度数,编码器精度决定了编码器产生的脉冲分度。以下用360°电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度,可以用下列公式来计算: 电气360 =机械360°/n°脉冲/转

 技术分享

图:A、B换向时信号

编码器分度误差是以电气角度为单位的两个连续脉冲波的最大偏移来表示。误差存在于任何编码器中,这是由前述各因素引起的。Eltra编码器的最大误差为±25电气角度(在已声明的任何条件下),相当于额定值偏移±7%,至于相位差90°(电气上)的两个通道的最大偏差为±35电气度数相当于额定值偏移±10%左右。

UVW信号增量型编码器

除了上述传统的编码器外,还有一些是与其它的电气输出信号集成在一起的增量型编码器。与UVW信号集成的增量型编码器就是实例,它通常应用于交流伺服电机的反馈。这些磁极信号一般出现在交流伺服电机中,UVW信号一般是通过模拟磁性原件的功能而设计的。在Eltra编码器中,这些UVW信号是用光学方法产生,并以三个方波的形式出现,它们彼此偏移120°。为了便于电机启动,控制电动机用的启动器需要这些正确的信号。这些UVW磁极脉冲可在机械轴旋转中重复许多次,因为它们直接取决于所连接的电机磁极数,并且用于4、6或更多极电机的UVW信号。

 

》》》》》》》》

了解了原理之后,我编写verilog代码,并在STEP小脚丫FPGA板子上做了验证。

代码如下:

  1 //   ==================================================================
  2 //       >>>>>>>>>>>>>>>>>>>>>>>  NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
  3 //   ------------------------------------------------------------------
  4 //   Copyright (c) 2015 by v_jiaocheng
  5 //   ALL RIGHTS RESERVED 
  6 //   ------------------------------------------------------------------
  7 //
  8 //   Permission:
  9 //        To use this code please let me now.
 10 //   Disclaimer:
 11 //
 12 //      This VHDL or Verilog source code is intended as a design reference
 13 //      which illustrates how these types of functions can be implemented.
 14 //      It is the user‘s responsibility to verify their design for
 15 //      consistency and functionality through the use of formal
 16 //      verification methods.  We provides no warranty
 17 //      regarding the use or functionality of this code.
 18 //
 19 //   --------------------------------------------------------------------
 20 //
 21 //                  Wechat Official Accounts :    v_jiaocheng    
 22 
 23 //                  TEL:  (USA and Canada)
 24 //                        (Singapore)
 25 //                        (other locations)
 26 //
 27 //                  web: http://www.znczz.com/forum-234-1.html
 28 //                  email: ning.pg@qq.com
 29 //
 30 //   -------------------------------------------------------------------
 31 //  Project:           encoder
 32 //  File:              encoder.v
 33 //  Title:             encoder
 34 //  Description:       Test the encoder‘s functions with folw LEDs
 35 //
 36 // --------------------------------------------------------------------
 37 // Code Revision History :
 38 // --------------------------------------------------------------------
 39 // Ver: | Author:tony-ning  | Mod. Date  | Changes Made:
 40 // V1.0 | H.C.                 | 2015-11-18 | Initial Release
 41 //
 42 // --------------------------------------------------------------------
 43 
 44 
 45 
 46 module Rotation_encoder
 47 (
 48     input                             CLK,              //25MHz system clk
 49     input                             sig_A,            //encoder A channal
 50     input                             sig_B,            //encoder B channal
 51     input                             BUTTON_IN,        //encoder‘s key signal
 52     output                            [6:1]Led_out      //trible LEDs(active low)
 53 );
 54     
 55     //The definitions for encoder states 
 56     parameter IDLE=2b11;
 57     parameter s1=2b01;
 58     parameter s2=2b00;
 59     parameter s3=2b10;
 60     
 61         
 62     reg [1:0]p;                //The state register of the current state machine
 63     reg [1:0]p_pre;            //The state register of the pre state machine
 64     reg [24:0]count2;         //Counter of debounce module    
 65     reg up,down;              //The register of encoder‘s increse/decrese action
 66     reg key_reg1,key_reg2;     //The temp register of encoder‘s key state
 67     reg key_out;               //The register of encoder-key‘s negedge after debounce
 68     reg [6:1]rled=6b111110;   //LEDs registers and the default  state(if(up)ring shift left)
 69     
 70     //Judging the encoder‘s motion,every trun left up will add 1,so as the down
 71     always @( posedge CLK)
 72         begin
 73             p<={sig_A,sig_B};                        //Get current state
 74             p_pre<=p;                                //Get pre state
 75             case(p_pre)    
 76             //check current and pre state to judge the motion
 77             IDLE:begin 
 78                     if(up | down) begin     
 79                         up<=0;
 80                         down<=0;
 81                     end else begin     
 82                         if(p==s1) 
 83                             up<=1; 
 84                         if(p==s3) 
 85                             down<=1;     
 86                     end    
 87                 end
 88             s1:    begin 
 89                     if(up | down) begin     
 90                         up<=0;
 91                         down<=0;
 92                     end else begin
 93                         if(p==s2) 
 94                             up<=1; 
 95                         if(p==IDLE) 
 96                             down<=1;     
 97                     end    
 98                 end
 99             s2:    begin 
100                     if(up | down) begin     
101                         up<=0;
102                         down<=0;
103                     end else begin
104                         if(p==s3) 
105                             up<=1; 
106                         if(p==s1) 
107                             down<=1;     
108                     end    
109                 end
110             s3:    begin 
111                     if(up | down) begin     
112                         up<=0;
113                         down<=0;
114                     end else begin     
115                         if(p==IDLE) 
116                             up<=1; 
117                         if(p==s2) 
118                             down<=1;     
119                     end    
120                 end
121             endcase
122         end
123     
124     //Key of encoder input debounce
125     always @( posedge CLK)                            //System CLK 25M
126         begin
127             count2<=count2+1;
128             if(count2==250000) begin
129                 key_reg1<=BUTTON_IN;                 //every 10ms updata
130                 count2<=0;
131             end
132             key_reg2<=key_reg1;                      //every CLK check,so can make a single CLK pulse
133             key_out<=key_reg2&(!key_reg1); 
134         end
135 
136     //LEDs output based the encoder‘s motion
137     always @( posedge CLK)                                
138         if(up) 
139             rled<={rled[5:1],rled[6]};               //Leds folw left if clockwise rotation 
140         else 
141             if(down) 
142                 rled<={rled[1],rled[6:2]};
143             else 
144                 if(key_out) 
145                     rled<={rled[5:1],rled[6]};
146     
147     assign Led_out=rled;
148     
149     
150     
151 endmodule

 

verilog之:旋转编码器驱动

标签:

原文地址:http://www.cnblogs.com/tony-ning/p/4974046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!