<C7A5C1A6C1F62E687770>

Similar documents
MPLAB C18 C

(Microsoft PowerPoint - \270\266\300\314\305\251\267\316\304\250USB_Host_Device_\272\316\306\256\267\316\264\365\275\307\275\300_Philip.ppt)

ISP and CodeVisionAVR C Compiler.hwp

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

슬라이드 1

슬라이드 1

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - PEB08_USER_GUIDE.doc

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

2. Step 2 : Select Device Step 2 에서는 Device 드롭 - 다운리스트에서사용자가자신의프로젝트에서사용할디바이스를선택할수있다. 선택가능한디바이스의범위를줄이려면디바이스의제품군 (Family) 를먼저선택하는편이좋다. < 그림 > 프로젝트마법사 Se

Microsoft Word - Armjtag_문서1.doc

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PowerPoint 프레젠테이션

Motor Control Solution

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

실험 5

<4D F736F F D D31312D30312D53572D30312DBBE7BFEBC0DABCB3B8EDBCAD5FBFDCBACEB9E8C6F7BFEB2E646F63>

JDK이클립스

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

Install stm32cubemx and st-link utility

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

Studuino소프트웨어 설치

Microsoft PowerPoint - es-arduino-lecture-03

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

목차 다운로드및설치 1. 다운로드 2. 설치 3. MPLAB TM X IDE 데스크탑 기본사용법 1. 새프로젝트만들기 2. 프로젝트속성 (Properties) 조정 3. 디버거, 프로그램, 프로그램언어옵션설정 4. 프로그램언어위치설정 5. 기타툴옵션설정 6. 새파일만들

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft Word doc

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

DE1-SoC Board

슬라이드 제목 없음

KEY 디바이스 드라이버

Microsoft Word - PLC제어응용-2차시.doc

(b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

MAX+plus II Getting Started - 무작정따라하기

Microsoft PowerPoint - ch07 - 포인터 pm0415

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

금오공대 컴퓨터공학전공 강의자료

4S 1차년도 평가 발표자료

PowerPoint 프레젠테이션

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Chapter #01 Subject

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft Word - ICD2PLUS_2003.doc

_USB JTAG Ver1.0 User's Manual.hwp

Microsoft PowerPoint - chap10-함수의활용.pptx

C# Programming Guide - Types

Microsoft PowerPoint - additional01.ppt [호환 모드]

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

PowerPoint Presentation

강의10

금오공대 컴퓨터공학전공 강의자료

Microsoft Word - codevision사용법_pdf버전.docx

Rev V0. Date 0 /0/ PICF 확장형개발보드매뉴얼. 제품소개및특징. 제품소개 < 그림.> PICF 확장형개발보드사진 Microchip사의 비트프로세서인 PICF MCU를이용하여학습및개발을할수있는 PIC 확장형개발보드입니다. 초보자를세심하게배려하기위하여모든부

<C7A5C1A6C1F62E687770>

RealDSP UT 프로그램 메뉴얼

Rev V0. Date 0 /0/ PICFA 확장형개발보드매뉴얼. 제품소개및특징. 제품소개 < 그림.> PICFA 확장형개발보드사진 Microchip사의 비트프로세서인 PICFA MCU를이용하여학습및개발을할수있는 PIC 확장형개발보드입니다. 초보자를세심하게배려하기위하여

tut_modelsim(student).hwp

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

기존에 Windchill Program 이 설치된 Home Directory 를 선택해준다. 프로그램설치후설치내역을확인해보면 Adobe Acrobat 6.0 Support 내역을확인할수 있다.

ATmega128

untitled

BY-FDP-4-70.hwp

11장 포인터

PRO1_09E [읽기 전용]

BMP 파일 처리

01장

Microsoft PowerPoint - ccs33_bios_PRD.ppt [호환 모드]

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

슬라이드 1

슬라이드 1

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft Word - AVRISP mkII 장비 운용.doc

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

ADP-2480

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

윈도우시스템프로그래밍

Microsoft Word - FunctionCall

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

11장 포인터

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

1. 제품소개및특징 1.1 제품소개 < 그림 1.1> AVRISP MK2 USB 개발장비 AVR ISP(In System Programmer)MK2 USB 란 Atmel 사의 AVR 마이크로컨트롤러의내부플래쉬와 EEPROM 에프로그램메모리및데이터를써 (Write, Re

Transcription:

Motor Control 2.3.4.9.1 일반구조체의사용법구조체의사용법에대해알아보자. 다음예와같이 complex라는구조체는 4바이트의실수형데이터 re( 실수부변수 ) 와 im( 허수부변수 ) 즉, 8바이트로구성이되며구조체 a라는이름으로메모리영역에할당하게된다. 또한, main() 함수에서상기 complex라는구조체의형태로 8바이트로구성된구조체 b를메모리영역에할당하게된다. 여기에서는구조체의각구성요소는동일한데이터형으로선언하였다. 2.3.4.9.2 typedef 구조체의사용법 typedef으로구조체를선언하게되면, 앞절의일반구조체선언과는달리단순히구조체사용을위한프로토타입으로만사용된다. 즉, 자체만으로는메모리에데이터할당을하지않는다는뜻이다. 128

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 2.3.4.9.3 다중구조체사용법다음예와같이구조체는다른구조체를포함해서선언될수있다. 이경우다중구조체인구조체 line의사용은다음과같이할수있다. 사용법 struct line myline; // Declare variable myline.a.x = 2.0; myline.a.y = 3.3; 2.3.4.9.4 구조체에서의배열과포인터사용법데이터집합및문자의집합인문자열을액세스할때매우유용하게사용될수있는배열및포인터를다음예에서와같이구조체의멤버로사용하면편리하고강력한기능을발휘할수있게된다. 아래예에서문자형포인터변수 B는구조체생성시문자열이저장된어드레스를가리키는용도로사용이되며, 실제문자열을선언할때생성되는메모리의시작어드레스를가리키게되는것이다. 따라서이문자열은구조체내에존재하는것이아니고메모리의어딘가에할당될것이며, 할당된문자열의시작주소를참조하는포인터변수가구조체의포인터변수인 B가되는것이다. 129

Motor Control 그러면, 포인터를이용하여구조체를액세할수있을까? 물론가능한다. 다음예에서와같이포인터의데이터형을구조체로선언하게되면포인터를이용하여구조체는물론, 구조체의각멤버들을참조할수있다. 참고로, 구조체를참조하는연산자는 이다. 2.3.4.9.5 구조체실습앞절에서수행했던것과동일한방법으로 Demo11라는프로젝트를만들어보자. 130

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo11 입력 - Project Directory : C:\Temp\Demo11 입력 - OK 버튼클릭 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo11.c 입력후저장버튼클릭 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 131

Motor Control - C:\Temp\Demo11\Demo11.c 선택후열기 (Open) 버튼클릭 8. C 소스코드입력이제에디터윈도우의 Demo11.c 파일에다음과같이실습할 C 소스코드를입력하자. //#include <p24fj128ga010.h> #include <stdio.h> typedef struct int re; int im; } complex; //Data types within a structure do NOT need to be the same complex x; complex *p; int main(void) x.re = 2; x.im = 5; printf("x = %d + j%d\n", x.re, x.im); p = &x; p re = 7; p im = 3; //Pointer to a structure //Accessing structure members via a pointer printf("x = %d + j%d\n", x.re, x.im); } while(1); 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib 132

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 10. MPLAB SIM 설정 EE. Menu Debugger Select Tool MPLAB SIM 클릭 FF. Menu Debugger Settings 클릭 GG. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All HH. Menu Project Build All 클릭 (Ctrl + F10) II. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Output Window에서출력값확인 133

Motor Control 2.3.4.9.6 공용체 (Union) 실습공용체 (Union) 의가장큰특징은동일한특정데이터공간을서로다른데이터형으로사용할수있다는점에서구조체와구분된다. 공용체에서는사용된멤버의데이터형중에서가장큰사이즈의데이터형이공용체의데이터사이즈가된다. 다음실습을통해서공용체에대해알아보자. 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo12 입력 - Project Directory : C:\Temp\Demo12 입력 - OK 버튼클릭 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo12.c 입력후저장버튼클릭 134

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 - C:\Temp\Demo12\Demo12.c 선택후열기 (Open) 버튼클릭 8. C 소스코드입력이제에디터윈도우의 Demo12.c 파일에다음과같이실습할 C 소스코드를입력하자. //#include <p24fj128ga010.h> #include <stdio.h> typedef union char a; int b; float c; } jampack; jampack x; int main(void) x.a = 0xFF; x.b = 0x55AA; x.c = 2136.512; } while(1); 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 135

Motor Control 10. MPLAB SIM 설정 JJ. Menu Debugger Select Tool MPLAB SIM 클릭 KK. Menu Debugger Settings 클릭 LL. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All MM. Menu Project Build All 클릭 (Ctrl + F10) NN. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. Watch 변수설정 - Menu View Watch 클릭 - Symbol Name에변수 x 추가 13. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Menu Debugger Halt(F5) 클릭 C. Watch 윈도우의공용체 x의각멤버들의주소및값확인 136

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 2.3.4.9.7 비트필드 (Bit Fields) 비트필드는구조체의특수한형태로써구조체의멤버를비트단위로메모리할당을하기위해사용하며이방법은임베디드프로그래밍에서매우유용한기능을발휘하게된다. 마이크로컨트롤러의데이터시트를보면, 8비트또는 16비트 SFR(Special Function Register) 은각비트마다특정명칭과함께그기능이명시되어있다. C언어에서가장작은데이터형은 8비트 (1바이트) 메모리사이즈를갖는문자형 (char) 변수이므로, 비트단위로변수를할당할수없게된다. 이러한경우비트필드를이용하게되면 1바이트의메모리에비트단위로최대 8개의멤버를선언할수있게된다. 137

Motor Control 비트필드사용예 typedef struct tagmybitfield BitfieldA: 1; BitfieldB: 1; BitfieldC: 3; BitfieldD: 1; BitfieldE: 2; } MyBitField; 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo13 입력 - Project Directory : C:\Temp\Demo13 입력 - OK 버튼클릭 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 138

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo13.c 입력후저장버튼클릭 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 - C:\Temp\Demo13\Demo13.c 선택후열기 (Open) 버튼클릭 8. C 소스코드입력이제에디터윈도우의 Demo13.c 파일에다음과같이실습할 C 소스코드를입력하자. //#include <p24fj128ga010.h> #include <stdio.h> typedef struct char bit0: 1; char bit1: 1; char bit2: 1; char bit3: 1; char bit4: 1; char bit5: 1; char bit6: 1; char bit7: 1; } bitfield; bitfield x; char y = 0; bitfield z; int main(void) x.bit0 = 1; 139

Motor Control x.bit6 = 1; x.bit7 = 5; //x = 0xAA; //No error here only LSb used //This cannot be done with a bit field //y = (char)x; //This doesn't work either z = x; } while(1); 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 10. MPLAB SIM 설정 OO. Menu Debugger Select Tool MPLAB SIM 클릭 PP. Menu Debugger Settings 클릭 QQ. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All RR. Menu Project Build All 클릭 (Ctrl + F10) SS. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. Watch 변수설정 - Menu View Watch 클릭 - Symbol Name에변수 x, y, z 추가 140

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 13. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Menu Debugger Halt(F5) 클릭 C. Watch 윈도우의공용체 x, y, z의각비트필드주소및값확인 141

Motor Control 2.3.4.10 나열형 (Enumerated) 변수나열형변수는나열된정수형상수를저장하기위한변수로취급되며, 데이터사이즈는 2 바이트이다. 또한나열된상수는놓여진순서에의해 1씩증가된값으로자동할당된다. 다음예를살펴보자. 위의예제에서보듯이나열된정수형상수 RED는 1 로할당을했기때문에 GREEN과 BLUE라는상수는각각 2, 3 의정수값을갖는상수로취급된다. 하지만컴파일러는이들상수에대해서는메모리할당을하지않고, 단지 RED, GREEN, BLUE라는상수값을참조만할뿐이다. 다음은나열형상수값을갖는나열형변수 pixel을만드는두가지표현이다. 아래예에서는위와는달리 pixel이라는 2바이트정수형변수를메모리에할당하게되며, 할당된메모리에상수를저장하는예이다. 궁금하신분은 MPLAB IDE에서 watch 윈도우를통해확인을해보길권한다. 142

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 2.3.4.11 C30 컴파일러의속성 (Attribute) MPLAB C30는 attribute 키워드를이용하여컴파일러로하여금특정변수또는함수에대해특정속성을갖도록할수있다. 사용법은 attribute 키워드후에이중괄호즉, (( )) 안에속성을삽입하면된다. 그럼 C30 컴파일러의속성에대해살펴보자. 2.3.4.11.1 변수선언속성매크로다음매크로는 C30 컴파일러에서특정메모리를특정메모리영역에할당하도록선언하기위한옵션을매크로를이용하여간략히표현할수있다. 참고로인자 N는 2의제곱값즉, 2, 4, 6,... 값중하나를이용해서표현해야한다. 2.3.4.11.2 변수선언속성매크로사용예매크로선언을이용하여특정메모리에변수를할당하기위한예를살펴보자. 정수형데이터 16 개를갖는배열을 32 바이트어드레스에정렬되도록하기위한선언 int _XBSS(32) xbuf[16]; 특별한정렬옵션없이 EEPROM 에정수형배열을할당하기위한선언 int _EEDATA(2) table1[] = 0, 1, 1, 2, 3, 5, 8, 13, 21}; 디바이스가리셋될때변수의값을초기화하지않고기존값을유지하기위한선언 int _PERSISTENT var1, var2; 143

Motor Control 특정어드레스에변수를할당하기위한선언 [C30 사용시 ] int attribute ((address(0x900))) buf1[128]; [Assembly 사용시 ].section *,address(0x900),bss,near.global _buf1.align 2 _buf1:.space 256 2.3.4.11.3 함수선언속성 C30 컴파일러에서다음예와같이변수와유사하게특정함수도특정어드레스에할당할수있다. [ C30 사용시 ] void attribute ((address(0x2000))) func() } [ Assembly 사용시 ].section _func: return *,address(0x2000),code.global _func.align 2 2.3.2.11.4 프로그램메모리에상수할당옵션 (space(psv)) 프로그램메모리의특정영역에상수를할당하기위해서는다음과같이 space(psv) 속성을사용하여상수값들이 PSV 영역에할당되도록선언해야한다. [ C 언어사용시 ] const unsigned attribute ((space(psv), address(0x2000))) table[10] = 0,1,2,3,4,5,6,7,8,9}; 144

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 [ Assembly 사용시 ].section _table: *,address(0x2000),psv.global _table.align 2.word 0,1,2,3,4,5,6,7,8,9 2.3.4.11.5 데이터메모리에상수할당옵션데이터메모리의특정영역에상수를할당하기위해서는다음과같이 space(data) 속성을사용하여상수값들이데이터메모리영역에할당되도록선언해야한다. [ C 언어사용시 ] const unsigned attribute ((space(data), address(0x900))) table[10] = 0,1,2,3,4,5,6,7,8,9}; [ Assembly 사용시 ].section _table: *,address(0x900),data.global _table.align 2.word 0,1,2,3,4,5,6,7,8,9 2.3.4.11.6 EEPROM 에데이터할당처음에설명한매크로를이용하여 EEPROM 매모리에변수를할당하기위해서는 EEDATA(align) 매크로를이용하여다음과같이사용할수있다. unsigned int _EEDATA(2) Table2[4] = 0x1234, 0x5678, 0x9ABC, 0xDEF0}; 여기에서정렬 (alignment) 옵션으로사용한 _EEDATA(2) 는워드 (2바이트) 단위로데이터를쓰고지우기를하겠다는것을의미한다. 다음과같이선언했을경우를살펴보자. 145

Motor Control unsigned int _EEDATA(32) Table1[16] = 0}; 이경우, 정수형데이터 16 개를초기값 0 로총 32 바이트를할당하기위해 _EEDATA(32) 를이용하였으며, 이경우프로그래밍알고리즘을이용하여 32바이트를쓰고지울수있게된다. 2.3.4.11.7 메모리할당실습 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo14 입력 - Project Directory : C:\Temp\Demo14 입력 - OK 버튼클릭 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 146

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo14.c 입력후저장버튼클릭 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 - C:\Temp\Demo14\Demo14.c 선택후열기 (Open) 버튼클릭 8. C 소스코드입력이제에디터윈도우의 Demo14.c 파일에다음과같이실습할 C 소스코드를입력하자. #include <p24fj128ga010.h> #include <stdio.h> // Locate a constant in program memory const unsigned attribute ((space(psv), address (0x2000))) table[10] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Locate a variable in data memory int attribute ((address(0x900))) x = 5; // Locate a function in program memory // Attribute must be included in function prototype at a minimum to // locate the functionat a specific address int attribute ((address(0x2100))) square(int a); int main(void) int y, i; y = square(x); for (i = 0; i < 10; i++) printf("table[%d] = %d\n", i, table[i]); } 147

Motor Control } while(1); // Attribute need not be included here as long as it is present in the function prototype // int attribute ((address(0x2100))) square(int a) int square(int a) return (a * a); } 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 10. MPLAB SIM 설정 TT. Menu Debugger Select Tool MPLAB SIM 클릭 UU. Menu Debugger Settings 클릭 VV. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All WW. Menu Project Build All 클릭 (Ctrl + F10) XX. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. Watch 변수설정 - Menu View Watch 클릭 - Symbol Name에변수 x, y, table 추가 148

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 13. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Menu Debugger Halt(F5) 클릭 C. Output Window에서출력값확인 D. Watch 윈도우의변수 x, y, table의메모리어드레스및값확인 * Watch 윈도우에서배열 table 의어드레스에표시된마크 P 는프로그램메모리의어드레스임을말해주는것이다. 149

Motor Control 2.3.4.12 C30 컴파일러의 I/O 포트액세스 C30 컴파일러에서는 I/O 포트의이름을이용하여포트전체를액세스할수있으며, 또한구조체를이용하여 I/O 포트의특정비트도액세스할수있다. 이들 I/O 포트변수들은헤더파일에서각각정의되어있으며, 링커가각각의메모리영역에맵핑해주고있다. 디바이스헤더파일중 P24FJ128GA010.h 파일을열어보면다음과같이 PORTD에대해서구조체를이용하여각비트를선언한것을볼수있을것이다. 또한링커스크립트파일인 P24FJ128GA010.gld 파일을열어보면다음과같이 I/O 포트변수들의어드레스를선언한것을볼수있을것이다. 이들어드레스는데이터시트의 PORTD 어드레스와동일한값을가지고있다. 따라서이들 I/O 포트변수를이용하여프로그래밍이가능하게되고, 또한이들값들은실제디바이스의해당포트의입 / 출력값과매칭될수있게되는것이다. 150

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 [ I/O 포트변수예 ] PORTA PORTD [ I/O 포트의비트예 ] PORTDbits.RD0 _RD0 2.3.4.12.1 I/O 포트프로그래밍실습 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo15 입력 - Project Directory : C:\Temp\Demo15 입력 - OK 버튼클릭 151

Motor Control 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo15.c 입력후저장버튼클릭 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 - C:\Temp\Demo15\Demo15.c 선택후열기 (Open) 버튼클릭 8. C 소스코드입력이제에디터윈도우의 Demo15.c 파일에다음과같이실습할 C 소스코드를입력하자. #include <p24fj128ga010.h> #include <stdio.h> int main(void) TRISD = 0x0000; PORTDbits.RD0 = 1; } while(1); 152

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 10. MPLAB SIM 설정 YY. Menu Debugger Select Tool MPLAB SIM 클릭 ZZ. Menu Debugger Settings 클릭 AAA. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All BBB. Menu Project Build All 클릭 (Ctrl + F10) CCC. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. Watch 변수설정 - Menu View Watch 클릭 - Symbol Name에변수 TRISD, PORTD 추가 13. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Menu Debugger Halt(F5) 클릭 C. Watch 윈도우의변수 PORTD, TRISD의메모리어드레스및값확인 153

Motor Control 2.3.4.13 인터럽트함수 (Interrupt Service Routine) 2.3.4.13.1 인터럽트함수의프로토타입및선언 C30 컴파일러에서인터럽트함수는다음과같이인터럽트속성을이용하여함수의이름을미리선언해주어야한다. 이선언문은컴파일러를통해자동으로해당인터럽트함수의어드레스를인터럽트벡터테이블에할당하게된다. void attribute ((interrupt)) _INT0Interrupt(void); 인터럽트함수로들어갈때스택저장 (PUSH.S) 및인터럽트로부터빠져나올때스택복귀 (POP.S) 를사용하기위해서는인터럽트함수의선언을다음과같이 shadow 속성을이용해서컴파일러에게알려주어야한다. void attribute ((interrupt, shadow)) _INT0Interrupt(void); 변수및레지스터의저장이컴파일러에의해자동으로처리되지않도록하기위해서는인터럽트속성에다음과같이 save 속성을추가해야한다. 이경우, 인터럽트함수로들어갈때및나올때특졍변수 (var1, var2) 를자동으로저장및복귀할수있도록컴파일러가지원하게된다. void attribute ((interrupt(save(var1, var2)))) _INT0Interrupt(void); 2.3.4.13.2 인터럽트함수의매크로인터럽트함수의속성인 attribute 사용이불편하다면다음과같이매크로를이용하여간단한표현으로대체할수있다. 이들매크로는디바이스헤더파일에이미선언되어있으므로바로사용이가능하다. [ 매크로선언예 ] #define _ISR attribute ((interrupt)) #define _ISRFAST attribute ((interrupt, shadow)) 154

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 [ 매크로사용예 ] void _ISR _INT0Interrupt(void); 위에서매크로 _ISR은 attribute ((interrupt)) 와동일한표현이며축약형이라말할수있다. 2.3.4.13.3 인터럽트실습외부인터럽트 INT0를사용한예제를보여주고있다. 인터럽트함수가호출되기위해서는인터럽트플래그비트인 IFS0bits.INT0IF 가 1 로세트 (set) 되어야한다. #include <p24fj128ga010.h> #include <stdio.h> void attribute ((interrupt)) _INT0Interrupt(void) static int count = 0; // Count number of times interrupt has occurred // Static variable retains its value across function calls } IFS0bits.INT0IF = 0; // Clear interrupt flag count++; // Increment interrupt count printf("int0 interrupt has occurred. (%d)\n", count); int main(void) // Setup Interrupts INTCON1bits.NSTDIS = 1; INTCON2bits.INT0EP = 0; IPC0bits.INT0IP = 7; IFS0bits.INT0IF = 0; IEC0bits.INT0IE = 1; // Disable nested interrupts // Interrupt on positive edge // Set interrupt priority (3 bit field) // Clear interrupt flag // Enable INT0 interrupt } // Wait for interrupt event while(1); 155

