• ||
    ENCODER LOGIC DESIGN ( UAV 측정장비 개발 )
  • finaldongam 2010/04/15
  •  

  • CPLD를 이용한 엔코더 측정 회로를 설계한다.

    사용 언어는 Verilog HDL을 사용하고, 설계 Tool은 Xilinx ISE11을 사용한다.

     

     엔코더 카운터를 설계하기 위해서 엔코더에 대해서 분석해보면 다음과 같다.

     엔코더의 출력펄스는 A상, B상 두개가 출력된다.(Autonics Rotary Encoder는 3상이지만 Z상은 사용하지 않았다.) A상과 B상은 서로 90degree의 위상차를 가지고 출력된다. A상이 B상보다 먼저 On이 되면 모터는 정회전 상태에 있다고 판단하며, 반대로 B상이 A상보다 먼저 On 되면 모터는 역회전 상태에 있다고 판단한다. 4개의 인터페이스 회로는 엔코더의 출력 펄스를 이용하여 모터의 회전 방향과 회전할 때 출력되는 펄스의 개수를 세도록 만든다.

     엔코더 카운터의 종류에는 여러가지가 있지만 이번에 사용한 방식은 상의 출력을 그대로 출력해주는 1X(1배) 일반 카운터이다. 

     1X Encoder counter 회로도

    1X 카운터는 1개의 D-FF와 2개의 상의 신호만 가지고 구성되는 간단한 로직이다. B상의 신호의 Positive Edge를 카운트하게 되며, 채널 A상과의 순서차이를 이용해서 방향을 결정한다.

    정회전시에는 (A상이 90도 빠를 때) DIR=1 이 되고, 역회전시에는 (B상이 90도 빠를 때) DIR=0이 된다. 

    ISE11툴을 이용해서 설계할 때, Verilog HDL을 사용하지 않고, Schemetic 디자인 기능을 사용해서 FF와 Inverter를 로드해서 회로를 구성한다.

     

    Counter

     1X Encoder Counter에서 출력된 펄스를 카운트 하는 회로이다. 출력 값을 16bit Signed Integer로 만들어주기 위해서 Register를 16bit 크기로 할당하고 DIR 방향에 따라 증감하여 그 값을 출력한다.

     

    module Counter(reset, en_in, en_out);
    input reset;
    input en_in;
    output [15:0] en_out;

    reg [15:0] count = 16'h0;

    always@(negedge reset or posedge en_in)
    begin
    if (reset == 0)
    count <= 16'h0;
    else
    if (en_in == 1)
    count <= count + 1;
    else
    count <= count - 1;
    end

    assign en_out[15:0] = count[15:0];

    endmodule
     
    위와 같이 verilog로 로직을 설계하면 된다. 최상위 비트(15)는 자연스럽게 sign bit로서 작용하게 된다.(CPLD 내부에서는 signed와 unsigned의 의미가 C와 달리 사용자가 의미를 부여하는 것에 달렸다. 즉, register로 선언된 저장 공간의 값은 데이터 형이 정해진 것이 아니라 신호 그 자체이다.)
     
    Latch
     1X Encoder Counter와 Pulse Counter에서 만들어진 데이터는 Atmega128에 바로 전송해서는 안된다. 그 값이 실시간으로 계속 변하기 때문에 특정 저장공간을 마련해 두어서 데이터 전송 도중에는 값의 변동이 없도록 유지해야 한다. 따라서 Latch가 필요하게 된다.
     여기에서 설계된 Latch는 avr128에서 전송된 interrupt 신호를 받으면 저장되는 데이터의 값을 홀드시키고, interrupt 신호가 풀리면 pulse 카운터에서 만들어진 데이터로 실시간으로 업데이트한다.
     여기에서 Latch는 Counter 에 종속적이지만 Counter는 독립적이어야 한다. 그 이유는 데이터를 processor에 전송하는 도중의 데이터 변화를 Latch가 막아서는 안되며 따로 로직에 의해 데이터가 축적되어야 하기 때문이다.
     
    module enLatch(clk, reset, en_in, en_out);
    input clk;
    input reset;
    input [15:0] en_in;
    output [15:0] en_out;

    reg [15:0] temp = 16'h0;

    always@(negedge clk or negedge reset)
    begin
    if(reset == 0)
    temp <= temp;
    else
     if(en_in != temp)
      temp <= en_in;
     else
       temp <= temp;
    end

    assign en_out[15:0] = temp[15:0];

    endmodule

     
    위 로직 회로들을 종합하면 아래와 같은 블럭도로 나타낼 수 있다.
     

  •  
  • TRACKBACK : http://www.swssm.org/trackback.php?id=386
  •  
  •  
  • [prev] ... 11 12 13 14 15 16 17 18 19 20 ... [next]
 
삼성전자 소프트웨어 멤버십
과제 Tech Note 입니다.

최근 글