마이크로칩 PIC16의 구성 가능 로직 블록을 이용한 스테퍼 모터 구동

이번 게시글에서는 그림 1과 같은 스테퍼 모터 제어 예제를 통해 PIC16의 구성 가능 로직 블록 (Configurable Logic Block, CLB)을 설명합니다. CLB를 활용하면 마이크로컨트롤러 주변에 흔히 존재하던 74시리즈와 같은 게이트 수준의 글루 로직 (glue logic)을 통합하거나 대체할 수 있습니다. 그 결과 차지하는 면적은 줄고, BOM도 간소화되어, 전체 비용도 낮출 수 있습니다.

  • CLB 패브릭은 PIC16 마이크로컨트롤러 코어와 독립적으로 동작합니다.
  • 스테퍼 모터 제어에는 하프 스테핑 방식이 사용됩니다.
  • 제어 입력은 방향 (direction)과 활성 (enable) 푸시버튼입니다.
  • 모터는 사용자가 프로그래밍한 고정 속도로 동작합니다.
  • 디지털 로직은 베릴로그로 작성됩니다. 오타가 아닙니다. 이제 PIC16에서도 베릴로그를 사용할 수 있습니다.

이 프로젝트는 PIC16F13145의 베릴로그 설계 기능에 초점을 맞추고 있습니다. 프로젝트 파일은 여기에서 다운로드하십시오: Stepper.X.zip (596.1 KB)

선행 학습 자료

이전 게시글에서는 마이크로칩 PIC16 CLB에 입문하기 위한 시드 프로젝트 (seed project)를 다뤘습니다. 해당 글은 MPLAB MCC 도구를 사용한 I/O 핀 구성 및 간단한 로직 블록 연결과 같은 선행 학습 자료를 제공하기 때문에 계속 진행하기에 앞서 해당 글을 먼저 검토해 보시기 바랍니다.

마이크로칩의 CLB와 CLC를 혼동하지 마십시오

마이크로칩의 구성 가능 로직 블록 (CLB)은 PIC의 구성 가능 로직 셀 (Configurable Logic Cell, CLC)과 혼동하기 쉽습니다. 둘 다 디지털 로직 기능을 제공하며 일부 PIC16 제품군에서 볼 수 있기 때문에 이런 혼동은 자연스러운 일입니다.

PIC16 디지털 로직 주변 장치를 상대적 크기와 기능 관점에서 다음과 같이 구분해 이해하는 것이 도움이 됩니다:


그림 1: 데모 프로젝트에 사용된 스테퍼 모터 구동 회로.

3.3 VDC 전원과 12 VDC 전원을 서로 연결하지 마십시오.

:warning: 그림 1을 보시면, 브레드보드의 상단 레일은 12 VDC에 직접 연결되어 있습니다. PIC의 핀을 이 레일에 연결해서는 안 됩니다. 그렇게 하면 PIC가 타버릴 것입니다.

저도 직접 겪어봤는데, 정말 순식간에 일어납니다. PIC가 폭발하고, PC의 USB 포트까지 손상되면 상황은 더욱 악화됩니다. 두 번 다시 잊기 힘든 값비싼 교훈이 될 수 있습니다.

실험을 재현하기 위해 필요한 부품

그림 1의 스테퍼 모터 데모는 아래 부품들을 사용하여 구성하였습니다 (주요 부품에는 디지키 링크 포함):

  • 마이크로칩 PIC16F13145 마이크로컨트롤러용 Curiosity Nano 평가 키트인 EV06M52A
  • Adafruit 918 단극 스테퍼 모터
  • 모터 권선 플라이백 다이오드
  • 오므론 B3F-1000 택타일 스위치
  • 2N3904 트랜지스터
  • 각 트랜지스터의 베이스에 직렬 연결할 1 kΩ 저항
  • 로직 프로브 대체와 관련된 이 글에서 설명한 저항이 포함된 LED
  • 공급 전원 디커플링 커패시터 (예: 1000 µF 25 VDC)
  • 브레드보드, 전선, 점퍼선
  • 그림에는 표시되지 않은 12 VDC 전원 공급장치

회로 구성

회로를 구성하기 전에 반드시 선행 글을 먼저 읽으시기 바랍니다. 이 글을 통해 회로 구성과 문제 해결을 보다 쉽게 할 수 있는 기본 지식을 갖출 수 있습니다. 이 글을 읽었다면 회로 구성에 아무런 문제가 없을 것입니다. 그림 1과 2에 있는 사진과 함께 그림 3의 회로도를 참고하십시오.


그림 2: 각 모터 권선에 플라이백 다이오드가 병렬로 연결되어 있으며, 각 트랜지스터 베이스에 저항이 직렬로 연결되어 있습니다.

기술 팁: 각 모터 권선에 플라이백 다이오드를 반드시 병렬로 연결해야 합니다. 다이오드를 누락하면 고전압 스파이크가 발생하여 2N3904 트랜지스터를 파손시킬 수 있습니다. 그림 2에서 브레드보드 레일에 연결된 이 다이오드들을 명확하게 확인할 수 있으며, 뒤로는 트랜지스터의 베이스 전류 제한용 저항도 보입니다.


그림 3: 모터 구동에 개별 NPN 트랜지스터를 사용하는 스테퍼 모터 프로젝트의 회로도.

왜 이 데모 프로젝트에 베릴로그를 사용하였나요?

베릴로그를 선택한 이유는 게이트 레벨 표현에 비해 훨씬 빠르고 문제를 해결하기 쉽기 때문입니다. 베릴로그는 다음 상태와 출력 로직을 위해 카르노 맵 (Karnaugh map)을 작성할 필요가 없습니다. 이전에 몇 시간씩 걸렸던 작업을 이제는 몇 분 만에 끝낼 수 있습니다.