Motor Control 절차 1. MPLAB IDE 실행 2. 디바이스선택 - Menu Configure Select Device 클릭 - Select Device 윈도우 : Device PIC24FJ128GA010 선택 - OK 버튼클릭 3. 프로젝트생성 - Menu Project New 클릭 - Project Name : Demo16 입력 - Project Directory : C:\Temp\Demo16 입력 - OK 버튼클릭 4. C30 컴파일러선택 - Menu Project Select Language Toolsuit : MPLAB C30 선택 5. 디바이스링커스크립트파일추가 - 프로젝트매니저윈도우의 Linker Scripts 폴더에서마우스우측버튼클릭 Add Files... 항목선택 - p24fj128ga010.gld 파일클릭후열기 (Open) 버튼클릭 * 링커스크립트파일위치 : C:\Program Files\Microchip\MPLAB C30\Support\gld 6. C 소스코드생성하기 - Menu File New 클릭 - Menu File Save As 클릭 - 파일이름 : Demo16.c 입력후저장버튼클릭 7. 프로젝트에 C 소스코드추가 - 프로젝트매니저윈도우의 Source Files 폴더에서마우스우측버튼클릭 Add Files 선택 - C:\Temp\Demo16\Demo16.c 선택후열기 (Open) 버튼클릭 156

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 8. C 소스코드입력이제에디터윈도우의 Demo16.c 파일에다음과같이실습할 C 소스코드를입력하자. #include <p24fj128ga010.h> #include <stdio.h> void attribute ((interrupt)) _INT0Interrupt(void) static int count = 0; // Count number of times interrupt has occurred // Static variable retains its value across function calls } IFS0bits.INT0IF = 0; // Clear interrupt flag count++; // Increment interrupt count printf("int0 interrupt has occurred. (%d)\n", count); int main(void) // Setup Interrupts INTCON1bits.NSTDIS = 1; INTCON2bits.INT0EP = 0; IPC0bits.INT0IP = 7; IFS0bits.INT0IF = 0; IEC0bits.INT0IE = 1; // Disable nested interrupts // Interrupt on positive edge // Set interrupt priority (3 bit field) // Clear interrupt flag // Enable INT0 interrupt } // Wait for interrupt event while(1); 9. Build Option 설정 - Menu Project Build Options Project 선택 - Menu Project Build Options Project General : Library Path 설정 : C:\Program Files\Microchip\MPLAB C30\lib - Menu Project Build Options Project MPLAB LINK 30 : Heap Size : 256 입력 10. MPLAB SIM 설정 DDD. Menu Debugger Select Tool MPLAB SIM 클릭 157

Motor Control EEE. Menu Debugger Settings 클릭 FFF. Menu Debugger Settings Uart1 IO 클릭 : Enable Uart1 IO, Rewind Input, Window 선택 11. Build All GGG. Menu Project Build All 클릭 (Ctrl + F10) HHH. Output Window Build 탭에서메시지확인 : BUILD SUCCEEDED 확인 12. Watch 변수설정 III. Menu View Watch 클릭 JJJ. Symbol Name에 IPC0, IFS0, count 추가 13. Build Configuration 설정 - Debug로설정 14. Break Point 설정 A. MPLAB IDE Editor 윈도우 main.c 파일활성화 B. IFS0bits.INT0IF = 0 코드라인에브레이크포인트설정 ( 마우스좌측버튼더블클릭 ) 158

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 15. MPLAB SIM 실행 A. Menu Debugger Run (F9) 클릭 B. Menu Debugger Halt(F5) 클릭 16. 레지스터값입력 - Watch 윈도우의레지스터 IFS0의값에 1 입력 17. MPLAB SIM 재실행 - 방법1 : Menu Debugger Run(F9) 클릭 - 방법2 : Menu Debugger Step Into(F7) 클릭 : 한라인씩실행명령 - 방법3 : Debugger Toolbar 이용 18. Watch 윈도우확인 - Watch 윈도우의변수 count 값변화확인 19. 반복 - 14~17번과정반복실행 - Watch 윈도우의변수 count 값변화확인 159

Motor Control 2.4 PIC 용하이텍 (HI-TECH) PICC C 언어프로그래밍 2.4.1 하이텍 (HI-TECH) C 컴파일러소개 마이크로칩에서는 8비트, 16비트, 32비트용 C 컴파일러를다른컴파일러개발회사와공동으로개발하여더많은리소스들을확보하고있다. 마이크로칩본사에서지원하는 C 컴파일러는 PIC18용인 C18 컴파일러와 16비트용인 C30, 32비트용인 C32등을개발하였다. 그러나 PIC10/12/16 등의 8비트디바이스들은마이크로칩에서는지원하지않는다. 그로인해, PIC10/12/16 등의 8비트디바이스를지원하는 C 컴파일러는지금소개하는하이텍 (HI-TECH) C 컴파일러나 CCS-C 컴파일러, 그리고 IAR C 컴파일러등이있다. ( 본사웹사이트참조 www.microchip.com : Design [Development Tools] -> Software [PIC10/12/16 Compilers] ) 하이텍 (HI-TECH) C 컴파일러는다음과같은기능을가지고있다. - ANSI C 표준컴파일러 ( 다른 ANSI 표준 C 컴파일러로쉽게포팅가능 ) - 신뢰성높은컴파일링및빌드 - 다양한 C 컴파일링최적화레벨제공 - C 컴파일러에최적화된에셈블러내장 - 최소 RAM 사용을위한지역변수중첩기능이포함된풀링커 (Linker) - 소스코드와함께제공되는 C 라이브러리제공 - 24-bit and 32-bit IEEE 플로우팅포인트연산기능및 32-bit long 데이터지원 - C 언어와어셈블러혼용사용가능 - 무제한소스파일개수빌드가능 - 어셈블러리스트파일보기기능지원 - 마이크로칩개발툴과완벽한호환및통합개발가능 - 다양한 OS 지원 (Windows (up to Vista64), Linux, Mac OS X) www.htsoft.com 에가면하이텍 C 컴파일러에대한여러정보를더자세히알수있다. 또한, 아래그림과같이하이텍 C 컴파일러는 PIC 디바이스별여러버전으로지원하고있다. 160

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 이교재에서는 3 장과 4 장에서실습할 PIC 디바이스가 PIC16F887 이기때문에 PIC10/12/16 MCU Family STD Compiler를선택한다. 정품라이센스버전은 45일간데모판으로사용가능하다. 2.4.2 하이텍 (HI_TECT) C 컴파일러설치하기 2.4.2.1 하이텍 (HI-TECH) PICC-Lite v9.60pl2 컴파일러설치하기 이버전은무상으로설치되는컴파일러로아래와같은버전이있다. 161

Motor Control 그리고, 이프리버전컴파일러는무상인만큼아래표와같은제약사항이있다. 지원하는디바이스는 12F629/675, 16C84, 16F627/684/690/84A/877/887/917 등이있다. 이번교재에서실습할 PIC 디바이스가 PIC16F887 이므로이디바이스에대한제한사항 (Limitations) 를보면두개의램뱅크를사용가능하고, 프로그램사이즈는 2K바이트를못넘게되어있다. 2 RAM 뱅크제한의의미는, 뱅크당보통 256바이트공간이므로, 최대변수크기가 512바이트를못넘는다는의미이다. 이번실습에서는 2K바이트롬영역과 512바이트램영역이면충분하므로 3, 4장실습에서는이프리버전인 Lite 버전을사용한다. 1. 하이텍 (HI-TECH) PICC-Lite 버전다운로드하기 이하이텍 PICC-Lite 프리버전을다운로드하는방법은두가지가있다. 1) MPLAB IDE 8.02( 최신버전 ) 을설치하면자동으로설치된다. (www.microchip.com에서 Design [MPLAB IDE] 에서다운로드받는다 ) 2.1.3 MPLAB IDE 통합개발툴설치하기 를참조하여순서대로설치한다. MPLAB IDE를설치하면끝이므로이다음과정은무시한다. 2) 하이텍 C 컴파일러회사웹사이트에서다운로드받아설치한다. ( 웹주소는 http://microchip.htsoft.com/products/compilers/picclite.php이고, 회사 162

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 사정상웹주소가바뀔수도있다 ) 라이센스정품과프리버전과의차이점은다음표와같다. 2. 하이텍 PICC-Lite 또는 PICC STD(v9.60PL2) 컴파일러설치하기 163

Motor Control <Step 1> 다운로드받은 PICC V9.xxPLx setup.exe 또는 PICC-Lite xxx.exe 실행파일을클릭한다. (PICC-Lite 버전은 MPLAB IDE 최신버전을설치할때이미설치가되므로이후순서는 PICC STD 정품라이센스버전을설치한다. 라이센스가없을시에는 45일간데모버전으로사용이가능하다.) <Step 2> 설치시작화면이나오면 Next 버튼을클릭한다. <Step 3> - 정품라이센스 STD 버전을구입하였으면, Activate Serial Number를체크하고 Off-Line은체크하지않는다. - 데모버전을 45일간사용시에는 Activate demo with xx day evaluation license를체크하고, Off-Line도체크한다. Next 버튼클릭한다. 164

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 4> 라이센스체크박스에클릭하여동의한다. Next 버튼클릭한다. <Step 5> MPLAB IDE와연동하는체크박스와 HI-TIDE 환경설정체크박스및설치폴더를지정한다. ( 디폴트폴트위치를권장 ) <Step 6> 설치언어 English 설정과 Add to environment path 체크박스에체크한다. Next 버튼클릭한다. 165

Motor Control <Step 7> 설치과정 <Step 8> HI-TIDE 툴설치및설치과정. Next 버튼클릭한다. <Step 9> 설치완료 Finish 버튼클릭한다. 166

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 2.4.3 하이텍 (HI-TECH) PICC 컴파일러시작하기 하이텍 C 컴파일러를설치하면, C:\Program Files\HI-TECH Software\PICC\9.xx ( 디폴트디렉토리 ) 또는 C:\Program Files\HI-TECH Software\PICC\LITE\9.xx ( 디폴트디렉토리 ) 안에 \docs 라는하위폴더안에 manual.pdf 파일이있다. 이파일이하이텍 C 컴파일러유저가이드이므로필히참고하기를바란다. 1. MPLAB IDE 새프로젝트만들기 <Step 1> - MPLAB IDE 프로그램을실행한다. ( 바탕화면 MPLAB IDE 아이콘또는시작-> 모든프로그램 -> Microchip -> MPLAB IDE v8.xx ->MPLAB IDE 를클릭한다.) <Step 2> - 우측메인윈도우화면에서 Project 메뉴를선택한뒤 Project Wizard( 프로젝트만들기마법사 ) 하위메뉴를클릭한다. <Step 3> 프로젝트시작윈도우화면나타남. Next 버튼클릭한다. 167

Motor Control <Step 4> 프로젝트에사용할디바이스선정화면 PIC16F887로선정한다. 다음 (Next) 버튼클릭한다. 이책에서실습할 PIC 마이컴이 PIC16F887이므로이렇게설정되었다. 다른 PIC을사용시에는사용할 PIC 디바이스명으로설정하면된다. <Step 5> 하이텍 PICC 또는 PICC-Lite 컴파일러툴설정한후, 다음 (Next) 버튼클릭한다. ( 만약, 다른디렉토리에설치하였다면, Location 란의 Browse 버튼을클릭하여설치한다른디렉토리로설정한다 ) <Step 6> 새프로젝트디렉토리 ( 폴더 ) 만들기 Create New Project File 란에 Browse 버튼클릭하여원하는폴더만들거나지정한다.( 단, 한글이나특수문자로된폴더로만들기또는지정하는것이금지한다 ) 다음 (Next) 버튼을클릭한다. 168

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 7> 기존에이미있는파일등을추가하기. ( 추가할파일등이없으면그냥통과 ) 다음 (Next) 버튼을클릭한다. <Step 8> 마지막으로만들어진새프로젝트에대한요약내용보여주기마침 (Finish) 버튼을클릭한다. 자, 이제아래그림과같이새프로젝트가만들어진 MPLAB IDE 통합개발환경윈도우가나타난다. 이윈도우안에아무런창이안보일경우에는 View 메뉴를클릭하면 Project 와 Output 하위메뉴를둘다클릭한다. 169

Motor Control 이제새프로젝트만들기가우측그림과같이완료되었다. <Sub-Step 1> 만약 PIC 디바이스명을다른디바이스로바꾸고싶다면, 메뉴바에서 Configure를클릭하여, 팝다운메뉴에서 Select Device를클릭한다. Select Device 윈도우에서 Device와 Device Family에서원하는 PIC을재선정한다. 또한, 원하는디바이스를선택하면, 그아래에있는신호등색깔이해당개발툴이지원하는지안하는지알수있다. ( 초록색 : 지원가능, 노란색 : 개발중이거나부분지원가능, 빨간색 : 지원불가 ) 170

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Sub-Step 2> PIC의컨피그레이션비트설정을소스코드파일안에서설정하지않고 MPLAB IDE 프로젝트윈도우에서설정하려고하면, 메뉴바에서 Configure 클릭하여, 팝다운 Configuration Bits 메뉴를클릭한다. Configuration Bits 창에서검은색원표시에있는체크박스에체크하면 Configuration Bits 설정을코드안에컨피그레이션매크로로설정하고, 체크하지않으면현재설정창에서설정한다. 만약체크하지않고사용하다가디바이스가바뀔경우에는이설정이재설정됨으로기존설정을잃어버리는문제가발생한다. 또한, 프로그래머 ( 라이터 ) 로프로그래밍 ( 굽기 ) 시에도이컨피그레이션비트설정이되지않는다. 따라서다음에나올새프로그램코딩하기에매크로설정부분을코드에삽입하는방법에대해설명하였으므로항상습관처럼컨피그레이션비트설정을매크로로코드에같이프로그래밍하길추천한다. 2. 새프로그램코딩하기 ( 하이텍 PICC 컴파일러 : C 언어프로그래밍 ) 이제새프로젝트안에 PIC 마이컴 ( 디바이스,MCU) 용프로그램인펌웨어를하이텍 C 컴파일러가지원하는 C 언어로작성한다. 프로그래머에따라여러가지형식으로 C 언어를사용할수있고, 다른에디터로프로그램코딩을할수도있다. 여기서는가장기본적인방법으로진행한다. 새프로젝트만들기가완료가된후, 171

Motor Control <Step 1> 새에디터창열기 File 메뉴에서 New를클릭하거나, New File 버튼클릭 ( 원으로표시된아이콘클릭 ) 한다. <Step 2> 아래와같이에디터창안에서 C 코딩하기 ( 프로그램만들기 ) #include <pic.h> CONFIG(INTIO & DEBUGEN & MCLREN & WDTDIS); unsigned char a; void main(void) unsigned int b; a=0; b +=(unsigned int) a; while(1); } [ 코드설명 ] #include <pic.h> 위의선언은 PIC디바이스설정에관한 include문이다. #include "pic16f877.h" 라고해도되지만, MPLAB IDE에서새프로젝트만들기에서이 미디바이스를 PIC16F877로설정하였기때문에, 하이텍 PICC 컴파일러폴더에 C:\Program Files\HI-TECH Software\PICC\LITE\9.60\include에보면 pic.h 파일 이있다. 이파일을열어보면, 아래와같이선정된각디바이스마다 include문에 #if defined(_16f882) defined(_16f883) defined(_16f884) \ defined(_16f886) defined(_16f887) #include <pic16f887.h> #endif 172

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 #if defined(_ 디바이스명 ) ~ (#elif ~) #endif으로정의되어있어서굳이 #include "pic16f877.h" 하지않아도된다. 또한, 장점은 #include "pic16f877.h" 으로 include 해버리면나중에디바이스가 PIC16F84로바뀌었을때일일이 #include "pic16f84.h" 로수정해야한다. 이런번거로움이사라진다. 또한, #include <htc.h> 로가능하다. 하이텍 PICC 컴파일러폴더에 C:\Program Files\HI-TECH Software\PICC\LITE\9.60\include\ htc.h 파일을열어보면, 아래와같이각하이텍컴파일러 ( 디바이스지원 ) 버전별로구분하고, PIC16 계열은 pic.h 파일이 include 된다. /* HI-TECH PICC / PICC-Lite compiler */ #if defined( PICC ) defined( PICCLITE ) #include <pic.h> #endif /* HI-TECH PICC-18 compiler */ #if defined( PICC18 ) #include <pic18.h> #endif /* HI-TECH dspicc compiler */ #if defined( DSPICC ) #include <dspic.h> #endif... CONFIG(INTIO & DEBUGEN & MCLREN & WDTDIS); 위선언은 PIC의컨피그레이션비트설정매크로이다. 기본매크로형은 CONFIG(@@@ & @@@@ & @@@ &... ); 이다. 매크로입력인자들은각 PIC의데이터쉬트 Special Features of the CPU라는장에나오는설정부분과매칭이되어있다. 주로 PIC의동작환경설정으로정확한설정이이 173

Motor Control 루어지지않으면클럭발진도안할수도있다. 매크로입력인자값들은각디바이스의헤더파일끝부분에자세히나와있다. 예를들어, PIC16F887 경우에 C:\Program Files\HI-TECH Software\PICC\LITE\9.60\include 폴더에서 pic16f887.h 파일을열어보면, 아래와같은컨피그레이션비트설정매크로입력인자들이있다. 디자인한하드웨어특성에맞게설정해야한다. // Configuration Mask Definitions #define CONFIG_ADDR 0x2007 // Oscillator #define EXTCLK 0x3FFF // 외부 RC 클럭사용및클럭출력핀으로클럭출력 #define EXTIO 0x3FFE // 외부 RC 클럭사용및클럭출력핀으로출력안함 #define INTCLK 0x3FFD // 내부 RC 클럭사용및클럭출력 #define INTIO 0x3FFC // 내부 RC 클럭사용및클럭출력안함 #define EC 0x3FFB // 오실레이터클럭입력 (EC모드) #define HS 0x3FFA // 외부 10MHz이상크리스탈발진모드 (HS모드) #define XT 0x3FF9 // 외부 10MHz 이사크리스탈발진모드 (XT모드) #define LP 0x3FF8 // LP // Watchdog Timer #define WDTEN 0x3FFF // 와치독타이머사용 (On) #define WDTDIS 0x3FF7 // 와치독타이머사용중지 (Disabled/SWDTEN control) // Power Up Timer #define PWRTDIS 0x3FFF // 파워업타이머중지 (Off) #define PWRTEN 0x3FEF // 파워업타이머사용 (On) // Master Clear Enable #define MCLREN 0x3FFF // 리셋 (MCLR) 기능사용 #define MCLRDIS 0x3FDF // 내부리셋사용, MCLR 핀 IO핀으로사용 // Code Protect #define UNPROTECT 0x3FFF // 프로그램롬코드복제방지안함 #define CP 0x3FBF // 프로그램롬코드복제방지사용 // Data EE Read Protect 174

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 #define DUNPROTECT 0x3FFF // EEPROM 데이터읽기방지안함 #define CPD 0x3F7F // EEPROM 데이터읽기방지사용 // Brown Out Detect #define BORDIS 0x3CFF // BOD and SBOREN disabled #define SWBOREN 0x3DFF // SBOREN controls BOR function (Software control) #define BORXSLP 0x3EFF // BOD enabled in run, disabled in sleep, SBOREN disabled #define BOREN 0x3FFF // BOD Enabled, SBOREN Disabled // Internal External Switch Over Mode #define IESOEN 0x3FFF // Enabled #define IESODIS 0x3BFF // Disabled // Monitor Clock Fail-safe #define FCMEN 0x3FFF // Enabled #define FCMDIS 0x37FF // Disabled // Low Voltage Programming #define LVPDIS 0x2FFF // Disabled #define LVPEN 0x3FFF // Enabled // In-Circuit Debugger Mode #define DEBUGEN 0x1FFF // Enable ICD2 debugging #define DEBUGDIS 0x3FFF // Disable ICD2 debugging #define CONFIG_ADDR2 0x2008 // Brown-out Reset Voltage #define BORV21 0x3EFF // 2.1 Volts #define BORV40 0x3FFF // 4.0 Volts // Flash Memory Write Protection #if defined(_16f882) #define WP0 0x3BFF // Protect 0h-0FFh #define WP1 0x39FF // Protect lower half of flash #else #define WP0 0x3DFF // Protect 0h-0FFh #define WP1 0x3BFF // Protect lower half of flash #define WP2 0x39FF // Protect all of flash 175

Motor Control 영문주석이옆에있으므로데이터시트와함께비교하면서설정하면된다. INTIO : 내부클럭사용 4MHz 설정 ( 내부 8MHz 클럭발진 / 2 : 디폴트 ) DEBUGEN : ICD2 디버깅사용설정 MCLREN : MCLR 핀리셋핀동작설정 WDTDIS : 와치독사용중지위와같이설정이가능하다. unsigned char a; 전역변수 1 바이트로 a 선언하기 void main(void) 메인함수시작하기 unsigned int b; 2 바이트메인함수지역변수 b 선언하기 a=0; 전역변수 a를 0으로초기화하기 b +=(unsigned int) a; 지역변수 b에 b+a 값을저장하기, (insigned int) 는 a 변수와 b 변수의크기가틀리기때문에캐스팅연산자를사용하여변환한다. while(1); } 모든함수를수행한후, 제자리뛰기로처리함.( 또는 for(;;); 이렇게도표현함 ) 176

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 3> 기본적인프로그램을완료한소스를파일로저장하기. File 메뉴에서 Save 또는 Save As 를클릭한다. 현재이파일이름은 Untitled* 로표시된다. 이파일이름을원하는이름으로저장한다. 형식은파일이름.c 로확장자는.c로한다. <Step 4> 코딩한소스파일을새프로젝트 Source Files에넣기 오른쪽그림과같이프로젝트창에있는 Source Files 폴더위에오른쪽마우스클릭하면, Add Files 서브메뉴를클릭하면, 소스파일추가창이나온다. 177

Motor Control 오른쪽그림은 Hi_Tech_PICC_Start.c 소스코드가새프로젝트 Source Files로추가되어완료된상태를보여준다. <Step 5> Project 메뉴에팝다운 Build All 메뉴를클릭하거나위그림에서검정색원으로표시된 Build All 아이콘을클릭한다. 아래그림과같이 Output 창에 Build Succeeded가나온다. ( 위그림은 STD 버전이고, 아래그림은 PICC-Lite 버전, 검정색원이 Build All 표시 ) 만약 Error가발생하는경우에는 Output 창메시지를잘확인하여보길바란다. C언어적인문법에러인지아니면개발환경이나툴문제인지를확인한다. C 문법적인문제는 Output 창에해당되는그에러를클릭하면해당발생코드라인으로이동한다. 178

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 또한, 하이텍 PICC-Lite 버전또는 STD 버전등의컴파일러설치위치가잘되었는지아래그림과같이 Project 메뉴에 Select Language Toolsuite 를클릭한다. 아래그림과같이현재이프로젝트가사용할컴파일러는어떤것인지그리고, 설치위치와실행할파일들이정확한지체크한다. - 하이텍 PICC-Lite 프리버전을선택한경우, Ative Toolsuite은 HI-TECH Universal Toolsuite이고, Location은 C:\Program Files \HI-TECH Software\PICC\LITE\9.60\ bin\picl.exe이다. - 하이텍 PICC STD 버전인경우, Active Toolsuite은 HI-TECH PICC Toolsuite이고, Location은 C:\Program Files\HI-TECH Software\PICC\9.50\bin\picc.exe이다. 179

Motor Control 끝으로하이텍 C 컴파일러는 ANSI 표준이므로, 어느정도임베디드 C 언어환경을경험이있다면충분히 C언어자체적인문제는해결할수있다. 또한, 하이텍 C 컴파일러를설치하면설치된폴더안에영문매뉴얼과여러가지소스코드등을제공한다. - 매뉴얼있는곳 : C:\Program Files\HI-TECH Software\PICC\LITE\9.60\docs - 참고소스코드있는곳 : C:\Program Files\HI-TECH Software\PICC\LITE\9.60 \samples ( 참고소스에는 AD컨버터, UART, I2C 등의여러가지응용가능한소스들이있다 ) 2.4.4 MPLAB IDE 와개발툴을이용한프로그램 (Firmware) 개발하기 2.4.3장에서하이텍 C 컴파일러를사용하여테스트코드를빌드올하여소스코드상의문제가없을경우에는 Succeeded라는메시지와함께 hex 파일이만들어진다. 이번순서는이소스코드가하드웨어상에올리기전에어떻게시뮬레이터등을통하여간단한검증을하며, 또 PIC 내부플래시롬 (ROM) 메모리에직접디버깅코드나프로그램코드 (Hex 파일 ) 등을프로그래밍 ( 굽기 ) 하여하드웨어가얼마나안정적으로프로그래머가원하는동작을하는지를검증하고디버깅하는방법등을배우게된다. 2.4.4.1 MPLAB IDE 시뮬레이터사용하기 MPLAB IDE 통합개발환경프로그램은시뮬레이터를내장하고있어, 소스코드에대한간단한시뮬레이팅을통해사전에소스코드의루틴등을검증할수있다. 1. 새프로젝트만들기또는기존프로젝트열기새프로젝트만들기는이미 2.4.3장에서실습하였다. 여기서는 2.4.3장에서만들어진기존프로젝트를열기로한다. <Step 1> - MPLAB IDE 프로그램을실행한다. ( 바탕화면 MPLAB IDE 아이콘또는시작 모든프로그램 Microchip MPLAB IDE v8.xx MPLAB IDE를클릭한다.) 180

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 2> 프로젝트열기창이나타나면, 해당프로젝트가있는폴더를찾고, 프로젝트명.mcp 파일을열기한다. <Step 3> 기존프로젝트열기한후에, 프로젝트창에있는 Source Files 폴더에있는소스파일을클릭하면, 소스에디터창이열리면서소스도같이보여준다. < 다른방법 > 탐색기창에서해당프로젝트 mcw 파일을클릭하면 MPLAB IDE 개발환경툴의메인화면에프로젝트 (<Step 3>) 까지동시에열린다. 2. MPLAB SIM(Simulator) 로프로그램 (Firmware) 디버깅하기 MPLAB IDE 통합개발환경툴에는 MPLAB SIM이라는마이크로칩 MCU 전용시뮬레이터모듈이내장되어있다. 따라서하드웨어없이도어느정도기본적인기능들을시뮬레이션이가능하다. 여기서는가장기본적인디버깅동작에대해설명한다. 181

Motor Control <Step 1> 현재열려있는프로젝트 MPLAB IDE 통합개발환경프로그램창에서, Debugger 메뉴 Select Tool 팝다운메뉴 MPLAB SIM 을클릭한다. - MPLAB SIM이로딩이되면, 아래와같은아이콘이메인화면아이콘창에나타난다. Play, Pause, Animate, Step Into, Step Over, Step Out, Reset 순의아이콘버튼이생긴다. <Step 2> Debugger 메뉴 Settings 팝다운메뉴를클릭하면, MPLAB SIM의기본적인설정을할수있다. (Simulator Settings 창에각탭을클릭하면 MCU 동작설정및시뮬레이터설정등을할수있다 ) - MPLAB IDE 메인화면에서 Help 메뉴 Topics 를클릭하여 MPLAB Help Topics Debuggers MPLAB SIM 을클릭하면 MPLAB SIM 관련설명자료가자세히나와있으므로참고한다. <Step 3> 2.4.3장의기존프로젝트 (\Motor_Guide_Book\Lab\Hi_Tech_PICC_Lab) 소스코드를디버깅하기 182

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 #include <pic.h> CONFIG(XT & DEBUGEN & MCLREN & WDTDIS); // 컨피그레이션비트설정 unsigned char a; // 전역변수 a 선언 void main(void) unsigned int b; //main 함수지역변수 b 선언 a=0; b +=(unsigned int) a; while(1); } <Step 4> Watch 기능으로변수또는레지스터 (SFR) 값확인하기 View 메뉴 -> Watch 팝다운메뉴클릭, 아래와같은 Watch 창이나타난다. - 레지스터값을디버깅하면서확인하고싶다면, Add SFR 버튼과 ADCON0옆아래화살표를클릭하면, 이 MCU가가지고있는거의모든레지스터가아래로펼쳐진다. 또한, 소스코드상의변수등을확인하고싶다면, Add Symbol 버튼과 a 옆의아래화살표를클릭하면, 소스코드에있는변수들이아래로나열된다. 183

Motor Control <Step 5> 소스코드에있는변수 a와 b의값을확인하기위해, 아래그림의원표시된아래화살표를클릭하여, 각각 a, b 변수들을선택하여 Add Symbol 버튼을클릭한다. <Step 6> 현재프로젝트를 Build All( 빌드올 ) 하고, 아래그림과같이에디터위의각라인마다더블클릭하면각라인맨앞에빨간색 B 글자인브레이크포인트를지정한다. Build All 아이콘 해당라인에서더블클릭하면빨간색 B 글자가나옴 <Step 7> MPLAB SIM 리셋아이콘클릭한다. 그리고 Play 버튼클릭한다. Play 리셋 <Step 8> 아래그림과같이첫번째빨간색 B 글자가있는위치에화살표가나타난다. 현재이상태는이라인을 MCU가실행하기바로전이다. 여기에서다시 Play 버튼을누르거나, Step Into 버튼을누르면다음빨간색 B가있는위치로간다. 184

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 화살표가바로 PC( 프로그램카운터 ) 의위치가된다. a++; 문장을실행하기바로직전이다. Watch창에는 a 변수가초기화되어 0이되었다. - 다시 Play 버튼을누르면, 우측그림과같이 a 변수값이 0에서 1로변하고, PC 화살표도두번째 B로위치한다. - 이와같이 MPLAB SIM을이용하여소스코드를어느정도검증할수있다. 또한, 이후실습에서사용할 MPLAB ICD2 디버거를이용하는방법도하드웨어연결만다를뿐 MPLAB SIM을사용하는방법과같다. 2.4.4.2 MPLAB ICD2 디버거사용하기 2.2장에서소개한 MPLAB ICD2 디버거개발장비를가지고 USB 케이블로 PC와연결하고, 6핀케이블로개발보드와연결하여하드웨어상에서직접디버깅또는실행시키면서소스코드안에브레이크포인트설정이나 View 메뉴의 EEPROM, File Register, Program Memory, Watch 창등의소스위치및데이터, 레지스터상태등을디버깅하는 185

Motor Control 방법을실습한다. 또한, MPLAB ICD2를프로그래머장비 (Programmer) 로사용하는법도실습한다. 0. MPLAB ICD2 디버거연결하기아래그림과같이 MPLAB ICD2와하드웨어 ( 그림에는 PICDEM 2 PLUS 데모보드 ) 와전원을연결한다. 주의사항은 ICD2에전원잭이있는데, 여기에전원을인가하여 ICD2 가전원을공급하는형태는하드웨어가소량의전류 ( 수백mA이하 ) 까지는괜찮을지모르지만, 대용량전류를소비한다면 ICD2가망실될수도있다. 따라서가급적이면전원공급은하드에어에바로연결하도록하자. ICD2 연결시아래그림과같은메시지가나오면 ICD2 펌웨어업데이트중이므로업데이트가다끝날때까지기다리면된다. 이때 ICD2 를분리하는것은좋지않다. 1. MPLAB ICD2 디버거로사용하기 2.4.4.1장 MPLAB SIM 사용하기순서와거의흡사하므로 2.4.4.1장을참조바란다. <Step 1> - MPLAB IDE 프로그램을실행한다. ( 바탕화면 MPLAB IDE 아이콘또는시작 모든프로그램 Microchip MPLAB IDE v8.xx MPLAB IDE를클릭한다.) 186

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 2> 프로젝트열기창이나타나면, 해당프로젝트가있는폴더를찾고, 프로젝트명.mcp 파일을열기한다. ( 여기실습에서는 \Motor_Guide_Book\Lab\Hi_Tech_PICC_Lab 실습소스로한다 ) <Step 3> 기존프로젝트열기한후에, 프로젝트창에있는 Source Files 폴더에있는소스파일을클릭하면, 소스에디터창이열리면서소스도같이보여준다. <Step 4> 현재열려있는프로젝트 MPLAB IDE 통합개발환경프로그램창에서, Debugger 메뉴 Select Tool 팝다운메뉴 MPLAB ICD2을클릭한다. - MPLAB ICD2가디버거로로딩이되면, 아래와같은아이콘이메인화면아이콘창에나타난다. Play, Pause, Animate, Step Into, Step Over, Step Out, Reset Program, Read Rom, Read EEPROM, Reset&Connect 순의아이콘버튼이생긴다. <Step 5> Debugger 메뉴 Settings 팝다운메뉴를클릭하면, MPLAB ICD2 디버거의기본적인설정을할수있다. (MPLAB ICD2 Settings 창에서가장중요한탭은중간그림의 Status 탭과맨우측그림의 Power 탭이다. 원으로표시된부분이하드웨어와잘연결이되면 Status탭에있는 Run Self Test 버튼을누르면모두가 Pass 라고표시된다. 또한, Power 탭에있는 Update 버튼을누르면, 하드웨어 VDD 전압과 VPP 전압등이표시된다. PIC16F887 경우 VDD :5V, Vpp : 10~14V이면정상이다.) 187

Motor Control - MPLAB IDE 메인화면에서 Help 메뉴 Topics 를클릭하여 MPLAB Help Topics Debuggers MPLAB ICD2을클릭하면관련설명자료가자세히나와있으므로참고한다. <Step 6> 2.4.3장의기존프로젝트 ( 실습소스폴더 \Motor_Guide_Book\Lab\Hi_Tech_PICC_Lab) 소스코드를디버깅한후, 빌드올 (Build All) 버튼눌러서빌드하기 <Step 7> 아래그림의프로그래밍아이콘을클릭하면, ICD2를통해디버깅코드를하드웨어로프로그래밍이된다. ( 이후과정은 2.4.4.1장 <Step 4> 이후과정과똑같다 ) 188

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 8> Watch 기능으로변수또는레지스터 (SFR) 값확인하기 View 메뉴 Watch 팝다운메뉴클릭, Watch 창이나타난다. -Add Symbol 버튼과 a 옆의아래화살표를클릭하면, 소스코드에있는변수들이아래로나열된다. - 소스코드에있는변수 a와 b의값을확인하기위해, 아래그림의원표시된아래화살표를클릭하여, 각각 a, b 변수들을선택하여 Add Symbol 버튼을클릭한다. <Step 9> 현재프로젝트를 Build All( 빌드올 ) 하고, 에디터위의각라인마다더블클릭하면각라인맨앞에빨간색 B 글자인브레이크포인트를지정한다. 해당라인에서더블클릭하면빨간색 B 글자가나옴 <Step 10> MPLAB ICD2 디버거리셋아이콘클릭한다. 그리고 Play 버튼클릭한다. <Step 11> 우측그림과같이첫번째빨간색 B 글자가있는위치에화살표가나타난다. 현재이상태는이라인을 MCU가실행하기바로전이다. 여기에서다시 Play 버튼을누르거나, Step Into 버튼을누르면다음빨간색 B가있는위치로간다. Play 리셋 - 다시 Play 버튼을누르면, 우측그림과같이 a 변수값이 0에서 1로변하고, PC 화살표도두번째 B로위치한다. 189

Motor Control - 이와같이 MPLAB ICD2 디버거을이용하여하드웨어와연결된상태로직접소스코드를디버깅하여검증할수있다. 이후, 디버깅작업이완료되면 ICD2나프로그래밍장비를통해 Programmer 모드로 PIC 플래쉬롬에 Hex 파일을프로그래밍하여개발제품의완성단계의검증을하게된다. 2.4.4.3 MPLAB ICD2 디버거를프로그래머로사용하기 2.2장에서소개한 MPLAB ICD2 디버거개발장비를가지고 USB 케이블로 PC와연결하고, 6핀케이블로개발보드와연결하여하드웨어에있는 PIC MCU 플래시롬과 EPROM과기타영역을프로그래밍 ( 일명굽기 ) 하는실습이다. 즉, MPLAB ICD2 디버거장비를프로그래머장비 (Programmer) 로사용하는실습이다. 0. MPLAB ICD2 디버거연결하기 (2.2장 ICD2 사용하기와 2.4.4.2장 ICD2 디버거연결하기등을참조바란다.) 1. MPLAB ICD2 디버거를프로그래머 (Programmer) 로사용하기 <Step 1> - MPLAB IDE 프로그램을실행한다. ( 바탕화면 MPLAB IDE 아이콘또는시작 모든프로그램 Microchip MPLAB IDE v8.xx MPLAB IDE를클릭한다.) <Step 2> 프로젝트열기창이나타나면, 해당프로젝트가있는폴더를찾고, 프로젝트명.mcp 파일을열기한다. ( 여기실습에서는 \Motor_Guide_Book\Lab\Hi_Tech_PICC_Lab 실습소스로한다 ) <Step 3> 기존프로젝트열기한후에, 프로젝트창에있는 Source Files 폴더에있는소스파일을클릭하면, 소스에디터창이열리면서소스도같이보여준다. 또는탐색기창에서해당프로젝트 mcw 파일을클릭하면 MPLAB IDE 개발환경툴의메인화면에프로젝트까지동시에열린다. 190

Chapter 2. 마이크로칩개발툴및 C 언어프로그래밍 <Step 4> 현재열려있는프로젝트 MPLAB IDE 통합개발환경프로그램창에서, Programmer 메뉴 Select Tool 팝다운메뉴 MPLAB ICD2 을클릭한다. - MPLAB ICD2가프로그래머로로딩이되면, 아래와같은아이콘이메인화면아이콘창에나타난다. Verify Erase, Reset Release, Connect to HW Hold Reset Programming Device, Read Device, Read EEPROM, Verify Memory, Erase Device 순의아이콘버튼이생긴다. <Step 5> Programmer 메뉴 Settings 팝다운메뉴를클릭하면, MPLAB ICD2 프로그래머의기본적인설정을할수있다. 191

Motor Control - MPLAB ICD2 Settings 창에서가장중요한탭은위중간그림의 Status 탭과맨우측그림의 Power 탭이다. 원으로표시된부분이하드웨어와잘연결이되면 Status탭에있는 Run Self Test 버튼을누르면모두가 Pass 라고표시된다. 또한, Power 탭에있는 Update 버튼을누르면, 하드웨어 VDD 전압과 VPP 전압등이표시된다. PIC16F887 경우 VDD :5V, Vpp : 10~14V이면정상이다. - MPLAB ICD2 Programmer Settings 창에서 Power 탭에있는 Power target circuit from ICD2 체크박스는 ICD2 에있는전원어댑터커넥터에전원을인가하고, ICD2 6핀라인을통해전원을공급하겠다는체크박스이다. 그러나하드웨어상태가쇼트상태나전류를많이소비하는상태라면, ICD2 내부전원라인에망실을가져올수있다. 물론하드웨어에직접전원을공급하지않아도되는편리한점이있지만, 함부로이기능을사용하면약간의위험도있으니, 가급적사용 ( 체크 ) 하지말것을추천한다. 물론간단한회로에서디바이스를디버깅내지프로그래밍하는것에사용하는것은괜찮다. <Step 6> 2.4.3장의기존프로젝트 ( 실습소스폴더 \Motor_Guide_Book\Lab\Hi_Tech_PICC _Lab) 소스코드를디버깅한후, 빌드올 (Build All) 버튼눌러서빌드하기 <Step 7> MPLAB ICD2가하드웨어와연결이잘되었다면, Programming Device 버튼을누른다. - 프로그래밍이정상적으로완료되면우측그림과같이 Output 창에메시지가뜬다. 192

CHAPTER DC 모터 (Brushed DC Motor) 3.1 DC 모터의개요 3.2 DC 모터의종류 3.3 DC 모터의구동회로 3.4 DC 모터의제어 3.5 결론

Motor Control 3.1 DC 모터의개요 3.1.1 DC 모터의개요 DC(Direct Current, 직류) 모터는브러시의유/ 무에따라서일반적으로 Brushed DC 모터와 Brushless DC (BLDC) 모터로구분할수있으며, 본장에서는브러시가있는형태의 DC 모터에대해서만언급하며, 브러시리스 DC 모터는이후의장에서언급하도록하겠다. 우리가일반적으로부르는 DC 모터는브러시가있는형태의 DC 모터를말하며편의상브러시라는용어를생략하여부르곤한다. DC 모터는구동이쉽고, 상대적으로저렴하며, 소형으로제작이가능한이유등으로인해완구류에서부터자동차의부품등에이르기까지우리주변의다양한분야에응용되고있다. 3.1.2 DC 모터의구조및원리 < 그림 3-1> DC 모터의구성 DC 모터는 < 그림 3-1> 에서와같이고정자(Stator), 회전자(Rotor), 브러시(Brush) 및정류자(Commutator) 로구성되어있으며, 모터의외부로유출된신호선즉, 터미널은 2개이다. 따라서모터의사이즈가비교적작고, 모터의신호선이 2가닥이라면 DC 모터일가능성이크다. 194

Chapter 3. DC 모터(Brushed DC Motor) 3.1.2.1 고정자 (Stator) 고정자(Stator) 는모터의외부에위치하며, 고정자계(Stationary Magnetic Field) 를발생시켜준다. 이러한자계는영구자석또는전자석에의해서발생되어지는데, 일반적으로영구자석형태의고정자를가장흔히볼수있다. DC 모터의종류는이러한고정자의형태에따라서분류할수있으며이는이후에언급하도록하겠다. 여기서주의할점은고정자에서발생되는자계는그극성이바뀌지않는영구자석이라는점에유의하길바란다. a. 영구자석형고정자 b. 전자석형고정자 < 그림 3-2> 고정자형태 3.1.2.2 회전자 (Rotor) 회전자(Rotor) 는전기자(Armature) 라고불리기도하며, 하나또는그이상의권선으로구성되어져있으며, 고정자의내부에즉, 모터의중심부에위치하고있다. 모터에전압이인가되면회전자의권선에전류가흐르게되며이로인해자계를발생시키게된다. 이들자계에서발생시킨자극(Magnetic Pole : N 극, S 극) 들이반대편즉, 고정자의자극(N 극, S 극) 과서로인력과척력이발생하여반대극성을갖는위치에정렬하고자하는성질로인하여회전자는회전을하게된다. 따라서회전자가지속적으로회전하기위해서는회전자의자극이고정자의자극과반대가되도록지속적으로변경되어야한다. 이것을정류(Commutation) 이라부르며, 다음에소개할브러시와정류자에의해서가능해진다. 3.1.2.3 브러시 (Brush) 와정류자 (Commutator) DC 모터는다른여타의모터(BLDC, 유도기, 스텝모터등) 와달리모터권선에단순히직류를흘려줌으로써회전하게되는데이것이가능한이유는바로브러시와정류자가 195

Motor Control 기계적으로모터권선에흐르는전류의방향을바꾸어주는역할을하기때문이다. 구리재질로형성된정류자(Commutator) 는모터권선과각각연결되어있으며모터의회전축을감싸고있다. 탄소(Carbon) 재질의브러시(Brush) 는정류자와기계적으로접촉하며그반대편은모터의신호선과연결되어있다. 따라서브러시의양단에직류전압이인가되면전류는신호선을통해브러시및정류자를통과하는폐-루프를형성하게되며이로인해회전자(Rotor) 에자계가발생하게되는것이다. < 그림 3-1> 을다시한번확인하여브러시및정류자에대해충분히이해할수있기를바란다. 3.2 DC 모터의종류 DC 모터는고정자에서고정자계(Stationary Magnetic Field) 를형성하는방법에따라서영구자석형, 분권형(Shunt-Wound), 직권형(Series-Wound), 복권형(Compound -Wound) 등으로분류할수있다. 참고로우리가주위에서흔히보는 DC 모터는대부분영구자석형 DC 모터라고생각하면된다. 3.2.1 영구자석형 DC 모터(Permanent Magnet Brushed DC Motor) 영구자석형 DC 모터는가장일반적인으로사용되는 DC 모터로써, 영구자석으로형성된고정자에의해자계를발생시킨다. 이러한영구자석형 DC 모터는보통소형출력을필요로하는응용분야에사용이되고있는데이는이후설명할권선형 DC 모터에비해상대적으로사이즈가작아서영구자석을사용하는것이효과적이기때문이다. 우리가주위에서흔히볼수있는완구류에적용되는모터가여기에속한다. < 그림 3-3> 영구자석형 DC 모터 196

Chapter 3. DC 모터(Brushed DC Motor) 영구자석형 DC 모터의가장큰특징은속도와전압, 토크와전류의관계가선형성을갖는다는것이다. 즉, 속도및토크의제어가용이하다는장점을가지고있다. 반면에영구자석의자화특성이시간이지남에따라상쇄될수있다는특성으로인해수명이지날수록모터의특성이변할수있다는단점을지니고있다. 3.2.2 분권형 DC 모터 (Shunt-Wound Brushed DC Motor) 분권형 DC 모터는회전자( 전기자, Armature) 와병렬로고정자코일을배치하게된다. 분권형 DC 모터의경우고정자코일및회전자코일에흐르는전류가상호독립적이기때문에매우뛰어난속도제어특성을갖고있으며, 일반적으로 5 마력(Horse Power) 이상의큰출력을요구하는응용분야에사용된다. 분권형 DC 모터의경우영구자석을사용하지않기때문에영구자석형 DC 모터와같이사용기간에따라발생하는자력의상실을걱정하지않아도된다. < 그림 3-4> 분권형 DC 모터회로 3.2.3 직권형 DC 모터 (Series-Wound Brushed DC Motor) 직권형 DC 모터는회전자( 전기자, Armature) 와직렬로고정자코일을구성한다. 이모터는부하가증가하게되면고정자와회전자의전류가증가하기때문에토크가증가하게되므로높은토크를필요로하는응용분야에적합하다. 이모터의단점은영구자석형및분권형에비해정밀속도제어가어렵다는단점을가지고있다. 197

Motor Control < 그림 3-5> 직권형 DC 모터 3.2.4 복권형 DC 모터 (Compound-Wound Brushed DC Motor) 복권형 DC 모터는분권형과직권형의조합으로구성되어진모터이다. 즉, 회전자( 전기자, Armature) 와직렬및병렬로고정자코일을각각추가하여구성되어있다. 따라서복권형전동기는분권형과직권형의장점인속도제어및토크제어특성을최대한활용할수있다는장점을가지고있다. < 그림 3-6> 복권형 DC 모터 3.2.5 DC 모터의종류별속도 vs 토크특성 지금까지설명한각종류별 DC 모터의속도에따른토크특성을비교해보면 < 그림 3-7> 과같다. 만약특정응용분야를위한액츄에이터로써 DC 모터를고려한다면, 아래 198

Chapter 3. DC 모터(Brushed DC Motor) 특성곡선을참조하여 DC 모터의종류를먼저선별한후해당 DC 모터의스펙을참조하면도움을될것이다. 참고로여기에서는가장일반적으로사용되는영구자석형 DC모터에대해서만다루고자한다. < 그림 3-7> DC 모터의종류별속도 vs 토크특성 3.3 DC 모터의구동회로 DC 모터의제어에앞서모터를구동하기위한회로에대해살펴보자. 일반적으로 DC 모터의구동회로는 Chopper 구동회로, Half Bridge 구동회로, Full Bridge (H-Bridge) 구동회로의크게세가지로분류할수있다. 이들구동회로에서가장중요한소자는스위칭역할을해주는트랜지스터로써고속스위칭에이용되는 MOSFET( 금속산화막반도체전계효과트랜지스터) 가널리사용되고있다. 3.3.1 초퍼구동회로 (ChopperDriveCircuit) Chopper 회로는 DC 모터를한쪽방향으로만구동하는경우에적용할수있는가장간단한회로이며, 스위칭역할을하는 FET(Field Effect Transistor, 전계효과트랜지스터) 소자를모터의상단에연결하는상단(High-Side) 구동회로및모터의하단에 FET 소자를연결하는하단(Low-Side) 구동회로가있다. 199