동시에, 초보자들이 게이트 레벨 솔루션을 설계할 수 있는 학습 기회를 뺏고 싶지는 않습니다. 베릴로그를 사용하면 최종 결과를 빠르게 보여줄 수 있으니, 그 다음에 시간을 들여 처음부터 다시 수동으로 상태 머신을 구성해 보시기 바랍니다.

개인적인 의견: 베릴로그에는 와우 팩터 (wow factor: 깜짝 놀라게 하는 요소)가 있습니다. 프로그래밍을 처음 시작한 약 25년 전에는 PIC16을 베릴로그로 프로그래밍하게 될 거라고는 전혀 상상도 못했습니다. 다시 얘기드리지만, 당시에는 어셈블리어로 프로그래밍을 하고 있었습니다.

스테퍼 모터 제어 로직을 베릴로그로 프로그래밍하기

그림 4는 탑 레벨 제어 로직에 대한 기술 (description)로, 두 개의 섹션으로 구성되어 있습니다:

  • State: 이 모듈은 푸시버튼으로부터 방향 (dir)과 활성 (enable) 신호를 입력 받으며, 하프 스테핑 시퀀스를 제어하는 3비트 상태 레지스터를 유지합니다. 해당 코드는 목록 1에 있으며, 이 모듈이 3비트 업/다운 카운터로 동작하는 것을 확인할 수 있습니다.
  • StepperOutputs: 이 모듈은 3비트 상태 값을 입력으로 받아 요구되는 출력 신호 (그림 5 참조)를 생성합니다. 해당 코드는 목록 2에 있으며, 핵심 동작이 룩업 테이블 (lookup table) 방식으로 구현된 디코더로 동작하는 것을 확인할 수 있습니다.

문제를 간단히 해결하기 위해 모듈들을 독립적으로 구성하였습니다. State 모듈을 먼저 구성한 후, PIC 출력에 임시로 연결하고 LED를 통해 동작을 검증하였습니다.

마지막으로, 스테퍼 모터 프로젝트는 디지털 로직 패브릭의 약 50%를 사용한다는 점에 유의하십시오.


그림 4: 두 개의 베릴로그 모듈을 보여주는 탑 레벨 로직 기술.

module State(
    input CLK, enable, dir,
    output step_val_2, step_val_1, step_val_0
);

    reg [2:0] step_val;

    assign {step_val_2, step_val_1, step_val_0} = step_val;

    always @(posedge CLK) begin
        if (enable) begin
            if (dir == 1'b0) begin
                step_val <= step_val + 3'b001;   // forward
            end else begin
                step_val <= step_val - 3'b001;   // reverse
            end
        end
    end
endmodule

목록 1: State 모듈의 베릴로그 코드


그림 5: 8개의 개별 출력으로 구동되는 스테핑 모터의 하프 스테핑 구동 파형.

module StepperOutputs(
    input  CLK,
    input  step_val_2, step_val_1, step_val_0,
    output out_3, out_2, out_1, out_0
);

    reg [3:0] step_val;

    assign {out_3, out_2, out_1, out_0} = step_val;

    always @(posedge CLK) begin
        case ({step_val_2, step_val_1, step_val_0})
            3'b000: step_val <= 4'b1000;
            3'b001: step_val <= 4'b1100;
            3'b010: step_val <= 4'b0100;
            3'b011: step_val <= 4'b0110;
            3'b100: step_val <= 4'b0010;
            3'b101: step_val <= 4'b0011;
            3'b110: step_val <= 4'b0001;
            3'b111: step_val <= 4'b1001;
            default: step_val <= 4'b0000;
        endcase
    end
endmodule

목록 2: StepperOutputs 모듈의 베릴로그 코드

글을 맺으며

이 스테퍼 모터 프로젝트는 PIC16의 CLB의 성능을 가늠하는 일종의 기준 역할을 합니다. 이제 우리는 기능, 프로그래밍 스타일, 사용 편의성 측면에서 PIC16으로부터 기대할 수 있는 정도를 알게 되었습니다. 이 기준을 통해 PIC16을 전통적인 74-시리즈 로직이나 다른 HDL 도구들과 비교해 볼 수 있습니다.

감사합니다.

APDahlen

저자의 관련 게시글

이 글을 흥미롭게 읽었다면, 다음 글들도 도움이 될 수 있습니다:

저자 소개

미합중국 해안경비대(USCG) 소령(LCDR)으로 전역한 Aaron Dahlen은 디지키에서 애플리케이션 엔지니어로 근무하고 있습니다. 27년간의 군 복무 동안 기술자 및 엔지니어로서 쌓아온 그 만의 전자 및 자동화에 대한 지식은 12년간의 교단을 통해 (상호 연계되어) 더욱 향상되었습니다. 미네소타 주립대학, Mankato에서 전기공학 석사(MSEE) 학위를 받은 Dahlen은 ABET(Accreditation Board for Engineering and Technology, 미국 공학 기술 인증 위원회) 공인 전기공학 과정을 가르치고, EET(Electrical Engineering Technology, 전기공학 기술) 과정의 프로그램 조정관으로 일했으며, 군 전자 기술자에게 부품 수준의 수리에 대해 가르쳤습니다. 미네소타 주 북부의 집으로 돌아와 이런 류의 연구와 글쓰기를 즐기고 있습니다.



영문 원본: Stepper Motor Drive Using Microchip’s PIC16 Configurable Logic Block