Motor Control < 그림 3-8> Low-Side DC 모터구동회로 위의그림에서유의할사항은모터의양단에연결된다이오드의역할이다. 여기에사용된다이오드는 DC 모터가회전할때발생하는 Back EMF(Electromotive Force) 전압이 MOSFET 을손상시키는것을방지하기위해사용되었다. 모터가회전하는동안에 MOSFET이 Turn Off 되면, 모터의권선은여전히충전되어있기때문에역전류를발생시킬것이다. 따라서다이오드 D1은 MOSFET이 Turn Off 되었을때모터에남아있는전류를소비하기위해사용되기때문에그정격을충분히고려해주어야한다. 또한저항 R1과 R2 는회로의동작에있어서중요한역할을한다. 저항 R1은마이크로컨트롤러의 I/O 핀으로전류스파크가유입되어손실되는것을방지해주며, 저항 R2는마이크로컨트롤러의 I/O 핀이트라이스테이트(Tri-State) 상태에있을경우 FET가확실히 Turn Off 될수있는역할을해준다. 끝으로, 모터가회전하는상태에서스위치를끄게되면(FET Turn Off 시) 회전하던 DC 모터는회전관성에의해서짧은시간동안회전을지속하게되며부하및모터의스펙에따라그회전속도가점차줄어들며서서히정지하게될것이다. 즉, 외부에기구적인브레이크장치를추가하지않는다면급정지와같은브레이크기능을발휘할수없게된다는점에주의하자. 그렇다면모터의급정지를위한브레이크는어떻게구현할수있을까? 이에대해서는이후에소개될구동회로에서언급이될것이다. 200

Chapter 3. DC 모터(Brushed DC Motor) 3.3.2 하프- 브리지구동회로 (Half Bridge Drive Circuit) 하프- 브리지(Half Bridge) 구동회로는 Chopper 회로에 DC 모터와병렬로스위치소자즉, FET 를한개추가한회로를말하며, 추가된 FET는 Chopper 회로에서는없었던브레이크역할을해주기위해서이다. 하프-브리지구동회로또한 Chopper 회로와마찬가지로오직단방향제어를할수있다는점에유의하도록하자. 3.3.2.1 하프- 브리지구동회로 ( 정회전구동시) DC 모터의구동을위한하프- 브리지구동회로에는 < 그림 3-9> 와같이상단(High Side) 및하단(Low Side) 구동회로가있으며, 한가지주의할점은모터의구동을위해서는상단또는하단 FET를 Turn On 하여주고, 이때모터와병렬로위치한 FET는반드시 Turn Off 상태를유지하고있어야한다. 이때모터구동전류의흐름은아래 < 그림 3-9> 를참조하길바란다. < 그림 3-9> 하프-브리지 DC 모터구동회로 ( 구동시) 3.3.2.2 하프- 브리지구동회로 ( 제동시, Braking) 앞서언급했듯이이제하프-브리지구동회로에추가된브레이크기능에대해살펴보 자. < 그림 3-10> 과같이상단(High Side) 및하단(Low Side) 구동회로에있어서모터 201

Motor Control 와병렬로위치한스위치소자(FET) 를 Turn On 하고, 나머지는 Turn Off 할경우를생각해보자. 모터의회전에의해서모터에유기되었던역기전력은이제모터와병렬로위치한스위치소자가켜짐에따라서그라운드(GND) 또는공급전원측(Vbus) 과패스 (Path) 가형성되면서급속히제로(0) 로감소하게될것이다. 따라서역기전력전압과비례하는 DC 모터의속도또한급속히제로(0) 로감소하게되어제동효과를발휘하게되는것이다. 직관적인이해를돕기위한간단한실험을위해 DC 모터를하나준비해보자. 이미알고있듯이모터의회전은역기전력을발생시키며이는발전기의원리가된다. 첫번째실험으로써먼저 DC 모터의회전축을손으로재빨리돌려보자. 이때가지고있는모터의스펙에따라서다소차이는있겠지만일정량의회전을하는것을볼수있을것이다. 여건이된다면이를오실로스코프를이용하여모터의양단에유기되는역기전력전압을측정해보는것도좋은경험이될것이다. 두번째실험에앞서모터의양쪽단자의라인을서로묶어놓은후다시한번손을이용하여모터의회전축을재빨리돌려보자. 첫번째실험과달리모터의회전이현저히감소하게됨을체험할수있을것이다. 이는발전기측면에서보았을때무한대의부하가인가된것과같은증상을보이는것으로생각할수있으며모터측면에서는제동효과로볼수있다. < 그림 3-10> Half-Bridge DC 모터구동회로 ( 브레이크발생시) 202

Chapter 3. DC 모터(Brushed DC Motor) 3.3.2.3 하프- 브리지구동회로 ( 암- 쇼트, Arm Short) 하프- 브리지구동회로와같이스위칭소자(FET) 가상단및하단에직렬로연결된회로를응용할경우, 반드시기억해야할사항이있다. < 그림 3-11> 과같이상단및하단스위치소자(FET) 들이모두 Turn On 되었을경우를생각해보자. 모터권선이감겨져있는모든모터는일정량의저항(R) 과인덕턴스(L) 를가지고있기때문에 < 그림 3-11> 에서와같이대부분의전류는스위치소자 1과 2 를통해흐르게될것이다. 이경우모터에비해상대적으로저항값이작은스위치소자를흐르는전류의값은어떻게될까? 옴의법칙(I = V/R) 에따라서전류는전압에비례하고저항에반비례하게되므로그값은스위치소자의저항값에의해서결정이될것이며, 이전류값이스위치소자의허용전류보다크다면스위치소자는손상될것이다. 심할경우스위치소자의플라스틱케이스가금이가거나파편이튀는현상까지도발생할수있을것이다. 이러한현상을흔히들암- 쇼트(Arm Short) 라부르기도한다. 이는마치사람의팔(Arm) 또는다리(Leg) 와유사한형상을하고있는하프-브리지회로의상단및하단스위치의모습에서유래한것으로알려져있다. 암- 쇼트(Arm Short) 에대해서는이후에보다자세히다루게될것이며, 미리언급하자면이러한치명적인암-쇼트현상의방지를위해서는스위치소자를일정시간모두턴 - 오프상태로유지하는데드타임(Dead Time) 이라는기술이소개될것이다. < 그림 3-11> Half-Bridge DC 모터구동회로 ( 단락발생시) 203

Motor Control 3.3.3 풀- 브리지구동회로 (Full Bridge Drive Circuit) 풀- 브리지(Full Bridge) 구동회로는하프- 브리지(Half Bridge) 회로를모터의양단에각각배치한형태를이루고있으며, 가장큰특징은모터의양방향제어가가능하다는점이며이를위해총 4 개의스위치소자를필요로하고있다. 풀-브리지구동회로는그형상이영문자 "H" 와유사하게생겼다고해서 H-Bridge 라부르기도한다. 3.3.3.1 풀- 브리지구동회로 ( 정회전구동시, Forward Driving) 풀- 브리지(Full Bridge) 구동회로는 < 그림 3-12> 와같이두개의하프- 브리지(Half Bridge) 구동회로의중간에모터를연결한형태로구현할수있다. < 그림 3-12> 와같이스위치소자 SW1과 SW4를 On 하고, SW2과 SW3를 Off 할경우전류의경로는스위치소자 SW1을통해모터의양단을흐른후스위치소자 SW4 를통해형성된다. 즉, DC 모터의왼쪽단자는구동전원의양(+) 단자에연결되고오른쪽단자는구동전원의음(-) 단자에연결되는결과가되며이경우 DC 모터는정방향(Forward) 으로회전하게될것이다. < 그림 3-12> 풀-브리지 DC 모터구동회로 ( 정회전구동시) 204

Chapter 3. DC 모터(Brushed DC Motor) 3.3.3.2 풀- 브리지구동회로 ( 역회전구동시, Reverse Driving) 이제 DC 모터의역회전구동에대해살펴보자. < 그림 3-13> 과같이스위치소자 SW3과 SW2를 On 하고, SW1과 SW4를 Off할경우전류의경로는스위치소자 SW3을통해모터의양단을흐른후스위치소자 SW2를통해형성된다. 즉, DC 모터의오른쪽단자는구동전원의양(+) 단자에연결되고왼쪽단자는구동전원의음(-) 단자에연결되는결과가되며이경우 DC 모터는역방향 (Reverse) 으로회전하게될것이다. 따라서풀-브리지회로는 DC 모터의정회전및역회전제어를가능하게해주는회로라말할수있다. < 그림 3-13> Full-Bridge DC 모터구동회로 ( 역회전구동시) 3.3.3.3 Full Bridge 구동회로 ( 제동시, Braking) 풀- 브리지(Full Bridge) 구동회로에서모터의제동을위해서는 < 그림 3-14> 와같이두개의하단스위치 SW2과 SW4를 On 하고, 두개의상단스위치 SW1과 SW3를 Off 상태로유지한다. 이경우모터의회전에의해서유기되었던역기전력은스위치소자 SW2과 SW4 에의해서그라운드(GND) 측과폐- 경로(Path) 가형성되면서급속히제로(0) 로감소하게될것이며역기전력전압과비례하는 DC 모터의속도또한급속히제로(0) 로감소하게되어제동효과를발휘하게되는것이다. 205

Motor Control < 그림 3-14> Full-Bridge DC 모터구동회로 ( 브레이크발생시) 3.3.3.4 풀- 브리지구동회로 ( 암- 쇼트, Arm Short) 풀- 브리지(Full Bridge) 구동회로에서도하프-브리지회로에서와마찬가지로암-쇼트현상이발생하지않도록주의해야한다. < 그림 3-15> 와같이모터의좌측또는우측의스위치소자들이모두동시에 On 된다면, 과도하게큰전류가스위치소자 SW1, SW2 또는 SW3, SW4 를통해흐르게되므로스위치소자의손실을초래할수있기때문이다. < 그림 3-15> Full-Bridge DC 모터구동회로 ( 단락시) 206

Chapter 3. DC 모터(Brushed DC Motor) 3.4 DC 모터제어 본장에서는마이크로칩의 8비트마이크로컨트롤러중하나인 PIC16F887 디바이스와하이텍소프트사의 C 컴파일러인 HITECH PICC Lite 컴파일러를사용하도록하겠다. 특히고가의 C 컴파일러의비용부담을덜고자 PIC16F887 디바이스로선정하였으며여기에서사용할 HITECH PICC Lite 버전은상기디바이스에대해프로그램메모리 2KB 및데이터메모리 256 바이트의일부제한으로무료사용이가능하다. 또한 PIC16F887 디바이스는모터제어전용 PWM(Pulse Width Modulation) 모듈을내장하고있기때문에하프-브리지및풀- 브리지구동을손쉽게구현할수있다. 참고로 HITECH PICC 컴파일러의 Lite 버전은무료버전의 C 컴파일러로로써별도의다운로드없이 MPLAB IDE 인스톨시인스톨이가능하다. < 그림 3-16> PIC16F887 디바이스요약 207

Motor Control 3.4.1 DC 모터 On/Off 제어실습 DC 모터는기본적으로임의의 DC 전압을모터의양단에인가하면회전하는특성을 가지고있다. 이때모터의회전속도(RPM, Revolution Per Minute) 는모터에인가된전 압에의해결정되며, 일반적으로그크기에비례하는특성을가지고있다. 그러면, 이제 모터를돌려보자. 실습보드의설정을 < 그림 3-17> 과같이구성하여보자. 우리가사용할회로는하프- 브리지(Half Bridge) 회로와매우흡사한초퍼(Chopper) 회로이며, 편의상상단스위치 소자 SW1은항상 On 시키고하단스위치소자 SW2를 On/Off 하여모터를구동하고자 한다. 그림에서상단스위치소자 SW1은 P채널 MOSFET을사용하였고이소자는게이트단 의전압이 "Low" 일때 Turn On 되며, 하단스위치소자 SW2는 N채널 MOSFET을사용 하였으며이소자는 P채널 MOSFET 과는달리게이트단의전압이 "High" 일때 Turn On 된다. 따라서 PIC16F887의 RD7 핀은항상 "High" 로출력하여스위치소자 SW1을 항상 Turn On 시켜놓고 RC1 핀을이용하여하단스위치소자 SW2를 On/Off 함으로써 모터의 On/Off 제어가가능해진다. 참고로, Tact 스위치입력은 RA4 핀을통해받게되며, Pull Up 저항이연결되어있 으므로기본상태에서 "High" 가입력되며, 스위치를누를경우 "Low" 가입력될것이다. 208 < 그림 3-17> 모터 On/Off 제어실습회로

Chapter 3. DC 모터(Brushed DC Motor) 실습을위한순서도를그려보면다음 < 그림 3-18> 과같다. < 그림 3-18> 모터 On/Off 제어실습순서도 코드작성에앞서우리가사용할마이크로컨트롤러의처리속도에대해먼저살펴보자. PIC16F887 디바이스는최대 20 MHz 클럭주파수에서동작이가능하며 1초당처리하는명령어의개수를의미하는명령어처리주파수는오실레이터주파수의 4 분주(Fosc/4) 이므로최대 5 MHz 또는 5 MIPS(Mega Instruction Per Second) 이다. 오실레이터주파수(Fosc) 및명령어처리주파수(Fcy) 는타이머, PWM 및 UART 등의통신용모듈에이르기까지모든시간과관련된마이크로컨트롤러의주변장치설정을위한기본이되므로주의를필요로한다. 20 MHz 오실레이터를사용할경우, 오실레이터주파수와명령어사이클과의관계는다음과같다. 209

Motor Control 오실레이터주파수 (Fosc) >Fosc = 20[MHz] 명령어처리주파수 (Fcy) > Fcy = Fosc / 4 = 20 x 10 6 /4=5[MIPS] 1초당 500만개명령어처리 오실레이터주기 (Tosc) > Tosc =1/Fosc=50[ns] 명령어사이클 (Instruction Cycle) > Tcy =1/Fcy=4/Fosc=200[ns] 1 개의명령어처리하기위한소요시간 : 200 [ns] 이제실습코드를작성해보자. 1. 헤더파일참조 : #include <pic.h> HITECH PICC 컴파일러이용시각디바이스에대한헤더파일명을별도로지정하지않아도된다. 단지 "pic.h" 라는헤더파일을추가하기만하면 MPLAB IDE의디바이스정보를이용하여컴파일러가자동으로해당디바이스의헤더파일을참조하게된다. 2. 선처리문선언 : #define Modified_Name Original_Name 이부분은사용자의취향에따라사용여부를판단하면된다. 아래선처리선언문은코딩의해독성을돕기위해필자가임의로사용하였다. 선처리라는말은컴파일러가각각의선처리문을참조하여컴파일수행시이를반영한다는의미로받아들이면무난할것으로보인다. 3. Configuration Memory 설정 : CONFIG(x) 사실이부분이처음사용자에게는가장이해하기어려운부분일것이다. Configuration Memory 는 Program Memory 영역에위치하고있으며특정기능의설정을위해사용되고있다. 이영역의메모리는코드실행중에는어떠한명령어로도액세스가불가능하며오직프로그래머(MPLAB ICD2 등) 를이용하여프로그래밍할때만그값의 210

Chapter 3. DC 모터(Brushed DC Motor) 변경이가능하다. HITECH PICC 컴파일러에서는 "CONFIG(X);" 라는매크로함수를이용하여그값의설정이가능하며여기에서 "X" 값은해당디바이스의헤더파일(pic16f887.h) 의마지막부분에선언되어있다. Configuration Memory 에대한보다자세한내용은데이터시트 Chapter 14. Special Features 를참조하길바란다. //******************************************************************// //*** 헤더파일선언 ***// //*** 컴파일러 : HITECH PICC Lite V9.60 ***// //******************************************************************** // #include <pic.h> // MPLAB IDE의 Device 정보에의해헤더파일자동으로설정됨 //******************************************************************// //*** 선처리문 ***// //******************************************************************// #define Fosc 20000000 // Oscillator Clock : 20Mhz #define Fcy Fosc/4 // Instruction Clock : 5MIPS (Fcy = Fosc/4) #define SW2 RA4 // SW2 포트설정 --> RA4 #define HIGH_SIDE_SW RD7 // High Side SW --> RD7 #define LOW_SIDE_SW RC2 // High Side SW --> RC2 #define ON 1 // High --> Motor Start #define OFF 0 // Low --> Motor Stop //******************************************************************// //*** << Configuration Bits 설정 >> ***// //*** 1. 사용법 : CONFIG(X1 & X2 & X3... ) ***// //*** 2. X1,X2,X3 --> 헤더파일에서 Define 되어있음 ***// //******************************************************************// CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & BORDIS & LVPDIS ); 다음은 < 그림 3-17> 의회로도에대한 I/O 포트입/ 출력에대한초기화를위한코드이다. 211

Motor Control // 1. RA4 핀을입력으로설정 ANSEL = 0x00; // AN0 ~ AN7 : I/O Port 로설정 (Analog Disable) TRISA4 = 1; // RB4 : 입력설정 // 2. RD7 핀을출력으로설정 RD7 = 0; // RD7(High Side SW) : Turn Off ( 초기값 ) TRISD7 = 0; // RD7 출력설정 // 3. RC1 핀을출력으로설정 RC1 = 0; // RC1(Low Side SW) : Turn Off ( 초기값 ) TRISC1 = 0; // RC1 : 출력설정 다음은 < 그림 3-18> 의순서도에대한알고리즘에해당하는코드이다. HIGH_SIDE_SW = 1; // High Side SW : Turn On (Chopper 회로구성) //*=====================================================*// //*== 무한루프 ==*// //*=====================================================*// while(1) if(sw2) // 스위치누르지않으면 LOW_SIDE_SW = OFF; // 모터정지 } else // 스위치누르면 LOW_SIDE_SW = ON; // 모터구동 } } 지금까지설명한부분별코드는한국마이크로칩웹사이트 (www.microchipkorea.com) 를통해풀버전으로제공될예정이며, 고객들의요청이있을시이를반영하여지속적인소스코드의업데이트가이루어질예정이다. 실습보드의설정및사용법은소스코드의머리말부분에설명된회로결선방법및본서적의부록에수록된회로도설명부분을참조 212

Chapter 3. DC 모터(Brushed DC Motor) 하길바란다. 설명이부족하였거나의문점발생시상기웹사이트의 Q&A 게시판을통해추가적인설명을보충하도록하겠다. 실습에앞서한가지주의할사항은전력에민감한스위칭소자의파손을방지하기위해서 DC 모터의스펙을사전에꼭확인하고이에맞는구동전압이설정되도록점퍼설정에주의해주길당부한다. 만약실습에사용하고자하는 DC 모터스펙의확보가곤란하다면 DC 모터는물론스위칭소자의보호를위하여낮은전압인 5V 또는 9V의낮은전압을이용하여실습할것을권장한다. 이번실습은 DC 모터의온- 오프(On/Off) 실습으로써스위치를누르면모터에인가되는전압의크기에의해서결정된일정한속도로회전을하게될것이며모터구동중다시스위치를누르면정지를하게될것이다. 3.4.2 DC 모터 PWM 속도제어 (No Feedback) 실습보드의설정을 < 그림 3-19> 와같이구성하여보자. 우리가사용할회로는이전실습과동일하게하프- 브리지(Half Bridge) 회로와유사하지만 Chopper 회로처럼구현하기위해상단스위치소자 SW1은항상 On 시키고하단스위치소자 SW2를 PWM(Pulse Width Modulation) 을이용하여모터의속도를제어하고자한다. < 그림 3-19> 모터속도제어실습회로 213

Motor Control 먼저위의실습회로를가지고수행하고자하는메인알고리즘을공개하고이를위한세부적인것들에대해살펴보도록하자. 다음은 RA4 핀을입력, RD7 을출력으로설정하는부분이다. //*========================================================*// //*== 1. I/O PORT 설정 ==*// //*== --> RA4 : 입력설정 ==*// //*== --> RD7 : 출력설정 ==*// //*========================================================*// void Config_PORT_IO(void) TRISA4 = 1; // RA4 : 입력설정 (SW2) ANS4 = 0; // AN4 : I/O 포트로설정 (Disable Analog Port) } TRISD7 = 0; // RD7 : 출력설정 (High Side TR) RD7 = 0; // HIGH_SIDE_TR = 0; DC 모터의목표속도를가변저항값을이용하여설정하고자한다. 따라서가변저항의저항값을마이크로컨트롤러의 A/D 컨버터를이용하여읽고, 이값을펄스폭으로반영하고자한다. PIC16F887 디바이스의 A/D 컨버터는 10 비트분해능을갖고있다. 즉, A/D 컨버터의결과값이총 10비트데이터가된다는말이며이를십진수로표현하면 0~1023 이된다. 일례로가변저항의기준전압으로써 5V를인가하고그가변전압을 A/D 컨버터를이용하여읽게되면최대입력전압(5V) 를총 1024 스텝으로구분한전압으로컨버전이가능하다는말이된다. PIC16F887 디바이스의 A/D 컨버터블록다이어그램인 < 그림 3-20> 을이해한다면여러분은 A/D 컨버터를이미사용할수있다는말이된다. 이제 A/D 컨버터사용을위해기본적으로설정해야할사항에대해살펴보도록하자. 214

Chapter 3. DC 모터(Brushed DC Motor) < 그림 3-20> A/D 컨버터블록다이어그램 1. 사용할 A/D 입력핀설정 - 해당핀을입력으로설정 : [ 예] TRISA0 = 1; // TRISA 레지스터참조 - 해당핀을아날로그로설정 : [ 예] ANS0 = 1; // ANSEL 레지스터참조 2. ADC 모듈설정 -ADC 컨버젼클럭 (Tad) 설정 : [ 예] ADCS1=1;ADCS0=0; // ADCON0 참조 - 레퍼런스전압설정 : VCFG1 = 0; VCFG0 = 0; -ADC 입력채널설정 : CHS<3:0> 설정 - ADC 결과값포맷설정: ADFM = 0; 215

Motor Control 3. ADC 인터럽트설정 (ADC 인터럽트사용시) : 데이터시트의 Fig. 14-7 참조 - ADC 인터럽트플래그클리어 : ADIF = 0; - ADC 인터럽트사용설정 : ADIE = 1; - 주변장치인터럽트사용설정 : PEIE = 1; - 글로벌인터럽트사용설정 : GEIE = 1; 4. Acquisition 시간동안기다림 : Tacq = 11.5us ( 데이터시트의 Table 17-11 참조) 5. ADC 컨버젼시작 - GODONE = 1; 6. ADC 컨버젼완료될때까지기다림 - 폴링(Polling) 방식 : while(godone); - 인터럽트(Interrupt) 방식 : ADIF 가 "set(1)" 되면인터럽트발생 7. ADC 결과값읽어오기 -ADRESH,ADRESL 읽어오기 8. ADC 인터럽트플래그클리어 (ADC 인터럽트사용시) -ADIF=0; A/D 컨버전후그결과값은 <ADFM> 비트의설정에따라서아래와같이 2가지형태의포맷으로데이터가정렬된다. 사용자의편의에따라서결정을하면되지만일반적으로가장많이사용하는경우는좌측정렬(Left Justified Format) 이다. 이렇게얻은 A/D 컨버젼결과값을이제 PWM 펄스폭으로업데이트만시켜주면되며이를위해서몇가지비트연산을수행해야할필요가있다. ADRESH 레지스터값은 8비트데이터이기때문에 CCPRxL 레지스터에그대로옮기면되지만 ADRESL 레지스터의 2비트값은 CCPxCON 레지스터의 5번째및 4번째비트에옮겨야하기때문에 ADRESL 레지스터의값을오른쪽으로 2비트를시프트한후 CCPxCON 레지스터에 2개의비트만옮겨야하는번거로움을감수하여야한다. 여기에서 CCPxCON 레지스터의총 8 비트데이터중 <5:4> 비트만변경시킬때나머지 6개의비트의값은기존값을유지하고바뀌지않도록반드시주의해야한다. 216

Chapter 3. DC 모터(Brushed DC Motor) < 그림3-21> A/D 컨버젼결과값포맷 다음은 ADC 모듈을설정하는부분이다. //*========================================================*// //*== 2. ADC 모듈설정 ==*// //*== --> AN0 : 아날로그입력 ==*// //*========================================================*// void Config_ADC(void) TRISA0 = 1; // RA0 : 입력설정 ANS0 = 1; // AN0 아날로그입력으로사용 (VR) ADCS0 = 0; // AD Clock = Fosc/32 = 20M/32 = 0.625Mhz // Tad = 1.6us CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; // ADC Channel Select : AN0핀으로설정 } VCFG0 = 0; // ADC 의 + Ref 전압 : AVDD 핀의전압으로설정(Vdd) VCFG1=0; // ADC의 - Ref 전압: AVSS 핀의전압으로설정(Vss) ADFM = 0; // ADC 결과값: Left Justify (ADRESH/L:xxxxxxxx xx------) ADON = 1; // ADC 모듈 : ON GODONE = 0; // ADC Converstion : STOP 필자는 ADC 컨버터의컨버젼결과의신뢰도를높이기위해 A/D 변환을총 8회수행후그평균값을취하도록하였다. 217

Motor Control //******************************************************************// //*** A/D Conversion Routine ***// //*** AN0 ( 가변저항) 을 8회 ADC 수행후평균값(10 비트) 적용 ***// //******************************************************************// void fcn_ad_conv(void) unsigned int ad_10bit_temp; GODONE = 1; // ADC 컨버전시작 while(ad_cnt < 8) while(godone); // ADC 컨버전 End 체크 ad_10bit_temp = (ADRESH<<2) + (ADRESL>>6); ad_sum += ad_10bit_temp; ad_cnt++; GODONE = 1; // ADC 컨버전시작 } ad_avg = ad_sum >> 3; // ADC 컨버전누적값/ 평균회수 (2^3 = 8) } ad_sum = 0; ad_cnt = 0; PWM( 펄스폭변조) 에대해먼저살펴보자. 기본적으로 DC 모터는모터의양단에인가되는전압에따라서속도가결정된다. 따라서모터의속도제어를위해서는모터에인가되는전압을제어할수있으면되는것이다. 만약모터에인가되는전압이아래 < 그림 3-22> 와같은 Vpeak 크기의전압이 Tperiod의주기마다 Tpulse_width 시간동안만켜지는형태이었다면, 모터에인가되는전압의평균값 ((Vavg) 은듀티사이클(Duty Cycle) 즉, Tpulse_width/Tperiod 값에비례하게될것이다. 218

Chapter 3. DC 모터(Brushed DC Motor) < 그림 3-22> PWM 파형및용어 따라서듀티사이클의정의는다음과같다. 이제 PIC16F887 마이크로컨트롤러를이용하여 PWM 파형을구현해보자. PWM 파형은일반 I/O 포트를이용하여소프트웨어적인방법으로구현할수도있지만 PIC16F887 디바이스에는 2개의 CCP(Capture/Compare/PWM) 모듈이내장되어있기때문에간단한설정만으로손쉽게 PWM 파형을구현할수있다. 이러한 CCP 모듈의장점은주기(Period) 와펄스폭(Pulse Width) 설정만으로마이크로컨트롤러내부에탑재되어있는 PWM 컨트롤러가정확한파형을손쉽게발생시켜준다는것이다. < 그림 3-23> 의그림 a와같이 CCPx 핀을이용하여 PWM 파형을출력하기위해 PIC16F887 마이크로컨트롤러의 PWM 모듈의동작원리를이해할필요가있다. < 그림 3-23> 에서와같이 PWM의주기는타이머2 의주기(Period) 레지스터인 PR2 레지스터를이용하여최대 8 비트값으로설정할수있으며, PWM의펄스폭은 CCPRxL 레지스터의 8비트값과 CCPxCON 레지스터에서 2개의비트를합한총 10비트로설정할수있다. 즉, 타이머2의동작에의해서자동으로증가하는 TMR2 레지스터의값이 CCPRxH 값과같아지면 CCPx 핀은 High에서 Low 로토글되며, TMR2 레지스터값이이후계속증가하여 PR2 레지스터의값과같아지면 CCPx 핀은다시 Low에서 High 로토글된다. 또한이때 TMR2 레지스터값은 0 으로초기화되며, 새로운듀티사이클값인 CCPRxL + CCPxCON<5:4> 의값을 CCPRxH 레지스터에저장한다. 219

Motor Control 한가지주의할점은펄스폭은 10비트값인데반해주기값은 8비트라는주기사실에의문을가질것이다. 이는주기를비교할때는 TMR2와 PR2의 8비트데이터만을비교하지만펄스폭을비교할때는 CCPRxL + CCPxCON<5:4> 레지스터의 10비트데이터와 TMR2 + 하위 2비트데이터값을비교하기때문에상대적으로는동일한시간폭을가지며, 단지펄스폭비교기의분해능이 2 비트(2 2 =4 배) 증가하게되는효과를얻을수있다. 참고로데이터시트의 PWM 주파수에따른 PR2 레지스터값및최대분해능 (Resolution) 비교표를참조하면이해를도울수있을것으로보인다. < 표 3-1> PWM 주파수및분해능비교 220

Chapter 3. DC 모터(Brushed DC Motor) a CCP 모듈의 PWM 출력 b CCP 모듈의 PWM 사용시다이어그램 < 그림 3-23> PWM 발생기블록다이어그램 이제 < 그림 3-19> 의회로도에서주어진것과같이 CCP2 핀을 PWM 출력으로사용하기위해서는타이머2와 CCP2 모듈과관련된레지스터들을설정해주면된다. 1. 타이머 2 설정 2. PR2 설정 221

Motor Control 3. CCP2CON 레지스터설정 4. CCPR2L 레지스터설정 PWM 주파수를설정을위해서타이머2와관련된아래의식을참조하여 PR2 이머2 의프리스케일러값을설정한다. 값과타 값 의프리스케일러값 < 참조> ( 오실레이터클럭의주기) 펄스폭설정은아래의식을참조하여 CCPR2L 및 CCP2CON<5:4> 레지스터에설정한다. 값 예 사용시펄스폭 값 예 사용시듀티사이클비 지금까지과정을통해얻은레지스터설정값을이용하여아래와같이소스코드를작성한다. 222

Chapter 3. DC 모터(Brushed DC Motor) //*=========================================================*// //*== 3. PWM 설정 ( CCP2) ==*// //*== --> PWM Freq. = 20kHz 설정 (TMR2 주기이용) ==*// //*== --> RC1 : CCP2를 PWM 으로설정 ==*// //*== --> Datasheet <11.5 참조> ==*// //*=========================================================*// void Config_CCP2_PWM(void) RC1 = 0; TRISC1=1; // RC1 입력설정(CCP2 출력중지) T2CKPS1=0; T2CKPS0 = 0; //1:1Prescaler // T_tmr2 = ( Tosc * 4 ) x (# of Prescaler)= 0.2 us PR2 = 249; // Period of PWM(T_pwm) = (PR2+1) x T_tmr2 = 50 us // Freq. of PWM(F_pwm) = 1/T_pwm = 20 khz CCP2CON = 0b00001111; // CCP2를 PWM 모드로사용 // CP2M3=1; CCP2M2=1; CCP2M1=x; CCP2M0=x; CCPR2L = 0; // Duty Cycle 0 으로초기화 ( 상위 8 비트) DC2B1 = 0; DC2B0 = 0; // Duty Cycle 0 으로초기화 ( 하위 2 비트) } TMR2ON = 0; TRISC1 = 0; // Timer2 Stop // CCP2 --> output 설정 이제 A/D 컨버전을 8 회수행한후그평균값(10 비트) 을펄스폭으로이용하여 CCPR2L 및 CCP2CON 레지스터에옮겨넣기위한코드를작성해보자. //********************************************************************// //*** CCP2 모듈의 PWM Duty Cycle 업데이트 ***// //*** CCPR2L : ADC 결과값중상위8비트값적용 ***// //*** CCP2CON<5:4> : ADC 결과값중하위 8비트값적용 ***// //********************************************************************// void fcn_ccp2_duty_update(void) HIGH_SIDE_TR = ON; // Motor Run temp_byte = (unsigned char) ((ad_avg & 0x03)<<4); CCP2CON = temp_byte 0x0F; // 00xx0000 00001111 CCPR2L = ad_avg >> 2; TMR2ON = 1; } 223

Motor Control 모터를정지하고자할경우에는 CCP2 모듈을오프(OFF) 모드로설정하여불필요한프로세서의낭비를방지하여야한다. 다음은 CCP2 모듈을미사용모드로설정하는코드이다. //********************************************************************// //*** CCP2 모듈사용중지 ***// //*** High/Low Side TR : Turn Off ***// //*** TMR2중지및 CCP2CON 레지스터 Clear ***// //********************************************************************// void fcn_ccp2_off(void) HIGH_SIDE_TR = OFF; // Motor Stop LOW_SIDE_TR = OFF; // Motor Stop CCP2CON &= 0x00; TMR2ON = 0; } 지금까지설명한코드를이용하여 DC 모터의속도를변화시키는실습을수행해보도록하자. 이번실습은이전에수행한실습 1과달리가변저항을이용하여 PWM의듀티비를가변함으로써 DC 모터에인가되는평균전압을제어하고이를이용하여모터의속도를제어하는데목적이있다. 비록간단한실습이지만이번실습을통해 A/D 컨버터, 타이머및 PWM 모듈에대한이해를충분히이해할수있기를당부한다. 3.4.3 DC 모터 PWM 속도제어 (Optical Encoder Feedback) 옵티컬엔코더또는포토인터럽터를이용하여모터의회전속도를측정해보도록하자. 이실험에앞서여러분이사용하고있는 DC 모터의회전축에는디스크모양의회전판또는이에상응하는장치를제작또는구매하여사용해보기를권장한다. 포토인터럽터는발광부로부터송신되는신호를수광부의포토트랜지스터를통해수신받게되면전압이발생하는원리를이용하여장애물의존재유무를판단할수있는유용한디바이스이다. 이러한원리를이용하여포토다이오드와포토트랜지스터사이에 < 그림 3-24> 와같이 DC 모터의회전축에부착된일정한홈이있는디스크모양의휠을삽입함으로써모터의회전속도를측정할수있게된다. 이번실습을수행하기위해서는실습보드의점퍼(J23, J24) 에포토인터럽터를사용해 야하며발광부(J23) 에는포토다이오드(LTE-302) 와수광부(J24) 에는포토트랜지스터 224

Chapter 3. DC 모터(Brushed DC Motor) (LTR-301) 를연결할것을추천한다. 만약이들부품을구입하기가쉽지않다면, 전자부품상가또는인터넷쇼핑몰의광센서류에서적외선다이오드및적외선트랜지스터제품으로선정하여사용해도무난하다. 실습을위해보드의회로구성을 < 그림 3-24> 와같이구성하여보자. < 그림 3-24> Optical Encoder를이용한속도 Feedback 실습회로 이번실습의전체적인프로그램의구성은다음과같다. //******************************************************************// //*** Main Routine : main(void) ***// //******************************************************************// void main(void) Config_PORT_IO(); // I/O 포트설정 Config_ADC(); // ADC 모듈설정 Config_CCP2_PWM(); // CCP2 모듈설정 ( PWM 모드) Config_CCP1_CAPTURE(); // CCP1 모듈설정 (Compare 모드) Config_UART(); // UART 모듈설정 //*================ The Start of Algorithm =================*// while(1) 225

Motor Control fcn_sw_input(); fcn_ad_conv(); } if(flag_motor_on) fcn_ccp2_duty_update(); } else fcn_ccp2_off(); } } //*================ The End of Algorithm =================*// 이번실습에서는 CCP1 모듈을펄스의폭또는주기를측정하기위해캡쳐(Capture) 모드로사용하고자한다. 다음 < 그림 3-25> 와같이 CCPx 모듈을캡쳐모드사용시 CCPx 핀을통해입력되는신호의상승또는하강에지(Edge) 를감지하고그시간을타이머1(16 비트) 을이용하여측정하는방법이다. 이때의결과값은두개의 8비트레지스터 CCPRxH 및 CCPRxL에각각저장되어 16 비트결과값을얻을수있다. CCP 모듈을캡쳐모드로사용시다음 4 가지경우에대한시간측정이가능하다. Every falling edge : 첫번째하강에지 Every rising edge : 첫번째상승에지 Every 4th rising edge :4번째상승에지 Every 16th rising edge :16번째상승에지 주의할점은 16비트타이머는 0~65535(0~0xFFFF) 범위내에서만카운팅이가능하므로입력되는펄스의주기및마이크로컨트롤러의동작주파수를고려하여타이머카운터레지스터가오버플로우(Overflow) 되지않도록프리스케일러설정에주의해야한다. 226

Chapter 3. DC 모터(Brushed DC Motor) < 그림 3-25> CCP모듈의 Capture 모드블록다이어그램 이제 CCPx 모듈의캡쳐(Capture) 모드사용시기본적으로설정해야할사항에대해살펴보도록하자. 1. CCPx 핀을디지털입력으로설정 (TRISx 비트설정): TRISC2 = 1; // CCP1 사용 2. 타이머1 설정 - 소스클럭설정 : TMR1CS = 0 // Fosc/4 - 프리스케일러설정 : T1CKPS<1:0> = 11; // 1:8 3. CCPx 인터럽터설정 ( 인터럽트사용시) - CCP 인터럽트플래그클리어 : CCP1IF = 0; - CCP 인터럽트사용설정 : CCP1IE = 1; - 주변장치인터럽트사용설정 : PEIE = 1; - 글로벌인터럽트사용설정 : GIE = 1; 4. CCPx 모듈을캡쳐모드로설정 (CCPxCON 레지스터설정) - 캡쳐가발생할에지설정 : CCP1M<3:0> = 0101; //every rising edge 5. 캡쳐데이터초기화 - 캡쳐레지스터클리어 : CCPR1H=0; CCPR1L=0; -타이머1 레지스터클리어 :TMR1H=0;TMR1L=0; 6. 캡쳐시작 - 타이머1 시작설정 : TMR1ON = 1; 227

Motor Control 다음은 CCP1 모듈을캡쳐모드로설정하고인터럽트를사용하기위한코드이다. //*===========================================================*// //*== 4. Capture Module 설정 ( CCP1) ==*// //*== --> Timer1 설정 (TMR1 이용펄스카운팅) ==*// //*== --> RC2 : CCP1를 Capture 모드로설정 ==*// //*== --> Datasheet <11.3 참조> ==*// //*==========================================================*// void Config_CCP1_CAPTURE(void) RC2 = 0; TRISC2=1; // RC2 입력설정(CCP1 입력설정) T1CON = 0; // T1CON 레지스터클리어 TMR1ON = 0; // 타이머 1 Stop TMR1CS = 0; // 타이머 1 소스 = Fosc/4 = 20Mhz/4 = 5Mhz T1CKPS1 = 1; T1CKPS0 = 1; // 1:8 Prescaler // TMR1H:TMR1L 레지스터는 1.6us 마다증가 CCP1IF = 0; CCP1IE = 1; PEIE = 1; GIE=1; CCP1CON = 0b00000101; // Cpature Mode, Every Falling Edge ; 0100 // Capture Mode, Every rising edge : 0101 // Capture Mode, Every 4th rising edge : 0110 // capture Mode, Every 16th rising edge : 0111 CCPR1H = 0; CCPR1L = 0; // Capture 레지스터클리어 TMR1H = 0; TMR1L = 0; // TMR1 레지스터클리어 } TMR1ON = 1; // 타이머 1 Start 이제모터의회전에의해포토센서로부터 CCP1 핀으로펄스가인가되면상승에지마다인터럽트가발생할것이며이때인터럽트처리루틴에서모터의회전속도(RPM) 을계산하면된다. 여기에서유의할점은캡쳐레지스터(CCPR1H:CCPR1L) 에저장된값은타 이머1에의해카운팅된값이므로이를시간으로환산하여모터의속도로계산하여야한 228

Chapter 3. DC 모터(Brushed DC Motor) 다. 아래는모터에부착된휠이반바퀴회전하는데소요된타이머1의카운터값을이용하여 1초및 1 분당회전수로계산한코드이다. void interrupt Interrupt_Service_Routine(void) if(ccp1if) TMR1H = 0; TMR1L = 0; pulse_period_cnt = (unsigned int)(ccpr1h<<8) + CCPR1L; // 반바퀴회전카운터값 pulse_freq = ( (Fcy/T1_PRESCALE) / pulse_period_cnt ) / 2; // 초당회전수(RPS) current_rpm = pulse_freq * 60; // 분당회전수 (RPM) } } CCP1IF = 0; < 그림 3-26> 은듀티사이클을최대로설정하였을경우옵티컬엔코더의신호를측정한파형이다. 아래측정된파형의주기(17.10 ms) 는모터에부착된휠이반바퀴회전하는데소요된시간이므로한바퀴를회전하는데소요된시간은 2개의펄스에대한주기값인 34.20 ms 가된다. 따라서 1초에약 30번회전하고 1분에는 1800번회전하게됨을알수있다. 이것이우리가측정하고자하는모터의회전속도(RPM) 에해당한다. 위의예제코드와같이인터럽트서비스루틴내에서회전속도를계산하고자할때는꼭필요한연산만을사용하고가능한불필요한계산식을배제함으로써가급적최단시간내에연산이수행될수있도록주의해야한다. 또한 C 컴파일러에따라연산을처리하는최적화수준이다르기때문에이점도주의하길바란다. 지금은알고리즘도단순하고코드라인이얼마되지않기때문에크게지장이없겠지만보다다양한주변장치를사용하고알고리즘도복잡해지게될경우에는상황에따라서심각한문제에봉착할수도있게될것이다. 229

Motor Control \ 1 분당회전수(RPM) =(1 초당회전수)x60 =( 주파수/2)x60 =[(1/ 주기 )/2]x60=1774.5[rpm] < 그림 3-26> 옵티컬엔코더(Optical Encoder) 파형측정결과 RS-232 통신은임베디드시스템과 PC간의다양한인터페이스방법중가장쉽고널리사용되는통신프로토콜로써마이크로컨트롤러의 UART 모듈을이용하면손쉽게 RS-232 통신을구현할수있다. 따라서, UART 모듈을이용하면임베디드시스템의정보를 PC에서확인하고더나아가서는 PC 에서임베디드시스템의제어도가능하다. 비주얼 C++ 또는비주얼베이직에관심이있는독자라면이부분에대한노력을좀더기울인다면엔지니어로써좀더좋은경쟁력을확보할수있게될것이다. 이번실습에서는펄스폭변경을위해사용한가변저항의 A/D 컨버터의결과값및 CCP 모듈을이용하여측정한모터의회전속도(RPM) 를 UART(Universal Asynchronous Receiver Transmitter) 를이용하여컴퓨터의하이퍼터미널에데이터를디스플레이하고자하였다. 참고로, UART 모듈은 9600bps / Data 8bit / 1 Stop Bit / No Parity로설정하였으므로하이퍼터미널도이와동일하게설정해야정상적인통신이이루어질것이다. 230

Chapter 3. DC 모터(Brushed DC Motor) //*======================================================*// //*== 5. UART 설정 ==*// //*== --> Datasheet <12.1 참조> ==*// //*======================================================*// void Config_UART(void) TXSTA = 0b00100110; //CSCR=0; TX9=0; TXEN=1; SYNC=0; SENDB=0; BRGH=1; TRMT=1; TX9D=0; RCSTA = 0b10010000; //SPEN=1; RX9=0; SREN=0; CREN=1; ADDEN=0; FERR=0; OERR=0; RX9D=0; SPBRG = Fosc/16/BAURATE-1; // 9600bps See Table 12-3 at Datasheet } RCIF = 0; RCIE = 1; TXIE = 0; 이제 UART 모듈을이용하여한글자를출력하는사용자함수와문자열을출력하는사용자함수를직접만들어보자. void fcn_uart_put_char(char ascii_data) TXREG = ascii_data; while(!trmt); } void fcn_uart_put_string(const char *ptr_string) while(*ptr_string!= 0 ) TXREG = *ptr_string++; while(!trmt); } } 231

Motor Control 이제특정정수형데이터를 PC의화면상에네자리의십진수로표현하기위해네자리의아스키(ASCII) 코드로변경해주는사용자함수를작성해보자. void fcn_uart_send_data(unsigned int digit_4_num) TXREG = digit_4_num/1000 + '0'; while(!trmt); TXREG = (digit_4_num/100)%10 + '0'; while(!trmt); TXREG = (digit_4_num/10)%10 + '0'; while(!trmt); TXREG = (digit_4_num)%10 + '0'; while(!trmt); } 마지막으로인터럽트서비스루틴안에아래의 UART 수신인터럽트발생시데이터를출력하는부분을추가하면된다. 즉, PC에서아무키나누를경우이에상응하는 1바이트의아스키값이 UART 의수신핀으로전송될것이며이때수신인터럽트(RCIF) 가발생하게될것이다. if(rcif) if(rcreg!= 0) fcn_uart_put_string(tx_msg); fcn_uart_put_string("\n\r"); fcn_uart_put_string(" >>ADC Result -->"); fcn_uart_send_data(ad_avg); fcn_uart_put_string(" Motor RPM --> "); fcn_uart_send_data(current_rpm); } } RCIF = 0; 232

Chapter 3. DC 모터(Brushed DC Motor) 3.4.4 DC 모터의 PWM 속도제어 ( 역기전력피드백) 이번장에서는 DC 모터의특징중역기전력(Back EMF) 은속도에비례한다는원리를이용하여모터의회전속도를측정해보자. 이와같이역기전력을이용하는방법은상대적으로저렴한 1~2개의저항만을이용하여모터의회전속도를측정할수있다는장점이있는반면옵티컬엔코더를사용할때와비교했을때측정정밀도가상대적으로낮다는단점을지니고있다. 참고로역기전력은모터가회전할때에만발생하고, 정지해있을경우는영전위가된다는점에유의하자. 실습을위해 < 그림 3-27> 과같이회로를구성하여보자. DC 모터가회전을하는중에상단스위치(SW1) 를끄고(Off), 하단스위치(SW2) 를켠다면(On) 모터의속도에비례하는역기전력전압을저항 R1, R2를이용하여측정할수가있게된다. 만약상단스위치(SW1) 가켜진상태라면 R1과 R2에는항상 VBUS 전압이측정되므로역기전력측정시이점에유의해야한다. < 그림 3-27> BACK EMF 실습회로구성도 이전실험에서 ADC를이용하여역기전력을측정하는것외에는알고리즘이특별히 추가되는부분은없다. 다음순서도를참조하여코딩을해보자. 233

Motor Control < 그림 3-28> BACK EMF 실습을위한순서도 위의순서도에근거하여작성한아래의메인함수코드를참조바란다. //********************************************************************// //*** Main Routine : main(void) ***// //********************************************************************// void main(void) Config_PORT_IO(); // I/O 포트설정 Config_ADC(); // ADC 모듈설정 Config_CCP2_PWM(); // CCP2 모듈설정 ( PWM 모드) Config_CCP1_CAPTURE(); // CCP1 모듈설정 (Compare 모드) Config_UART(); // UART 모듈설정 while(1) fcn_sw_input(); fcn_ad_conv(0); if(flag_motor_on) 234

Chapter 3. DC 모터(Brushed DC Motor) fcn_ccp2_duty_update(); } if(!sw3) // Press SW3 for measuring BEMF. fcn_bemf_measuring(); } } else fcn_ccp2_off(); } } 다음은 PWM을통해 Duty Cycle을변경하면서 Optical Encoder로측정한 RPM과함게 Back EMF 측정결과(ADC 값) 를보여주고있다. < 그림 3-29> BEMF 실험디스플레이결과 Back EMF의장점은단순히비용이저렴한저항만가지고도모터의회전속도를측정할수있다는점이다. 반면에 Optical Encoder를사용하여측정한경우와비교하면그 측정오차가매우심하다는것을알수있다. 이는 ADC 의정밀도때문이아니라, 실제 235

Motor Control 로 Back EMF 측정시그편차가상대적으로크다는것을오실로스코프를이용하여측정해보면확인할수있다. 다음은 Optical Encoder와 Back EMF를이용했을때상대적인정밀도를확인할수있는실험결과이다. 실험방법은 Duty Cycle을최대로하여모터의회전속도를일정하게유지한상태에서측정한결과이다.OpticalEncoder로측정한회전속도는실제로오실로스코프를이용하였을때와거의오차가없다고볼수있다. 다만실험하고있는모터가정밀제어를위한모터가아닌관계로회전속도의오차를가지고있는것으로판단된다. < 그림 3-30> BEMF 실험디스플레이결과 a 이상적인파형(1800 rpm) b 노이즈가섞인파형(1800 rpm) < 그림 3-31> 역기전력(Back EMF) 파형측정결과 236

Chapter 3. DC 모터(Brushed DC Motor) 3.4.5 DC 모터 PWM 양방향속도제어 (Full-Bridge) 지금까지 DC 모터를이용하여단일방향속도제어에대해살펴보았다. 이제양방향속도제어로써유일한방법인풀- 브리지(Full Bridge) 회로를이용한속도제어및방향제어에대해살펴보도록하자. PIC16F887 디바이스의특징중하나는 ECCP(Enhanced Capture/Compare/PWM) 모듈을내장하고있다는것이다. 이는기존의 CCP(Capture/Compare/PWM) 모듈의기능뿐만아니라개선된기능으로서하프-브리지및풀-브리지구동회로를위한구동신호를손쉽게구현할수있도록 P1A, P1B, P1C, P1D등의최대 4개의 PWM 출력포트를제공하고있다. 이들포트를이용하여먼저풀- 브리지회로를구성하면 < 그림 3-32> 와같다. <1> 상기회로와같이구성하면, 상단의 P채널 FET 및하단의 N채널 FET 는모두 "High" 출력시동작(Active High) < 그림 3-32> 풀- 브리지(Full Bridge) 회로구성 그러면이제 ECCP 모듈에대해하나씩살펴보도록하자. ECCP 모듈의고급 (Enhanced) PWM 모드설정은 8비트 CCP1CON 레지스터의 P1M<1:0> 및 CCP1M<3:0> 비트를이용한다. 237

Motor Control 1. P1M<1:0> :PWM출력설정비트 1) CCP1M<3:2> = "00", "01", "10" 중하나로설정되었을경우 -xx: P1A핀은 Capture/Compare 입력으로할당, P1B, P1C, P1D핀은 I/O 포트로할당 2) CCP1M<3:2> = 11로설정되었을경우 -00: 단일출력설정 P1A : PWM 출력 P1B, P1C, P1D : I/O 포트로할당 -01: 풀- 브리지출력 ( 정회전) P1D : PWM 출력 P1A : Active 출력 (High or Low) P1B, P1C : Inactive 출력 (Low or High) -10: 하프-브리지출력 P1A, P1B : PWM 출력 (Dead Band Control 적용) P1C, P1D : I/O 포트로할당 -11: 풀- 브리지출력 ( 역회전) P1B : PWM 출력 P1C : Active 출력 (High or Low) P1A, P1D : Inactive 출력 (Low or High) 2. CCP1M<3:0> :ECCP모드선택비트 - 0000 : Capture/Compare/PWM off (ECCP 모듈리셋) - 0xxx : Capture 또는 Compare 모드설정 ( 데이터시트참조) -1100:PWM 모드 P1A, P1C : Active High 출력설정 P1B, P1D : Active High 출력설정 -1101:PWM 모드 P1A, P1C : Active High 출력설정 P1B, P1D : Active Low 출력설정 - 1110 : PWM 모드 P1A, P1C : Active Low 출력설정 P1B, P1D : Active High 출력설정 - 1111 : PWM 모드 P1A, P1C : Active Low 출력설정 P1B, P1D : Active Low 출력설정 < 그림 3-33> ECCP 모듈설정을위한 CCP1CON 레지스터설명 238

Chapter 3. DC 모터(Brushed DC Motor) < 그림 3-34> 는고급(Enhanced) PWM 모드의동작을이해하기위한블록다이어그램이다. 기본적인동작은이전에설명했던단일 PWM과동일하게타이머2에의해주기및펄스폭이제어된다. 다만 4가지모드중선택된모드에따라서 4 개의포트(P1A, P1B, P1C, P1D) 로사용자설정에의해정해진패턴의펄스가출력된다는점이다. <1> PWM 출력으로사용하는핀은 TRISx 레지스터를출력("0") 으로설정 <2> CCP1CON 레지스터를클리어하면, PWM 출력핀으로사용안됨 ( 동작중지) <3> PWM 출력으로사용하지않는핀은 I/O핀등다른기능으로사용가능 < 그림 3-34> ECCP 모듈의고급(Enhanced) PWM 모드블록다이어그램 우리가실습할회로는 4개의 FET가모두 Active High 에서동작하도록구성되어있다. 따라서 CCP1M<3:0> 비트는 "1100" 으로설정하고, P1M<1:0> 비트를 "01" 또는 "11" 로설정함에따라서정회전및역회전펄스출력을얻을수있게된다. 즉, < 그림 3-35> 와같이 P1M<1:0> 비트를 "01" 로설정하면, P1A 핀은 "High" 를출력하고 P1D 핀은 PWM 신호 (Active High) 를출력하며이때 P1B, P1C 핀은모두 "Low" 를출력하게되며풀-브리지에연결된모터는결과적으로정회전을하게될것이다. 반면 P1M<1:0> 비트를 "11" 로설정하면, P1C 핀은 "High" 를출력하고 P1B 핀은 PWM 신호(Active High) 를출력하며이때 P1A, P1D 핀은모두 "Low" 를출력하게되며풀-브리지에연결된모터에흐르는전류의방향이반대로바뀌고결과적으로반대방향으로회전하게될것이다. 239

Motor Control < 그림 3-35> Active High 설정시고급(Enhanced) PWM 출력 우리가사용할회로에서는편의상구동회로를 Active High로구성하였지만상황에따라서 Active High 및 Active Low 회로를구성하게된다면이에맞게 CCP1M<3:0> 비트를설정해주면된다. DC 모터의정/ 역회전을위해실습에서사용할풀-브리지를위한 PWM 출력유형은 < 그림 3-36> 과같다. 그림에서주기의역수인 PWM 주파수는타이머2 및 PR2 레지스터 에의해결정되며, 펄스의폭은 CCPR1H:CCP1CON<5:4> 의 10비트값에의해결정되어 진다. < 그림 3-35> 에서는 P1B 및 P1D핀의신호가 100% 듀티사이클의신호로되었지만실제로는 PWM 형태의변조된신호가출력된다고생각하면된다. 이제풀- 브리지모드에서정/ 역회전의방향전환에대해살펴보도록하자. DC 모터의양방향제어를위한풀-브리지모드에서방향전환은 P1M<1:0> 비트값의설정을변경하면다음 PWM 사이클에서변경된방향에해당하는펄스가출력된다. 이때발생하는펄스의출력변화는 < 그림 3-36> 과같다. PWM 출력(P1B, P1D) 은 Inactive 상태로전환 Inactive 출력(P1A, P1C) 는반대방향으로구동하기위한출력으로전환 새로운 PWM 출력은다음사이클에서부터재현 240

Chapter 3. DC 모터(Brushed DC Motor) < 그림 3-36> 풀-브리지모드에서방향전환발생시출력변화 < 그림3-37> Active High 설정시정역회전출력 / 241

Motor Control 이외에도신뢰성있는제어를보장하기위한기능으로써자동정지모드 (Auto Shutdown Mode), 자동재기동모드(Auto Restart Mode), 데드타임추가모드 (Programmable Dead Band Delay Mode), 펄스스티어링모드(Pulse Steering Mode) 등이제공되고있으며이에대한자세한설명은데이터시트로대체하고자한다. 만약 DC 모터를적용하여제품을개발하고자한다면상기내용을필히숙지하여고급기능들이반영된보다신뢰성있는제품을개발할수있기를권장한다. 실습에앞서전체적인프로그램구성을살펴보면 < 그림 3-38> 과같다. 이전실습에서추가된부분은모터의정/ 역회전을위해 ECCP 모듈을사용한다는것과방향및속도의지령치는가변저항의중심값즉, 10비트 ADC 변환값의절반인 512를기준으로이보다작을경우에는정회전, 클경우에는역회전의목표속도( 듀티사이클) 로사용하고자한다. 한가지회로구성상모터의역기전력(Back EMF) 은정회전시에만측정이가능하다는점을참조하길바란다. < 그림 3-38> 정/ 역회전실습을위한순서도 다음은 ECCP 모듈을초기화하기위한코드이다. ECCP 모듈을풀-브리지 PWM 모드로사용하기위해 PWM 주파수는타이머2 를이용하여설정하고 CCP1CON 레지스터 에서풀-브리지및 Active High 설정을해주었다. 우리가실습하게될회로에서사용된 242

Chapter 3. DC 모터(Brushed DC Motor) 4 개의스위치소자(MOSFET) 는드라이버소자와의구성에의해 Active High로구성되어있음에유의하길바란다. /*===========================================================*// //*== 3. Full Bridge 설정 ( CCP1) ==*// //*== --> PWM Freq. = 20kHz 설정 ==*// //*==========================================================*// void Config_CCP1_FULL_BRIDGE(void) RC2 = 0; RD5 = 0; RD6 = 0; RD7 = 0; TRISC2 = 0; TRISD5 = 0; TRISD6 = 0; TRISD7 = 0; TMR2IF = 0; T2CKPS1=0; T2CKPS0 = 0; // P1A : output 설정 // P1B : output 설정 // P1C : output 설정 // P1D : output 설정 // TMR2 Interrupt Flag 초기화 //1:1Prescaler // T_tmr2 = ( Tosc * 4 ) x (# of Prescaler)= 0.2 us PR2 = 250-1; // Period of PWM(T_pwm) = (PR2+1) x T_tmr2 = 50 us // Freq. of PWM(F_pwm) = 1/T_pwm = 20 khz CCP1CON = 0b00000000; //P1M1 P1M0 =?? // 01 = Full-Bridge output forward; P1D modulated; P1A active; P1B, P1C inactive // 10 = Half-Bridge output; P1A, P1B modulated with dead-band control; // P1C, P1D assigned as port pins // 11 = Full-Bridge output reverse; P1B modulated; P1C active; P1A, P1D inactive // CCP1M3=1; CCP1M2 = 1; CCP1M1 = 0; CCP1M0 = 0; // P1A,P1C - Active High, P1B,P1D - Active High CCPR1L = 0; DC1B1 = 0; DC1B0 = 0; // 비트값만 '0' 으로초기화 TMR2ON = 1; // Timer2 start // while(!tmr2if); // Timer2 동작후새로운PWM cycle 이시작확인후, CCPx 핀출력으로설정 }; 243

Motor Control 다음은 CCP2 모듈을캡쳐(Capture) 모드로사용하기위한설정코드이며, 참고로이전실습에서는 CCP1 모듈을이용하여캡쳐를하였으나 ECCP 모듈이 CCP1에서지원하고있는관계로 CCP2 모듈로변경하였으며타이머1등의설정은모두이전과동일하다고볼수있다. 한가지주의할점은실습코드에서 CCP2 인터럽트를사용하였으며이때사용되는인터럽트플래그인 CCP2IF 비트가헤더파일에는선언되어있으나 HITECH C PICC 컴파일러의 V9.60 Lite 버전에서참조할수없다는에러가발생하고있다. 이는컴파일러의버그로보이며현재 HITECH 사에확인중에있으며이후버전업그레이드시반영될것으로예상된다. 현재로서는 PIR2 레지스터를이용하여 CCP2IF 비트가위치한 PIR2 레지스터의 0 번째비트를직접액세스하는방법이해결책으로보인다. //*===========================================================*// //*== 4. Capture Module 설정 ( CCP2) ==*// //*== --> Timer1 설정 (TMR1 이용펄스카운팅) ==*// //*== --> RC1 : CCP2를 Capture 모드로설정 ==*// //*== --> Datasheet <11.3 참조> ==*// //*==========================================================*// void Config_CCP2_CAPTURE(void) RC1 = 0; TRISC1=1; // RC1 입력설정(CCP2 입력설정) T1CON = 0; // T1CON 레지스터클리어 TMR1ON = 0; // 타이머 1 Stop TMR1CS = 0; // 타이머 1 소스 = Fosc/4 = 20Mhz/4 = 5Mhz T1CKPS1 = 1;T1CKPS0 = 1; // 1:8 Prescaler // TMR1H:TMR1L 레지스터는 1.6us 마다증가 //CCP2IF = 0; CCP2IE = 1; PEIE=1; GIE = 0; // CCP2 Interrupt Flag 클리어 // CCP2 Ineterrupt 사용 // Peripheral Interrupt 사용 // Global Interrupt 미사용 CCP2CON = 0b00000101; // Cpature Mode, Every Falling Edge ; 0100 // Capture Mode, Every rising edge : 0101 // Capture Mode, Every 4th rising edge : 0110 // capture Mode, Every 16th rising edge : 0111 CCPR2H = 0; CCPR2L = 0; TMR1H = 0; TMR1L = 0; // Capture 레지스터클리어 // TMR1 레지스터클리어 } TMR1ON = 1; // 타이머 1 Start 244

Chapter 3. DC 모터(Brushed DC Motor) 다음은모터의정/ 역회전및듀티사이클을처리하는루틴이다. 이전에도설명했듯이 풀- 브리지모드에서모터의정/ 역회전은 P1M<1:0> 비트를 "01( 정회전)" 또는 "11( 역회전)" 으로설정만해주면된다. //********************************************************************// //*** DC모터정회전 ***// //*** CCP1CON 모드변경 ***// //********************************************************************// void Motor_Forward(void) // Set forward Motor Speed CCP1CON = 0b01001100; // P1M1 = 0; // P1M0 = 1; // 01 = Full-Bridge output forward // CCP1M3=1; CCP1M2 = 1; CCP1M1 = 0; CCP1M0 = 0; fcn_eccp_duty_update(); TMR2ON = 1; } flag_motor_running = 1; //********************************************************************// //*** DC모터역회전 ***// //*** CCP1CON 모드변경 ***// //********************************************************************// void Motor_Backward(void) // Set Backward Motor Speed CCP1CON = 0b11001100; // P1M1 = 1; // P1M0 = 1; // 11 = Full-Bridge output reverse // CCP1M3=1; CCP1M2 = 1; CCP1M1 = 0; CCP1M0 = 0; fcn_eccp_duty_update(); TMR2ON = 1; } flag_motor_running = 1; 245

Motor Control 다음은모터의급제동을위한브레이크기능및모터정지시 ECCP 모듈을미사용모드로설정하기위한코드이다. 풀-브리지회로에서모터의급제동을위한방법은상단에위치한 2 개의스위치소자(MOSFET) 를끄고, 하단에위치한 2개스위치소자 (MOSFET) 를켜는것만으로놀라운제동효과를확인할수있을것이다. 참고로상대적으로대용량의모터를사용할수록더큰제동효과를눈으로확인할수있을것이다. //********************************************************************// //*** DC모터정지 ***// //*** No Brake ***// //********************************************************************// void Motor_Stop(void) CCP1CON = 0; RC2 = 0; RD5 = 0; RD6 = 0; RD7 = 0; TMR2ON = 0; } flag_motor_running = 0; //********************************************************************// //*** DC모터 Braking ***// //*** With Brake ***// //********************************************************************// void Motor_Brake(void) if(flag_motor_running) CCP1CON = 0; RC2 = 0; RD5 = 1; RD6 = 0; RD7 = 1; delay(50000); } } 246

Chapter 3. DC 모터(Brushed DC Motor) 다음은사용자함수들로구성된메인알고리즘이다. //********************************************************************// //*** Main Routine : main(void) ***// //********************************************************************// void main(void) Config_PORT_IO(); // I/O 포트설정 Config_ADC(); // ADC 모듈설정 Config_CCP1_FULL_BRIDGE(); // CCP1 모듈설정 ( Full Bridge 모드) Config_CCP2_CAPTURE(); // CCP2 모듈설정 (Capture 모드) Config_UART(); // UART 모듈설정 while(1) fcn_sw_input(); fcn_ad_conv(0); } } if(flag_motor_on==1) if(sw3) if(flag_motor_forward) Motor_Forward(); else Motor_Backward(); } else fcn_bemf_measuring(); fcn_data_display(); } } else if(flag_motor_running) Motor_Brake(); else Motor_Stop(); } 247

Motor Control 3.5 결론 우리의일상에서가장보편적으로사용되고있는 DC 모터는구동및제어가용이하다는점뿐만아니라가격이상대적으로저렴하기때문에모터제어입문자들을위한최상의실습대상이라판단된다. 비록깊이있게다루지는못하였지만지금까지의실습과정으로만족하지말고고급응용기술로발전할수있도록호기심과도전정신을발휘하여주기를바란다. 참고로,DC 모터의실습은본서적에포함된데모보드를이용하여수행하였으며, 실습에사용된 DC 모터(NT-720R) 는온라인쇼핑몰에서저가에쉽게구매할수있는제품으로선정하였다. 프로그래밍및디버거를위한툴은마이크로칩의저가형 PICkit2 Debug Express(DV164121) 또는중저가형 MPLAB ICD2(DV164007) 을사용할것을권장한다. 본교재에서다루지못한사항이나부족했던점들은한국마이크로칩웹사이트 (www.microchipkorea.com) 를통해지원할예정이며, 관련자료및전체실습코드또한웹사이트를통해지속적으로업데이트하도록노력하겠다. 참고및추천문헌 1. AN905: Brushed DC Motor Fundamentals (DS00905A, Microchip) 2. AN893: Low-Cost Bidirectional Brushed DC Motor Control Using the PIC16F684 (DS00893A, Microchip) 3. AN696: PIC18CXXX/PIC16CXXX DC Servomotor Application (DS00696A, Microchip) 4. AN847: RC Model Aircraft Motor control (DS00847A, Microchip) 5. DC Motor Control Tips & Tricks (DS41233B, Microchip) 6. PIC MCU CCP and ECCP Tips & Tricks (DS41214B, Microchip) 7. AN898: Determining MOSFET Driver Needs for Motor Drive Applications (DS00898A, Microchip) 8. PICDEM Mechatronics Demonstration Board User's Guide (DS51557B, Microchip) 248

CHAPTER 스텝모터 (Stepper Motor) 4.1 4.2 4.3 4.4 스텝모터의개요스텝모터의종류스텝모터의구동스텝모터의제어 4.5 결론

Motor Control 4.1 스텝모터의개요 4.1.1 스텝모터의특징 우리가흔히스텝모터라부르는모터는영어권지역에서는스텝퍼(Stepper) 모터또는스테핑(Stepping) 모터라불리고있다. 국내에서는대부분의엔지니어들이스텝모터라부르고있는점을감안하여본서적에서도스텝모터로명칭을하겠다. 스텝핑(Stepping) 의사전적인의미에서알수있듯이스텝모터는회전자(Rotor) 의움직임( 회전) 이한스텝씩또박또박움직이는모터를말한다. 따라서스텝모터는다른종류의모터에비해상대적으로낮은토크를갖지만위치제어및구동방법에있어서상대적으로용이하다는장점으로인해 CD-ROM 드라이버, 잉크젯프린터, 공작기계및일부가전제품등과같은응용분야에주로사용되고있다. 스텝모터의주요특징들에대해살펴보도록하자. 1. 브러시(Brushless) 가없다. 스텝모터는 DC 모터와는달리브러시(Brush) 가없다. 따라서흔히브러시가부착된모터에서발생하는소음, 전기적아크발생, 짧은수명등의단점을극복할수있다는장점을갖고있다. 2. 부하와독립적이다. 스텝모터는부하가모터의정격토크를초과하지않는범위내에서모터에인가되는부하의양과상관없이설정속도로일정하게회전할수있다. 3. 오픈루프제어가가능하다. 스텝모터는일정한변위즉, 스텝(Step) 으로움직인다. 따라서스텝모터는토크스펙 범위내에서동작하는한별도의센서즉, 피드백(Feedback) 장치없이그위치를알 수있다. 4. 홀딩토크(Holding Torque) 특성을갖는다. 스텝모터는특정위치에서모터의회전축을움직이지않고정지하게할수있는홀딩토크(Holding Torque) 를가지고있어서, 별도의기계적인브레이크장치가필요하지않다. 250

Chapter4. 스텝모터(StepperMotor) 5. 뛰어난응답특성을갖는다. 스텝모터는모터의기동(Start-Up), 정지, 역회전을위한뛰어난응답특성을발휘할 수있다. 6. 저속에서 DC 모터보다상대적으로토크특성이좋다. 스텝모터는낮은속도로회전시에도수있다. DC모터대비상대적으로높은토크를발휘할 4.1.2 스텝모터의구조및원리 4.1.2.1 스텝모터의구조 < 그림 4-1> 스텝모터와 DC모터의단면도 스텝모터는 < 그림 4-1> 에서와같이외부케이스와근접한움직이지않고고정되어있는고정자(Stator) 가되며, 모터의중심부에서회전하는회전축을모터의내부에서감싸고있는부분이회전자(Rotor) 가된다. 스텝모터는아래그림에서와같이고정자는코일권선이감겨져있어서전자석의역할을하게되고, 회전자는영구자석의역할을하게된다. 즉, 고정자에감겨진코일권선에흐르는전류의방향에따라서 N극또는 S극의극성을갖는전기자석이되고, 이들전류의방향을제어함으로써마치전자계 (Electro -Magnetic Field) 가회전하는것처럼만들어주면( 이를회전자계라부름) 회전자(Rotor) 의영구자석이회전자계를따라서회전할수있게된다. 251

Motor Control 참고로이러한측면에서보았을때스텝모터는 DC모터와정반대의구조를갖고있다고볼수도있다. 즉, DC 모터는고정자(Stator) 가영구자석으로되어있으며, 회전자 (Rotor) 에코일권선이감겨져있는구조로되어있다. 스텝모터의구조의이해를돕기위해서 < 그림 4-2> 를살펴보자. < 그림 4-2> 스텝모터의분해도 DC모터는모터의외부로인출된신호선이 2 가닥인반면, 스텝모터는최소 4개이상의신호선이모터의외부로인출되어있으며그색상도서로다르게구분되어있다. 이들신호선들은고정자(Stator) 의코일권선과연결되어있으며, 이들신호선에전류를흘려줌으로써고정자에회전자계를형성할수있게된다. 따라서스텝모터의정확한구동을위해서는스텝모터의스펙을사전에확인함으로써각색상의신호선이고정자의코일권선의어느부위에연결되어있으며어떠한역할을하게되는지반드시확인할필요가있다. < 그림4-2> 의두번째와세번째그림을보면독자들은스텝모터의구조를보다확실하게이해할수있으리라짐작한다. 모터의정중앙에위치하고있는톱니바퀴( 기어) 모양을하고있는부분이회전자(Rotor) 이다. 여기에서소개한스텝모터는회전자(Rotor) 가영구자석으로착자되어있음을세번째그림에서확인할수있다. 세번째그림은베어링을회전자의근처로가져갔더니자석에붙듯이착달라붙는모습을설명해주고있는것이다. 그림이컬러로인쇄되지않아서잘구분은되지않겠지만회전자(Rotor) 의바깥쪽주위에서로대칭으로배치된부분이고정자(Stator) 이며, 고정자에감겨진코일권선의일부분을그림에서확인할수있다. 이코일권선은총 4개의묶음으로되어있으며각각의묶음에연결된신호선이모터의외부로인출되어신호선으로사용될수있는것이다. 252

Chapter4. 스텝모터(StepperMotor) 4.1.2.2 스텝모터의원리 스텝모터에대한이해를위해서고정자(Stator) 에대해좀더살펴보자. 앞에서설명하였듯이모터의중심에위치한회전자(Rotor) 를기준으로주위를감싸는형태로대칭으로배치된철심에코일권선이감겨져있다고상상해보도록하자. 이미감을잡은독자도있겠지만이코일이감긴철심이스텝모터의고정자(Stator) 역할을하게되는것이다. 고정자와회전자와의관계를좀더깊이있게이해하기위해 < 그림 4-3> 을살펴보자. 회전자 0도 b. 회전자 90도 c. 회전자 180도 d. 회전자 270도 a. < 그림4-3> 고정자권선의전류방향에따른회전자의회전시계방향회전 ( ) < 그림 4-3> 은스텝모터의회전자(Rotor) 를시계방향으로회전시키기위한원리및방법에대해설명하기위한그림이다. 스텝모터에는보통 4 선(4 Wires) 의신호선이있다고언급하였는데이들신호선들은위그림에서철심에감겨져있는코일의양단에각각연결되었다고생각하면된다. 따라서이신호선에전압을인가함으로써모터권선에흐르는전류의양과방향을제어하는것이스텝모터제어의기본이된다고볼수있다. 각각의그림에대한자세한설명은다음설명을참조하기바란다. (1) 회전자 0/360도위치 먼저상하로배치된철심에감겨져있는코일에전류를흘려서위쪽에 S 극, 아래쪽에 N 극이형성이된다면자석성분의회전자(Rotor) 는서로반대극성끼리끌어당기는힘에의해서첫번째그림과같이회전자의 N극의위치가 12 시방향에정렬될것이다. (2) 회전자 90도위치 이제좌우로배치된철심에감겨져있는코일에전류를흘려서좌측에극이형성되게한다면철심의한가운데위치하고있는회전자는시계방향으로 N 극, 우측에 S 90도회 전하여결과적으로두번째그림과같이정회전자의 N극은 3 시방향에정렬될것이다. 253

Motor Control (3) 회전자 180도위치 상하로배치된철심에감겨져있는코일의전류방향을앞의 (1) 번과정과정반대로흘려서위쪽에 N 극, 아래쪽에 S극이형성되게하면회전자는시계방향으로 90도회전하여세번째그림과같이 6시방향에회전자의 N 극이정렬되게된다. (4) 회전자 270도위치 좌우로배치된철심에감겨져있는코일의전류방향을앞의 (2) 번과정과정반대로흘려서좌측에 S 극, 우측에 N극이형성되게하면회전자는시계방향으로 90도회전하여네번째그림과같이 9시방향에회전자의 N 극이위치하게된다. 지금까지설명한 (1)~(4) 의과정을반복하게되면스텝모터의회전자(Rotor) 는시계방향으로지속적인회전을하게될것이며, 그반복속도를변화시키면이에따른회전자의회전속도또한비례적으로변화할것이다. 다만회전자가회전할수있는속도의범위에는기계적또는물리적으로한계가있으므로이는해당스텝모터의스펙을참조하여야할것이다. 지금까지는스텝모터의시계방향구동에대해설명을드렸다. 그렇다면역회전즉, 시계반대방향으로구동하고자한다면어떻게해야할지생각해보자. 엔지니어링센스가있는독자라면이미그해답을알고있을것으로예상된다. 이미설명했듯이모터의회전방향은회전자(Rotor) 를감싸고있는고정자(Stator) 의회전자계에의해서결정되므로고정자의회전자계를 < 그림 4-4> 와같이역순이되도록코일에흐르는전류를제어해주면된다. 각각의그림에대한자세한설명은 < 그림 4-3> 에서했던설명으로대체하며독자여러분의몫으로돌리고자한다. a. 회전자 0 b. 회전자 -90 c. 회전자 -180 d. 회전자 -270 < 그림 4-4> 고정자권선의전류방향에따른회전자의회전( 반시계방향회전) 254

Chapter4. 스텝모터(StepperMotor) 4.2 스텝모터의종류 스텝모터는영구자석(Permanent Magnet), 가변릴럭턴스(Variable Reluctance) 및하이브리드(Hybrid) 타입의크게 3가지종류로구분하며이들스텝모터의구분은회전자의특성에따라서결정되어진다. 회전자가영구자석으로자화(magnetized) 되어있는형태의모터를영구자석형스텝모터라하며, 가변릴럭턴스형스텝모터의회전자는자석의성분은갖지않지만마치기어의톱니와같이회전자의표면에홈이새겨져있다. 끝으로하이브리드형스텝모터는이들 2가지특성의모두가지는형태의스텝모터를말한다. 이제각각의스텝모터에대해좀더자세히살펴보도록하자. 4.2.1 영구자석스텝모터 (PermanentMagnetSteppingMotor) 영구자석형스텝모터는앞서설명했듯이모터의중심에위치한회전자(Rotor) 가 N/S 극성을갖는영구자석으로자화되어있으며고정자(Stator) 에는일정방향으로코일권선이감겨져있는형태로이루어져있다. 따라서그회전원리는고정자(Stator) 에감겨져있는코일권선에전류를흘려주게되면코일의감긴방향과전류의방향에의해서고정자주위에전자기력이발생하게될것이다. 따라서영구자석의특성을갖는회전자는고정자에서발생한전자기력(Electro-Magnetic Force) 의극성과상호작용하는인력과척력에의하여그위치가변화하게될것이며, 이러한과정을일정한패턴으로반복하게되면회전자를우리가원하는방향과속도로지속적으로회전시킬수있는원리가된다. a 회전자(2 극)/ 고정자(2 상) b 회전자(6 극)/ 고정자(4 상) < 그림4-5> 영구자석형스텝모터단면도 255

Motor Control < 그림 4-5> 는영구자석형스텝모터의내부단면을설명하는그림이다. 그림 a의스 텝모터는회전자의자석이 2 개의극(N 극, S 극), 고정자권선이 4 개의상( 권선) 으로구 성된경우이다. 그림 b는회전자에 4개의극을추가하여총 6 개의극, 고정자에 4개의 상을추가하여총 8 개의상( 권선) 으로구성되어있는경우이다. 위두개의스텝모터의 가장큰차이점은그림 a의회전자(2 극) 는궁극적으로 90 도간격( 스텝) 으로회전을제어 할수있는반면, 그림 b의회전자(6 극) 는 45 도간격( 스텝) 으로회전할수가있게된다. 그이유에대해서는다음에설명할영구자석형스텝모터의회전원리에대해고찰해보고독자스스로고민해보기를바란다. 4.2.1.1 영구자석스텝모터의동작원리 영구자석형스텝모터의회전원리를이해하기위해필요한기초지식은이미우리머릿속에자리잡고있을것이다. 기억이날지는모르겠지만어릴적초등학교교과목에서자석과전자석등의원리에대해서배웠기때문이다. 이러한지식은중고등학생시절물리과목에서, 대학생시절전자기학등과같은교과목을통해서이미배우고터득했으리라짐작한다. 그래도기억이나지않는독자는이번기회에먼지쌓인학창시절의교과서를다시꺼내보기를바란다. 이해를돕고자가장간단한영구자석형스텝모터인회전자가 2 극(pole), 고정자가 4 상(phase) 인경우에대해그림을통해설명하고자한다. < 그림 4-6> 의경우, 회전자를한바퀴회전시키기위해필요한고정자권선의전류통전방법은 4 가지만존재한다. 즉, 이 4가지고정자권선의통전상태에의해회전자는 90 /180 /270 /360 간격으로정렬될수있으며, 이러한변화를빠른시간에연속적으로발생할수있도록제어하는것이스텝모터회전의원리이다. 아래그림에서 45 /135 /225 /315 의위치에회전자가정렬된그림은회전자의회전관성에의해서회전자의위치가변이되는과정을보여주기위한그림이다. 이와같은영구자석형스텝모터의원리를제대로이해하고있으면이후에소개될풀- 스텝핑, 하프-스텝핑및마이크로-스텝핑등의제어방법을적용하여스텝모터의구동및제어를어렵지않게수행할수있게될것이다. 256

Chapter4. 스텝모터(StepperMotor) a 회전자 0 위치 b 회전자 45 위치 c 회전자 90 위치 d 회전자 135 위치 e 회전자 180 위치 f 회전자 225 위치 g 회전자 270 위치 h 회전자 315 위치 i 회전자 360 위치 < 그림 4-6> 영구자석형스텝모터의회전원리 4.2.2 가변릴럭턴스스텝모터 (Variable Reluctance Stepping Motor) 가변릴럭턴스모터(Variable Reluctance Motor) 는가변스위치드릴럭터스모터 (Variable Switched Reluctance Motor) 또는줄여서 SR 모터라고부르기도한다. 이모 257

Motor Control 터는자기저항(Magnetic Reluctance) 의원리를이용하는데여기에서자기저항이란자기회로에서자기력선속( 자속,Magnetic Flux) 에대하여생기는자기저항력으로, 전기회로에서의저항과대응되는개념이며그값은자기회로의길이에비례하고, 그단면적과투자율에반비례한다. 이들모터는고정자에보통 3~5 개의쌍으로이루어진권선( 맞은편권선과서로연결되어있음) 이공통단자(Common Terminal) 에연결되어있으며, 회전자는자석성분은없으며연철(Soft-Iron) 재질의톱니(Teeth) 모양으로되어있다. 4.2.2.1 가변릴럭턴스스텝모터의동작원리 < 그림 4-7> 의그림-a 와같이가변릴럭턴스모터의고정자권선중 1번에전류를흘려주면, 서로대칭으로배치된 1번권선의방향과나란하게자속이형성되며회전자는이자속에대한자기저항즉, 릴럭턴스값을최소화하기위한위치즉, 공극(Air Gap) 이최단거리가되는위치로이동하게된다. 즉고정자의 1 번폴(pole) 과연철(Soft Iron) 성분의회전자톱니(Teeth) 가최단거리를유지하고자하는힘이발생하게되며이로인해그림 b와같은상태를유지하게될것이다. 따라서 4 쌍(Pair) 의고정자권선중어느것에전류를흘려주느냐에따라서이후의회전자의움직임즉, 회전방향이결정되게된다. a 모터등가회로 b 가변릴럭턴스모터의단면도 < 그림 4-7> 가변릴럭턴스모터 이와같은원리로인해회전자가한바퀴(360 ) 를회전하기위해서는고정자권선이 4쌍이므로그 2배에해당하는총 8 스텝(Step) 이필요하게되며회전자는한스텝당 45 회전하게됨을알수있다. 따라서고정자권선의쌍이많을수록한스텝당회전각도는감소하게되므로보다정밀한제어가가능하게됨을짐작할수있다. 258

Chapter4. 스텝모터(StepperMotor) a고정자권선1 통전(0 ) b고정자권선2 통전(45 ) c고정자권선3 통전(90 ) d고정자권선4 통전(135 ) e고정자권선1 통전(180 ) f고정자권선2 통전(225 ) g고정자권선3 통전(270 ) h고정자권선4 통전(315 ) i고정자권선1 통전(360 ) < 그림 4-8> 가변릴럭턴스모터의각스텝(Step) 별회전자위치 259

Motor Control 4.2.3 하이브리드스텝모터 (HybridSteppingMotor) 하이브리드형스텝모터는앞에서설명한영구자석형스텝모터와가변릴럭턴스스텝모터의조합으로구성되었다고볼수있다. 하이브리드형스텝모터의회전자(Rotor) 는 < 그림 4-9> 와같이많은가변릴럭턴스스텝모터와유사한형태의톱니를매우많이가지고있으며, 이들톱니바퀴들은 N극과 S 극으로자화( 磁化 ) 되어있기때문에영구자석모터의특성을가지게된다. 또한, 회전자의톱니는자기력선속( 자속,Magnetic Flux) 이고정자와회전자사이의공극(Air Gap) 을최소화할수있는경로(Path) 를제공해줌으로써회전자의움직임을발생시키는요소를제공해준다. 따라서하이브리드스텝모터는그복잡한구조에서알수있듯이영구자석타입및가변릴럭턴스타입의스텝모터와비교했을때상대적으로정지(Holding) 토크및구동(Dynamic) 토크특성등이상당히개선될수있다는장점을가지는반면비용이증가하게된다는단점을가지고있다. a하이브리드스텝모터 b고정자 c회전자 d회전자홈( 확대) < 그림 4-9> 하이브리드스텝모터의구성 하이브리드스텝모터의동작원리에대한설명에앞서고정자권선및회전자의배치에대한이해가필요하다. 이들코일로구성된고정자권선과영구자석으로된회전자의배치는 < 그림 4-9> 와같다. 고정자권선배치에서의가장큰특징으로써각각의모터권선쌍(A, A', B, B') 이상호대칭으로배치되어있으며, A와 A', B와 B' 는서로수직으로연결되어있음에유의하자. 이제모터구동전류의경로에대해살펴보자. 만약권선 A를통해흘러들어간다면그전류는권선 A' 를통해전류가빠져나올것이며반대로권선 A' 를통해전류가유입된다면권선 A 를통해빠져나올것이다. 물론권선 B와 B' 에서도동일한경우에해당한다. 하이브리드스텝모터의동작원리에대한설명에앞서 < 그림 4-10> 의모터권선의 260

Chapter4. 스텝모터(StepperMotor) 배치및회전자의극성배치에대해다시한번확인해주기를바란다. 고정자및회전자각각의톱니의정렬기준에있어서회전자의기어를기준으로각각 1/2 간격차이가있도록배치가되어있음에유의하기바란다. a 모터권선배치 b 회전자및고정자상세설명 < 그림 4-10> 하이브리드스텝모터의고정자권선및회전자 4.2.3.1 하이브리드형스텝모터의동작원리 이제하이브리드스텝모터의회전자를시계방향으로구동하기위해 < 그림 4-11> 의 각각의스텝에대해살펴보도록하자. (1) 스텝 1 ( 전류방향 : A A', B B') 하이브리드스텝모터의 4개의권선중 A 및 B 에 " 양(+)" 전압, A' 및 B' 에 " 음(-)" 전압을인가하여전류의방향을 A A', B B' 가되도록하는과정이다. 회전자는회전자톱니사이즈를기준으로 1/2 스텝을회전하게되며, 그결과고정자의톱니중 PHASE B, B' 확대그림을통해회전자의 N 극/S극톱니와각각 1/2 씩마주보는위치에있는것을확인할수있다. 즉회전자는 1/2 스텝을시계방향으로회전한결과가된다. (2) 스텝 2 ( 전류방향 : A' A, B B') 하이브리드스텝모터의 4개의권선중 A 및 A' 권선의전압극성을바꿔주어전류의방향을반대로해준다. 즉, A' 및 B 에 " 양(+)" 전압, A 및 B' 에 " 음(-)" 전압을인가하여전류의방향을 A' A, B B' 가되도록하는과정이다. 회전자는회전자톱니사이즈를기준으로 1/2 스텝을회전하게되며, 그결과고정자의톱니중 PHASE A, A' 확대그림을통해회전자의 N 극/S극톱니와각각 1/2 씩마주보는위치에있는것을확인할수있다. 즉회전자는 1/2 스텝을시계방향으로회전한결과가된다. 261

Motor Control a 스텝 1 (A A', B B') b 스텝 2 (A' A, B B') c 스텝 3 (A' A, B' B) d 스텝 4 (A A', B' B) < 그림 4-11> 하이브리드스텝모터의고정자권선및회전자 (3) 스텝 3 ( 전류방향 : A' A, B' B) 하이브리드스텝모터의 4개의권선중 A 및 B' 권선의전압극성을바꿔주어전류의방향을반대로해준다. 즉, A' 및 B' 에 " 양(+)" 전압, A 및 B 에 " 음(-)" 전압을인가하여전류의방향을 A' A, B' B 가되도록하는과정이다. 회전자는회전자톱니사이즈를기준으로 1/2 스텝을회전하게되며, 그결과고정자의톱니중 PHASE B, B' 확대그림을통해회전자의 N 극/S극톱니와각각 1/2 씩마주보는위치에있는것을확인할수있다. 즉회전자는 1/2 스텝을시계방향으로회전한결과가된다. (4) 스텝 4 ( 전류방향 : A A', B' B') 하이브리드스텝모터의 4개의권선중 A 및 A' 권선의전압극성을바꿔주어전류의방향을반대로해준다. 즉, A 및 B' 에 " 양(+)" 전압, A' 및 B 에 " 음(-)" 전압을인가하여전류의방향을 A A', B' B 가되도록하는과정이다. 회전자는회전자톱니사이즈를 262

Chapter4. 스텝모터(StepperMotor) 기준으로 1/2 스텝을회전하게되며, 그결과고정자의톱니중 PHASE A, A' 확대그림을통해회전자의 N 극/S극톱니와각각 1/2 씩마주보는위치에있는것을확인할수있다. 즉회전자는 1/2 스텝을시계방향으로회전한결과가된다. 위와같은 4개의스텝을순차적으로반복함으로써회전자는시계방향으로회전을하게되며, 위 4가지스텝의순서를역순으로수행하게되면회전자의방향은반대가될것이며회전자가반시계방향으로회전하는결과를얻게될것이다. 또한하이브리드스텝모터의 1 스텝당회전자의이동각도는회전자및고정자의기어의개수에의해서결정되어질것이다. 4.2.4 스텝모터의종류별비교 < 표 4-1> 은지금까지설명한 3 가지종류의스텝모터의특성을비교한것이다. 비용측면에서는제조공정에따라서차이가있으며, 영구자석및가변릴럭턴스의혼합형인하이브리드스텝모터의비용이가장높게발생한다. 모터의정밀도측면에서는가변릴럭턴스및하이브리드타입의스텝모터가 1 스텝당 1.8 이하의제어가가능하기때문에일반적으로정밀제어분야에많이응용되고있다고볼수있다. 모터를구동시켜야하는엔지니어관점에서는구동방법에대해서도관심을갖고확인해야할것이다. 표에서보는바와같이가변릴럭턴스스텝모터는일반적으로 "Full Step" 방법만을사용할수있지만, 영구자석및하이브리드타입의스텝모터에대해서는제조스펙에따라서 "Full Step", "Half Step", "Micro-Stepping" 과같이모든스텝모터구동방법을적용할수있다. 스텝모터의구동방법에대해서는이후자세히설명을하도록하겠다. < 표4-1> 스텝모터종류별특성비교 영구자석스텝모터 가변릴럭턴스스텝모터 하이브리드스텝모터 비용 낮음 중간 높음 설계성 보통 간단 복잡 정밀도 1 스텝당 3~30 1 스텝당 1.8 이하 토크 vs 속도 - 고속에서낮은토크손실 - 소음낮음높음낮음 구동방법 Full, Half, Micro-stepping Full Step Full, Half, Micro-stepping 263

Motor Control 4.3 스텝모터의구동 4.3.1 바이폴라(Bipolar) 와유니폴라(Unipolar) 이해 스텝모터의구동에앞서꼭기억해야할사항이있다. 본장을시작하면서스텝모터의신호라인에대해잠깐언급한적이있는데, 스텝모터의고정자측에감겨져있는코일즉, 모터권선의외부로인출된리드선이모터제어를위한신호라인이되며유형에따라바이폴라(Bipolar, 양극성) 와유니폴라(Unipolar, 단극성) 스텝모터로구분할수있다. 바이폴라스텝모터와유니폴라스텝모터의구분을위해 < 그림 4-12> 를살펴보자. a 바이폴라(Bipolar) < 그림 4-12> b 유니폴라(Unipolar) 바이폴라및유니폴라비교 바이폴라스텝모터는 < 그림 4-12 a> 에서와같이고정자에감겨진코일의각끝단에리드선이연결되어있기때문에리드선즉, 모터의외부로유출된신호선은 4선인경우가많다. 바이폴라스텝모터의가장큰특징은코일에연결된리드선 1-2 및 3-4 를통해전류의양방향흐름이가능하며, 유입된전류는모터권선의전체를흐르게되는점이특징이다. " 바이폴라(Bipolar, 양극성)" 라는이름은이와같은전류의양방향특성으로인해붙여졌다고볼수있다. 유니폴라스텝모터는바이폴라스텝모터의리드선 4개외에도각각의코일권선의중간에추가적인리드선이각각인출되어있다. 즉, 2 개의센터탭(Center Tap) 이추가되어일반적으로총 6 선의리드선이모터의외부로유출되어있다. 이들 2개의센터탭에 는스텝모터의구동전압원(Supply Voltage) 이공급된다. 또한나머지각코일의끝단 264

Chapter4. 스텝모터(StepperMotor) 4 개는상황에따라순차적으로그라운드(Groud) 로연결하게된다. 따라서유니폴라스 텝모터의경우전류방향은센터탭(3, 6 번) 에서리드선(1, 2, 4, 5 번) 을통해서단방향 으로만흐르게된다. 또한바이폴라스텝모터와는달리유니폴라스텝모터의전류는코 일권선의절반(1/2 구간) 만을통과하게된다. 따라서 " 유니폴라(Unipolar, 단극성)" 라는 이름은전류가한쪽방향으로만흐르게되는특성으로인해붙여졌다고볼수있다. 유 니폴라스텝모터의신호선은 5개또는 6개가모터의외부로유출되어있는데그구분 은센터탭에연결된리드선이서로공통으로묶여서인출될경우는 5 개가되며, 각각 인출될경우는 6 개가된다고볼수있다. 유니폴라와바이폴라는구동방법및모터스펙, 구동회로등에있어서상호차이점 이있지만여기에서는굳이언급하지않겠다. 앞으로이어질프로그램실습등을통해 다양한구동회로, 알고리즘등을직접체험하면서그차이점을고민해보고느껴볼수 있기를바란다. 4.3.1.1 바이폴라(Bipolar) 스텝모터구동원리 바이폴라스텝모터는 < 그림 4-13> 과같이고정자권선의 4 개의코일탭(Tap) A, A',B,B' 에전압을순차적으로인가함으로써전류의방향을양방향으로제어할수있다. 결과적으로고정자에회전자기장을순차적으로발생시킴으로써회전자가시계방향으로 회전하게되는원리를보여주고있다. 자세한설명은 < 그림 4-13> 으로대체하며, 이후 프로그램실습을통해대신하고자한다. a 회전자 0 위치 ( 전류방향:B B') b 회전자 90 위치( 전류방향:A' A) 265

Motor Control c 회전자 180 위치 ( 전류방향:B' B) d 회전자 270 위치( 전류방향:A A') < 그림 4-13> 바이폴라스텝모터구동원리 4.3.1.2 유니폴라(Unipolar) 스텝모터 유니폴라스텝모터는 < 그림 4-14> 와같이고정자권선의 4 개의코일탭(Tap) 외에각코일의중간에연결된센터탭(Center Tap) 이있으며, 이센터탭에모터의구동전압을인가하고나머지코일의끝단탭은순차적으로그라운드(Ground) 에연결함으로써고정자에순차적으로회전자기장을발생시키고이로인해회전자가시계방향으로회전하게되는원리를보여주고있다. 참고로센터탭에그라운드(0 V) 를인가하고나머지코일의끝단탭에순차적으로양(+) 전원을연결할수도있다. a 회전자 0 위치 ( 전류방향:V+ B') b 회전자 90 위치( 전류방향:V+ A)) 266

Chapter4. 스텝모터(StepperMotor) c 회전자180 위치 ( 전류방향:V+ B) d 회전자 270 위치( 전류방향:V+ A') < 그림 4-14> 유니폴라스텝모터구동원리 4.4 스텝모터의제어 스텝모터의회전각도즉, 스텝각도(Step Angle) 는 < 그림 4-15> 에서보는바와같이한번의스텝에의해회전자가회전( 이동) 한각도로정의하며그제어방식은풀스텝(Full Step), 하프스텝(Half Step), 마이크로스텝(Micro Step) 과같이크게 3가지로구분할수있다. 또한각각의스텝을변화시키는시간즉, 주기에따라서회전속도즉, RPM(Revolution Per Minute) 가결정되며, 회전자가 1회전하기위해필요한총스텝과여기에소요된시간을이용해서계산할수가있다. < 그림 4-15> 스텝핑방법에따른스텝각도 267

Motor Control 4.4.1 풀- 스텝핑 (Full Stepping) 스텝핑모터의풀- 스테핑구동방식은회전자가고정자의특정상(Phase) 에서다음상으로완전히(Fully) 회전( 이동) 하도록하는방식의스텝핑기술을말하며 < 그림 4-15> 와같이회전자는 90 회전하게된다. 풀-스텝핑방법에는회전자권선의전류통전방식에따라서 1상통전방식과 2상통전방식또는 1상여자방식과 2상여자방식으로구분하여부르기도한다. 필자는개인적으로의미전달이쉽다고느껴지는통전방식이라는용어를앞으로사용하도록하겠다. 4.4.1.1 풀스테핑(Full Stepping) - 1 상( 相, Phase) 통전여자 ( ) 방식이해 1 상통전방식은 < 그림 4-16> 에서보는바와같이각각의스텝구간에서오직 1개 의고정자권선에전압이인가되고, 이로인해 1 상의권선에만전류가흐르게된다. 1상 통전방식은여기에서기인한용어로생각하면된다. 아래그림의경우각스텝당회전 자의회전각도즉, 스텝각도는 90 이며, 4스텝을 1주기로회전자는 1회회전하게된 다. 일반적으로 90 각도로제어되는스텝모터는볼수가없으며주위에서흔히보게되 는스텝모터의경우정밀도를높이기위해내부적으로감속기어등을이용하여 1.8, 7.2 등의스텝각도특성을가지고있는경우가대부분이다. 참고로필자가실습에사 용한스텝모터는인터넷쇼핑몰에서저가에쉽게구입할수있는제품을선택하였으며 스텝각도는 7.2 의제품을사용하였다. 이러한종류의스텝모터적용사례는우리주 변에서쉽게발견할수있는데일례로에어컨제품의경우실내기로부터배출되는바람 의방향제어를목적으로사용되며, 실외기의경우냉매의팽창밸브의제어를위해스텝 모터가사용되고있다. a 1 상통전방식의전압시퀀스 b 스텝각도(Angle) < 그림 4-16> 1 상( 相 ) 통전방식전압시퀀스및스텝각도(Angle) 268

Chapter4. 스텝모터(StepperMotor) < 그림 4-16> 과같이스텝각도가 90 인경우에대해서스텝모터의회전속도결정및이를위한제어방법에대해살펴보도록하자. 1 회전당총스텝수 (Steps Per Revolution) : N [steps/revolution] < 예제> 풀(Full) 스텝이 90 인경우, 즉, 회전자가 1회전하기위해필요한총스텝수는 4 회이다. 정확히표현하면 4 [steps/revolution] 이된다. 1 초당펄스수(Pulses Per Second) : P [pps] < 예제> 회전속도 1200[rpm] 을얻기위한초당펄스수? 목표회전속도(RPM) 가 1200[rpm] 인경우, 스텝모터를응용하는분야에서는주로위치제어및속도제어를요구한다. 1상통전방식을사용해서스텝모터를 1200[rpm] 의속도로구동하기위해서는 1초당 80펄스의신호가필요하다는얘기이다. 따라서우리는 1/80[ 초] 인 12.5[ms] 주기로 1상통전제어펄스를스텝모터에입력해주면된다는결론을얻을수있다. 회전각도는스텝각도와펄스수의곱으로계산할수있으므로수식으로표현하지않아도누구나계산할수있을것으로믿는다. 269

Motor Control 그러면, 이제 1 상통전제어의원리에대해살펴보자. 바이폴라스텝모터의 1 상통전방식은 < 그림 4-17> 에서보는바와같이모터의리드선 4개를모터드라이버 IC의출력단에각각연결한후그입력단에마이크로컨트롤러의출력포트(RD4 RD7) 를연결하여구성된다. 이제남은것은마이크로컨트롤러의출력포트로 < 그림 4-17> 과같이출력신호를일정한시간간격으로정해진시퀀스에따라순차적으로출력하면스텝모터는회전하게된다. 아래그림은회전자가시계방향으로회전하는경우를예로들었으며, 반시계방향으로회전시키고자할경우출력펄스의시퀀스를역순으로변경해주면된다. 여기에서주목할점은출력펄스의시간간격에의해서모터의회전속도(rpm) 가결정된다는것이다. a 회전자 90 위치 ( 전류방향:A A') b 회전자 180 위치( 전류방향:B B') c 회전자 270 위치 ( 전류방향:A' A) b 회전자 360 위치( 전류방향:B' B) < 그림4-17> 1 상( 相 ) 통전회로구동원리 즉, 앞의계산식과같이출력펄스를 12.5[ms] 로결정할경우스텝모터의회전속도는 1200[rpm] 이된다. 마이크로컨트롤러에익숙하지않은독자라면 " 딜레이함수(delay()) 를이용하면되겠네!" 라고생각하겠지만마이크로프로세서를효율적으로활용하고자한다 270

Chapter4. 스텝모터(StepperMotor) 면다소어렵고귀찮더라도타이머인터럽트를이용하여제어시간을자유자재로조절할수있는실력을발휘해주기를당부한다. 그러면지금까지언급한사전지식을바탕으로마이크로컨트롤러를이용하여스텝모터를직접구동해보자. 한가지부탁하고싶은점은 " 어라? 모터가진짜도네!" 라는사실만으로만족하지말고, 직접회전속도변경도시도해보고모터의회전축에인가되는부하를변경할때의결과도재현해봄으로써다양한경험들을피부로직접체험해보고고민할수있는기회로활용할것을간절히바란다. 참고로의미전달을집중하고자모든실습은바이폴라스텝모터에대해서만수행할것이며가능하면유니폴라스텝모터에대한실습은독자들의몫으로돌리고자하며유니폴라에대한지원은웹사이트를통해제공하도록하겠다. a 소프트웨어개략도 b 타이머인터럽트서비스루틴순서도 < 그림4-18> 1 상( 相 ) 통전방식제어알고리즘 4.4.1.2 풀스테핑(Full Stepping) - 1 상( 相, Phase) 통전여자 ( ) 방식실습 그러면이제실습보드에서 1 상통전방식을직접구현해보도록하자. 스텝모터의구동에앞서서먼저현재가지고있는스텝모터의외부로유출된신호선의상(A,A',B,B') 을스펙(Specification Sheet) 을확인하여구분할수있어야한다. 만약해당 모터의스펙을확인할방법이없다고해도 < 그림 4-12> 를제대로이해하고있다면저항 271

Motor Control 을측정할수있는멀티미터만가지고도얼마든지구분할수있다. 멀티미터를이용하여측정한모터권선의저항값이모터에표기된고유권선저항값( 보통 10 Ω 내외) 과일치하면두A권선쌍또는 B 권선쌍이된다. 나머지극성은멀티미터를이용하여확인할방법이없으므로풀-스텝핑실습을이용하여정상적인구동이이루어질때의결선으로부터유추해낼수있을것이다. 필자가실습에사용한스텝모터는권선저항이 7.1Ω 이었으며, 사실이와같은실험적인방법을이용하여권선을구분하였다. 이제유니폴라스텝모터의각신호선을마이크로컨트롤러의 PORTD의 4핀을이용하여 < 그림 4-19> 와같이연결하자. 그림에서모터가정/ 역회전을하기위해서는 RD4, RD5, RD6, RD7 또는이의역순으로동신에단하나의핀만을 "High" 로출력하고나머지는 "Low" 를유지하는시퀀스로 PORTD 의출력을제어하기만하면된다. 이때정상적인회전이이루어지려면포트의출력시퀀스의변화주기(Pulse Per Second) 가모터의스펙에서명시된범위를벗어나지않아야하며, 모터의파손을방지하기위해서는공급전원(Vsupply) 또한모터의정격전압을초과하지않도록주의하여야한다. 참고로대부분의스텝모터는 5V, 12V, 24V의세가지중하나의정격전압을가지고있는경우가대부분이다. < 그림4-19> 1 상통전여자 ( ) 실습회로도 272

Chapter4. 스텝모터(StepperMotor) 이제실전으로코드를작성해보도록하자. 다음은 I/O 포트, ADC, 타이머 0 를초기화하는코드이다. 여기에서타이머 0는스텝모터의펄스출력주기(PPS) 를제어하기위한기준타이머로써 1ms 로설정되었다. //********************************************************************// //*** I/O PORT 입출력설정 ***// //*** RA4 : 입력(SW2) ***// //*** RD4~7 : 출력( 스텝모터) ***// //********************************************************************// void Config_PORT_IO(void) TRISA4 = 1; // RA4 : 입력설정 } PORTD = 0x00; // RD0~RD7 : 초기값 "Low" 설정 TRISD = 0x00; // RD0~RD7 : 출력설정 //*============================================================*// //*== 2. ADC 모듈설정 ==*// //*== --> AN0, : 아날로그입력 ==*// //*============================================================*// void Config_ADC(void) TRISA0 = 1; // RA0 : 입력설정 ANS0 = 1; // AN0 아날로그입력으로사용 (VR) ADCS1 = 1; ADCS0 = 0; // AD Clock = Fosc/32 = 20M/32 = 0.625Mhz // Tad = 1.6us CHS3 = 0;CHS2 = 0;CHS1 = 0;CHS0 = 0; // ADC Channel Select : AN0 핀으로설정 } VCFG0=0; // ADC 의+ Ref 전압: AVDD 핀의전압으로설정(Vdd) VCFG1 = 0; // ADC의 - Ref 전압 : AVSS 핀의전압으로설정(Vss) ADON = 1; // ADC 모듈 : ON ADFM = 0; // ADC 결과값 : Left Justify (ADRESH/L:xxxxxxxx xx------) GODONE = 0; // ADC Converstion : STOP 273

Motor Control //********************************************************************// //*** TIMER0 및인터럽트설정 ***// //*** 스텝모터의속도제어용(RPM --> PPS 환산 : 인터럽트) ***// //*** Timer0 인터럽트발생주기1ms 설정(TMR0=?) ***// //********************************************************************// void Config_TIMER0(void) T0CS = 0; // Internal Instruction Cycle Clock 이용 // --> Timer0 기준 Clock : Fcy(=Fosc/4) PSA = 0; // Prescaler를 Timer0 모듈에이용 PS2 = 1; // Prescaler --> 1:64 PS1 = 0; // TMR0는 64*(1/Fcy)= 64*Tcy 마다 1 씩증가한다. PS0 = 1; // Fosc=20Mhz 일경우, Fcy = 5Mhz, // ---> 64*Tcy = 64*0.2us = 12.8 [us] TMR0 = 178; // (256-178) * 12.8[us] = 1000[us] = 1[ms] } // Datasheet <Fig.14-7> Interrupt Logic 참조 T0IF = 0; // Timer0 Interrupt Flag : Clear 설정 T0IE = 1; // Timer0 Interrupt : Disable 설정 GIE = 1; // Global Interrupt : Enable 설정 //( 보충설명) TMR0 레지스터가 Overflow 발생시 T0IF 가 "Set(1)" 되며, // GIE=1 & T0IE=1 조건에서인터럽트서비스루틴으로분기한다 다음은가장중요한풀- 스텝구동제어를위한코드이다. 먼저가장중요한부분은스텝모터를구동하기위한펄스출력의시퀀스를찾아내는것이다. 필자가사용한스텝모터는 < 그림 4-19> 와같이구동회로를구성하였을경우다음과같은펄스출력의시퀀스를갖고있음을직접실험을통해서찾아내었다. const unsigned char full_step_1ph_ccw[4] = 0x10, 0x20, 0x40, 0x80 }; // 정회전 const unsigned char full_step_1ph_cw[4] = 0x80, 0x40, 0x20, 0x10 }; // 역회전 위의펄스를일정한시간마다출력해주기위해아래와같이펄스출력시퀀스의순서를변경해주는코드를작성한다. 274

Chapter4. 스텝모터(StepperMotor) //********************************************************************// //*** Full Stepping Function ***// //*** PPS 제어및 Step 펄스출력/ Timer0 인터럽트에서호출됨 ***// //********************************************************************// void fcn_full_step(void) if(timer_1ms < (1000/target_pps)) return; timer_1ms = 0; // 방향전환에따른 Pulse 증/ 감보상 if(flag_motor_forward!= flag_dir_prev) if(flag_motor_forward == CW) pulse_cnt++; } else pulse_cnt--; } } // 시계방향회전 if(flag_motor_forward == CW) if(pulse_cnt >= FULL_STEP_MAX) pulse_cnt=0; // Full Stepping : 4 PORTD = full_step_1ph_cw[pulse_cnt]; pulse_cnt++; } // 반시계방향회전 else if(pulse_cnt < 0) pulse_cnt = FULL_STEP_MAX-1; // Full Stepping : 4 } PORTD = full_step_1ph_cw[pulse_cnt]; pulse_cnt--; } flag_dir_prev = flag_motor_forward; // 회전방향저장 275

Motor Control 위의펄스시퀀스제어함수는타이머 0 인터럽트서비스루틴에의해서호출이되어진다. 따라서모터제어루틴은다음과같이타이머 0 인터럽트를사용(Enable) 또는미사용(Disable) 으로설정함으로써스텝모터의제어여부를결정할수있다. //********************************************************************// //*** Step Motor Control Disable ***// //*** 모든 Pulse 출력을 Off로하고 Timer0 동작중지 ***// //********************************************************************// void fcn_motor_off(void) PORTD = 0; // Pulse Ouput : cleared T0IE = 0; } //********************************************************************// //*** Step Motor Control Enable ***// //*** Timer0 인터럽트 Enable ***// //********************************************************************// void fcn_motor_on(void) T0IE = 1; // Timer0 인터럽트 : Enabled } 이제가변저항의위치에따른스텝모터가회전할방향및속도를결정하기위한 A/D 컨버젼을위한코드에대해살펴보자.10비트 A/D컨버전에서그중간값은 512가될것이다. 따라서중간값인 512 를기준으로이보다작을때는시계방향(CW) 으로회전하고, 이보다클경우에는반시계방향(CCW) 으로회전을시키고자하며, 중심값으로부터의변위를스텝모터의속도지령치로사용하고자하였다. 지금까지작성한사용자함수를이용하여다음과같이메인알고리즘을구성하면된다. 276

Chapter4. 스텝모터(StepperMotor) //*************************************************************// //*** Main Routine : main(void) ***// //*************************************************************// void main(void) Config_PORT_IO(); Config_ADC(); Config_TIMER0(); while(1) fcn_ad_conv(); } if(target_pps) else fcn_motor_on(); fcn_motor_off(); } < 그림 4-20> 은 250[pps] 의속도로정회전및역회전으로스텝모터를구동한경우의펄스출력이다. 그림에서보면하나의펄스의폭은 4ms(=1/250pps) 가되며, 펄스의출력시퀀스가서로반대가됨을확인할수있다. 또한, 전체 4개의각구간에대해서항상단한개의펄스만온(ON) 으로출력이되고나머지3 개의펄스는오프(OFF) 로출력되므로전기자의한상만통전이된다는것도확인할수있을것이다. < 그림 4-21> 에서일그러져보이는파형은모터의회전에의해발생하는역기전력전압에해당한다. a 정회전 (CW) b 역회전 (CCW) < 그림4-20> 1 상통전여자 ( ) 제어펄스파형(250pps) 277

Motor Control a 정회전 (CW) b 역회전 (CCW) < 그림4-21> 1 상통전여자 ( ) 제어모터전압파형(250pps) 4.4.1.3 풀스테핑(Full Stepping) - 2 상( 相, Phase) 통전여자 ( ) 이해 2 상통전방식은 < 그림 4-22> 에서보는바와같이각각의스텝구간에서동시에 2 개의권선에전압이인가되기때문에결과적으로 2상의권선에모두전류가흐르게된다. 따라서 2상통전방식은 1상에만전류가흐르던방식인 1상통전방식에비해산술적으로약 2 배의토크출력이가능해진다. 각스텝당회전자의회전각도즉, 스텝각도는 90 이며, 4스텝을 1주기로회전자는 1 회회전하게된다. 따라서 2상통전방식을이용할경우에도각스텝에따른회전은 1 상통전방식과동일하다. a 1 상통전방식의전압시퀀스 b 스텝각도(Angle) < 그림4-22> 2 상통전여자 ( ) 전압시퀀스및스텝각도 그러면, 이제 2 상통전제어의원리에대해살펴보자. 278

Chapter4. 스텝모터(StepperMotor) a 회전자 45 위치 (A A', B' B ) b 회전자 135 위치(A A', B B') c 회전자 225 위치 (B B', A' A) b 회전자 315 위치(A' A, B' B) < 그림4-23> 2 상( 相 ) 통전회로구동원리 바이폴라스텝모터의 2 상통전방식은위의 < 그림 4-23> 에서보는바와같이모터의 리드선 4개를모터드라이버 IC의출력단에각각연결한후그입력단에마이크로컨트 롤러의출력포트(RD4 RD7) 를연결하여구성한다. 결국, 이전에소개한 1상통전의경 우와동일하다는얘기이다. 차이점은마이크로컨트롤러의출력포트로 < 그림 4-23> 과같 이동시에 2개의상에각각전류가흐를수있도록일정시퀀스로출력신호를출력한다 는점이다. 따라서일정한시간간격으로펄스를출력해주면스텝모터의회전자는그림에 서와같이시계방향으로회전하는경우를예로들었으며, 반시계방향으로회전시키고자 할경우출력펄스의시퀀스를역순으로변경해주면된다. 가장주목해야할점은고정자의 2상이동시에통전되기때문에고정자의자기장에의 한 회전자의정렬위치가 1상통전의경우와는달리항상대각선으로정렬된다는점이 다. 이러한특성은이어지는세번째실습에소개될하프- 스텝핑(1-2 상통전방식) 의 기본원리가된다. 279

Motor Control a 소프트웨어개략도 b 타이머인터럽트서비스루틴순서도 < 그림4-24> 2 상( 相 ) 통전방식제어알고리즘 4.4.1.4 풀스테핑(Full Stepping) - 2 상( 相, Phase) 통전여자 ( ) 방식실습 그러면이제실습보드에서 2 상통전방식을직접구현해보도록하자. 회로의구성은앞의 1 상통전방식과동일하게구성을한다. 또한프로그램소스코드도동일하게사용할수있으며다만스텝모터를구동하기위한펄스출력의시퀀스만아래와같이변경하여주면된다. const unsigned char full_step_2ph_ccw[4] = 0x30, 0x60, 0xC0, 0x90 }; const unsigned char full_step_2ph_cw[4] = 0x90, 0xC0, 0x60, 0x30 }; 끝으로펄스출력을제어하는함수에서위의포트로출력하면된다. 2상통전방식을위한배열을이용하여 280

Chapter4. 스텝모터(StepperMotor) void fcn_full_step(void) // 방향전환에따른 Pulse 증/ 감보상 if(flag_motor_forward!= flag_dir_prev) if(flag_motor_forward == CW) pulse_cnt++; } else pulse_cnt--; } } // 시계방향회전 if(flag_motor_forward == CW) if(pulse_cnt >= FULL_STEP_MAX) pulse_cnt=0; // Full Stepping : 4 PORTD = full_step_2ph_cw[pulse_cnt]; pulse_cnt++; } // 반시계방향회전 else if(pulse_cnt < 0) pulse_cnt = FULL_STEP_MAX-1; // Full Stepping : 4 } PORTD = full_step_2ph_cw[pulse_cnt]; pulse_cnt--; } flag_dir_prev = flag_motor_forward; // 회전방향저장 281

Motor Control < 그림 4-25> 는 250[pps] 의속도로정회전및역회전으로스텝모터를구동한경우의펄스출력이다. 그림에서보면두스텝에해당하는펄스의폭은 8ms(=2/250pps) 가되며, 펄스의출력시퀀스가서로반대가됨을확인할수있다. 또한, 전체 4개의각구간에대해서항상두개의펄스출력이 ON 상태이고나머지두개의펄스출력은 OFF 상태이므로전기자의두상이동시에통전이된다는것도짐작할수있을것이다. 따라서 1 상통전방식에비해산술적으로약 2 배의모터토크를얻을수있게될것이다. a 정회전 (CW) b 역회전 (CCW) < 그림4-25> 2 상통전여자 ( ) 제어펄스파형(250pps) a 정회전 (CW) b 역회전 (CCW) < 그림4-26> 2 상통전여자 ( ) 제어모터전압파형(250pps) 282

Chapter4. 스텝모터(StepperMotor) 4.4.2 하프- 스텝핑 (Half Stepping) 4.4.2.1 하프- 스테핑(Half Stepping) : 1-2 상( 相, Phase) 통전( 여자) 이해 스텝핑모터의하프스테핑구동방식은회전자가고정자의특정상(Phase) 에서다음상으로이동시풀-스텝각도의 1/2(Half) 각도만회전( 이동) 하도록하는스텝핑기술을말하며 < 그림 4-27> 의경우와같이회전자는 45 회전하게된다. 따라서하프스테핑구동방식은스텝각도가풀스테핑구동방식에비해 1/2 로감소하기때문에스텝해상도(Step Resolution) 가 2 배좋아진다고말할수있다. 즉, 회전각도의정밀제어에유리하고회전자의회전특성이상대적으로유연해질수있다. 하프스테핑은 < 그림 4-27> 과같이 1상및 2상여자방식의혼합형으로구성된구동펄스의특성때문에 1-2 상통전( 여자) 방식이라부르기도한다. a 1 상통전방식의전압시퀀스 b 스텝각도(Angle) < 그림4-27> 1-2 상통전여자 ( ) 전압시퀀스및스텝각도 그러면, 이제하프-스텝핑을위한 1-2 상통전제어의원리에대해살펴보자. 283