<4D F736F F D20C0DBC7B0C6ED5FBDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCAD20B0B3B9DF2E646F63>

Similar documents
<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

정보보안 개론과 실습:네트워크

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

실험 5

ATmega128

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

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

Section 03 인터럽트활성화와인터럽트서비스루틴연결 34/82 장치에대한인터럽트설정과활성화 내부장치에대한특수레지스터존재 장치의특성을반영한동작설정용또는상태관찰용비트로구성 인터럽트사건의발생패턴을설정해야함 인터럽트활성화비트를 1 로셋하여, 인터럽트발생을허락» 전제, 전역

Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

K&R2 Reference Manual 번역본

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

RVC Robot Vaccum Cleaner

Microsoft Word - Lab.4

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

실험 5

그룹웨어와 XXXXX 제목 예제

lecture4(6.범용IO).hwp

PowerPoint 프레젠테이션

(b) 연산증폭기슬루율측정회로 (c) 연산증폭기공통모드제거비측정회로 그림 1.1. 연산증폭기성능파라미터측정회로

인터럽트 (Interrupt) 범용입출력포트에서입출력의내용을처리하기위해매번입출력을요구하는플래그를검사하는일 (Pollong) 에대하여마이크로컨트롤러에게는상당한시간을소비하게만든다. 인터럽트란 CPU가현재처리하고있는일보다급하게처리해야할사건이발생했을때, 현재수행중인일을중단하고

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

1. 제품소개 그림. 1.1 이란? DC 모터구동시하드웨어제작에소요되는시간을단축시켜프로그래밍연구개발및학습효과를극대화시켜주는 입니다. 또한당사 DEV 보드와 1P 점퍼클립케이블을이용하여연동이가능하며, 산업용 DC 모터의정회전, 역회전구동및속도제어시유용하게사용되는 입니다.

목차 1. A/D 컨버터개요 2. ATMega128 의 A/D 컨버터기능 3. A/D 컨버터로광센서읽기

[8051] 강의자료.PDF

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - es-arduino-lecture-03

PowerPoint 프레젠테이션

시리얼통신 (USART) 범용동기및비동기시리얼수신기와송신기 (USART) 는매우유연한시리얼통신장치이다. 주요특징은다음과같다. w 송수신레지스터가독립적으로운용되는전이중방식. w 비동기또는동기동작. w 마스터또는슬레이브동기동작. w 고해상도전송속도생성기. w 5, 6, 7

Microsoft PowerPoint - Ch13

Microsoft Word - AM-GYRO-P V02 메뉴얼.doc

6_5상 스테핑 모터_ _OK.indd

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

슬라이드 1

PowerPoint Presentation

목차 1. 키패드 (KeyPAD) 2. KeyPAD 를이용한비밀번호입력기

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

Microsoft PowerPoint - chap05-제어문.pptx

HBE-MCU-Multi 로배우는 마이크로컨트롤러 (AVR 편 ) 마이크로컨트롤러기능 제 6 장타이머와카운터

Microsoft PowerPoint - 제5장 인터럽트 (HBE-MCU-Multi AVR).ppt [호환 모드]

Microsoft PowerPoint - polling.pptx

1. 기본설정 목차 1-1. 설치해야할프로그램및파일 1-2. 프로그램올리기 1-3. MAKEFILE 2. 캐릭터 LCD(PORT) 3-1. 개요 3-2. 사용하는레지스터 3-3. Source Code 3-4. 실습사진 3. 타이머카운터및초음파센서활용 (PORT, TIM

실험 5

<BDC7C7E83520BFB9BAF1BAB8B0EDBCAD2E687770>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

M16_32KIT_Manual.hwp

untitled

2주차: 입출력 제어 복습

PowerPoint 프레젠테이션

뉴티씨 (NEWTC) 2. FB-CY4E-DEV (FPGA 개발 키트) 구성도 Port Select SW 7 Segment Text LCD UART RS-232C JTAG PORTA (5V) Active Serial PORTB (5V) OSC. 50MHz Analog

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

API 매뉴얼

Microsoft Word - PEB08_USER_GUIDE.doc

ZPONZCMGOVQK.hwp

KEY 디바이스 드라이버

Stepper Motors

Microsoft PowerPoint - 08-MP-8-ADC

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft Word - LAB_OPamp_Application.doc

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft Word - Lab.7

untitled

CANTUS Evaluation Board Ap. Note

Microsoft PowerPoint - chap06-2pointer.ppt

C & System

슬라이드 1

API 매뉴얼

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

YD-3533.xls

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

KXATUHEFFPYO.hwp

Microsoft Word doc

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

untitled

untitled

Microsoft Word - LKP-RTD 사용자 설명서

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

(SW3704) Gingerbread Source Build & Working Guide

MicrocontrollerAcademy_Lab_ST_040709

chap 5: Trees

Microsoft PowerPoint - AVR 시리얼 통신.ppt [호환 모드]

DSP_MON 프로그램 메뉴얼

<30302E20BEC6C6AEB8E120BDBAC6A9B5F0BFC020BFACBDC0B9AEC1A620C7D8B4E42E687770>

11장 포인터

CAN-fly Quick Manual

중간고사

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

PowerPoint 프레젠테이션

키트전자 KE-RC-B 코드비젼

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

Microsoft Word - AM-2560PRO_V01 메뉴얼.doc

슬라이드 1

Transcription:

테핑라인트레이서개발하기 류대우 (davidryu@newtc.co.kr) 1. 센서보드 적외선센서 1. 적외선센서 (Photo Sensor) 라인트레이서나마이크로마우혹은다른마이크로로봇에서센서로사용하는것중가장많이사용하는것이 photo sensor입니다. 거리의측정에도사용되지만원거리는잘사용하지않고근거리를측정하고자할때사용되기도하며물체의유 / 무등많은곳에서사용되고있습니다. Photo sensor는보통적외선을많이이용하고있습니다. 발광부와수광부로나눌수있습니다. 발광부는일반 LED와비슷하지만가시광선을내는것이아니고적외선을발산합니다. 수광부는적외선이들어온양에따라아날로그전압이출력되게됩니다. 이아날로그신호를디지털신호로바꾸어 MCU에서인식하여사용합니다. 수광부는빛의양에따라서저항값이변하는가변저항으로생각해도됩니다. 2. Photo Sensor 회로도 왼쪽다이오드가발광부이고오른쪽트랜지터처럼생긴것이수광부입니다. 발광부는일반 LED와같이 330옴을달아주면적외선이나옵니다.

수광부에는 1M~2M정도의저항을달아주는데이보다저항이더커져버리면값이너무커지고, 전류가너무적게흐르기때문에적당히달아야합니다. 포토센서의수광부는일종의 TR입니다. BASE 입력대신적외선이들어가면위치가연결되어 Corrector와 Emiter 에전류가흐르고, 적외선이없으면위치가끊어져서전류가흐르지않는다고생각하시면됩니다. 전류가흐르면 센서입력 이라고명시한 Node에전압이걸리고그전압을컨버팅해서적외선이얼마나들어왔는지알수있습니다. 또는연산증폭기의비교기능을이용하여입력이있음과없음으로바꾸어마이크로컨트롤러에입력할수있습니다. 위그림과같이센서의방광부와수광부감지하기위한물체방향을바라보게합니다. 정당한거리를기준으로반사가가장많이되도록살짝꺽어줍니다. 물체가접근하면수광부에감지되는적외선의양이많아져서전압이올라가고멀어지면감지되는적외선의양이작아져전압이내려가게됩니다. 위그림과같이라인을감자할수있도록라인간격을고려하여센서 2개의위치를정한다. 약 2Cm 정도간격으로한다.

3. Photo Sensor 신호의입력적외선센서의신호는아래와같이아날로그신호로출력이된다. 실제로멀티미터로출력 V 를측정하면센서에물체가접근할때전압이증가하는것을볼수있을것이다. 회로설계에따라반대로물체가접근할때전압이감소할수도있다. 위와같은아날로그신호를 MCU에서인식하는방법에는 OP-Amp 를사용하거나 Analog-Digital Converter 를사용하여입력받는방법이있다. F/W 프로그래밍을하기전에멀티미터 ( 테터 ) 또는오실로코프를이용하여센서거리에따라서전압값이바뀌는지확인해본다. 4. H/W 구성 #2 (Analog-Digital Converter 를사용하는방법 ) Analog to Digital Converter는아날로그신호를디지털신호로바꾸어주는역할을하는장치이다. 이를이용하여아날로그신호를 MCU에서인식할수있는디지털신호로바꿀수있다. 아래그림은아날로그신호를 3bit ADC 를이용하여디지털로변환하는것이다.

MCU F/W 프로그래밍 (ATMega128 의예 ) 1. AD 컨버터를초기화한다. ( 인터럽트사용여부, 공급되는클럭, 데이터포멧등을초기화한다.) void adc_init(void) ADCSRA = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; ADCSRA = 0xC6; 2. 원하는채널의컨버팅을시작한다. void startconvertion(unsigned char ch) ADMUX = 0x20 (ch & 0x0f); // 컨버팅채널선택 ADCSRA = 0xc7; // 컨버팅시작 3. 충분한시간이흐른후또는컨버팅완료된것을확인한후에컨버팅한값을읽는다. unsigned char readconvertdata(void) volatile unsigned char temp; while((adcsra & 0x10)==0); // 컨버팅완료까지기다림. ADCSRA = ADCSRA 0x10; temp = ADCH; return temp;

ADC 를사용하는센서부회로도

2. 테핑모터구동 (Stepping Motor Control) 1 테핑모터란? 테핑모터란 Step 에의해구동되는모터이다. 4개의모터상이있어서한한진행하면서모터가회전하는것이다. 한당보통 1.8' 씩회전한다. 테핑모터는 AC servo, DC servo 모터에비하여값이싸고정확한각도제어에유리하여우리주위에서쉽게접할수있다. 테핑모터는 pulse에의해 digital적으로제어하는것이가능하므로마이크로컨트롤러에서사용하기에적합한모터이다. 테핑모터는다른모터와달리모터의위치를검출하기위한 feedback없이, 정해진각도를회전하고, 상당히높은정확도로정지할수있다. 그리고, system에적용된뒤에도초기성능이만족되어있으면, 갱년변화가적고, 보수가용이하며, 매우신뢰성이높은 system을구성할수있다. 또다른모터에비해정지시매우큰유지토크 ( 정지토크 ) 가있기때문에전자브레이크등의유지기구를필요로하지않는다. 회전속도에있어서도테핑모터에부여하는 pulse rate에비례하므로임으로제어할수있다. 2 테핑모터구동하기 DC모터는회로는간단하지만제어하는방법이복잡하다. 반면테핑모터는구동회로는상대적으로복잡하지만제어는훨씬쉽다. 테핑모터를구동하기위해서는 L297과 SLA7024를같이사용한다. L297은테핑모터구동에필요한상 ( 클럭 ) 을만들어주기위한것이고 SLA7024는만들어진상 ( 클럭 ) 의전압과전류를증폭시키는역할을합니다. 테핑모터의구동부구성 모터클럭생성부 Stepping motor의여자상 (Step) 을만든다. 증폭부 모터입력신호를증폭하여 Stepping motor를구동한다.

테핑모터의동작 1. 마이크로컨트롤러에서모터구동을위한클럭을발생시킨다. 2. 모터클럭생성부에서입력클럭을기준으로테핑모터를구동을위한 Step 신호를발생시킨다. 3. 증폭부에서는모터클럭생성부에서출력된신호를모터를구동할수있는전압, 전류로증폭하여모터로전달한다. 3 구동방식의종류 - 전류의흐름에따른구분 1. Unipolar 구동각각의 coil에 1개의 transistor가접속되고 transistor를 ON하는것으로서각 coil에전류를흐르게한다. 또그림에서와같이 1방향만의 coil에는전류 ( A -> Com, A' -> Com, B -> Com, B' -> Com ) 밖에흐르지않는다. 이와같이 coil에 1방향밖에전류가흐르지않기때문에 unipolar( 편극성 ) 구동이라부르고있다. 2. Bipolar 구동 Stepping motor 의구동으로는전술한것과같은간단한구성으로끝나는 unipolar구동외에, 회로는복잡하지만저속영역에서의 torque 를개선하는 bipolar 구동이라는방법이있다. 이 bipolar 구동은 motor 의 coil 에교대로전류를흘리도록드라이브한다. 이강좌에서는 bipolar 구동에관하여는다루지않는다. @ 구동방식의종류 - 여자방식에따른구분 Stepping motor 의구동방법은그권선코일에어떤형태로전류를흐르게하는가에따라구별되고있다. 이것은모터의종류에따라서도달라지지만, 가장많이사용되고있는 PM형 stepping motor의 step값 90` 의경우를예로설명한다. 대부분의 Stepping motor의기본적인구조나사고방식은같다. 여기서 A, B, /A, /B 는신호입력에따라전자석으로동작하게된다. 아래나오는신호에서신호입력이들어가면전자석이동작하여축에연결되어있는영구자석을당기게된다.

1. 4 상 motor 의 1 상여자동작 1 2 3 4 A 상 B 상 /A 상 /B 상 위그림은 1 상여자방식의 motor 의동작을위한신호를나타낸다. Step 1 A상에연결된 TR이 On 이되어 A->Com로전류가흐른다. coil에전류가흐름으로써고정자의상은 N,S극으로여자된다. 이때 B 쪽에는전류가흐르고있지않으므로 B 쪽의상은비여자이지만, A쪽의여자에동반해서회전자의영구자석은각각 N 과 S, S 와 N 이결합해서안정한위치에정지한다. 다음에 step 2로진행하면먼저 on 하고있던 A상에연결된 TR 은 off가되고, 대신에 B상에연결된 TR 가 on 이된다. B상에연결된 TR이 on이되면 B -> Com의 coil 에전류가흘러이번에는 90o씩어긋나고있는고정자가여자가된다. 그리고여자위치가이동한것으로회전자도시계방향으로당겨져 90 회전하게된다. 같은방법으로 step 3 과 step 4 의동작을함으로써모터는각 step 당 90 씩진행시켜회전시킬수있다.

앞에서설명한것을그림으로표현하면아래그림과같다. 1 2 A 영구자석 A /B B /B B /A /A A 상만 ON 되고나머지는 OFF B 상만 ON 되고나머지는 OFF 앞에서 90`만큼시계방향으로회전하였다. A 3 4 A /B B /B B /A /A /A 상만 ON 되고나머지는 OFF 앞에서 90`만큼시계방향으로회전하였다. /B 상만 ON 되고나머지는 OFF 앞에서 90`만큼시계방향으로회전하였다.

2. 4 상 motor 의 2 상여자동작 1 2 3 4 A 상 B 상 /A 상 /B 상 기본적인동작은 1상여자방식과동일하다차이점은토크를좋게하기위해 2개의코일을동시에동작시킨다는것이다. 1상여자에비하면전류가많이흐르는단점이있지만정지상의오버슈터나언더슈터가작고과도특성이좋아진다. 3. 4 상 motor 의 1-2 상여자동작 1 2 3 4 5 6 7 8 A 상 B 상 /A 상 /B 상 위그림의 1-2 상여자는전술한 1상여자와 2상여자가교대로반복하는것이다. 따라서회전자는 step 마다 45` 회전한다. 즉 step 각은 maker 가표시하는각도의 1/2 가된다. 1-2상여자는 1상여자와 2상여자의특성을같고있으므로 step rate는배가된다. Step 의각도가다른동작법에비에 1/2 만큼작기때문에 3가지방식중가장성능이좋다. 단점은다른여자방식과같은속도를내려면마이크로컨트롤러에서클럭을 2배로만들어야한다는것이다.

4 H/W 구성모터구동보드회로도

회로설명 J203 은모터제어신호가입력되는커넥터이다. 마이크로컨트롤러에서생성한모터제어신호가들어온다. 제어신호는 U201, U202 SLA7024(7026) 으로입력되어이칩에서모터동작을위한전압으로증폭된다. 증폭된신호는모터연결커넥터인 J201과 J202 로연결되어모터로전달된다. R201 의가변저항은모터의전류를조절해주는가변저항이다. 적당히돌려모터의토크를결정할수있다. 나머지저항과캐패시터는 SLA7024 의기본회로이다. 예전에는모터클럭생성부와증폭부모두를하드웨어적으로구성하였으니모터클럭생성부의경우마이크로컨트롤러에서소프트웨어적으로구현이가능하기때문에여기서는증폭부만을하드웨어로구성하고아래 MCU F/W 파트에서모터구성을위한신호를소프트웨어적으로구현하도록한다. 5 MCU F/W 프로그래밍 step : 현재모터를위한출력값 switch(step) case 0x03 : step = 0x06; break; case 0x06 : step = 0x0c; break; case 0x0c : step = 0x09; break; case 0x09 : step = 0x03; break; default : step = 0x03; break; step : 다음모터출력위의루틴을한번실행할때마다모터가 1.8` 회전한다. 이루틴을 Timer 인터럽트루틴에서실행하면모터가타이머속도에맞게돌아가게된다. 위루틴을응용하여모터를돌려본다. 먼저 Main 함수에서 Delay 를적당히주고모터를회전시킨다. void main (void) char step = 0; while(1)

step = nextmotorclk(step); // 위의 switch case 문을응용해서작성 PORTD = step; // PORTD 에출력신호가연결되었있다. Delay(100); 지금까지는모터회전을확인하기위한단계이다. 모터구동회로가정상적으로제작되었는지모터는정상적으로동작하는지등을확인하기위하여작성하였다. 다음단계로 Timer Interrupt 를이용하여모터를구동해야한다. 타이머인터럽트에관련된사항을학습하여테트해보도록한다.

3. 기구부제작 1. 기구부제작알루미늄판을이용하여라인트레이서프레임을구성하였다 i. 테핑모터일반적으로 4 5V 용테핑모터를구매하면적당하다. 일반적으로테핑모터에는정격전압의 3배이상을걸어사용한다.

ii. 라인트레이서바퀴라인트레이서의바퀴는일반인이쉽게제작을할수없기때문에전문판매점에서구매하였다. iii. 라인트레이서바디제작하기테핑모터와바퀴를구매하였으면라인트레이서의구조물에해당하는바디를제작해야한다. 바디제작은청계천에서알루미늄판을구매하여직접가공함으로써제작할수있다.

앞바퀴는글루건을이용하여고정하있다.

4. 프로그래밍 1. 라인트레이서란? 라인트레이서는정해진주행선을따라움직이는자율이동로봇이다. 현재공장자동화부분에서이용되고있는무인반송차가라인트레이서이다. 라인트레이서의기본적인원리는주어진주행선을센서로검출하여이것에따라목적위치까지이동하는것이다. 라인트레이서는크게 3부분 - 컨트롤러부, 센서부, 모터구동부로구성된다. 우선센서부의센서를잘배치해야길을잘인식하고턴마크인식할수있다. 모터구동부분은잡음이많이생기기때문에잘만들지않으면잡음으로인해다른부분이정상적으로동작하지못하는경우가생길수있다. 컨트롤러부는기본적인라인트레이서를제작할때는상대적으로비중이낮으나지능적으로만들려면많은작업이필요로한다. 본강좌에서는라인트레이서를공부하여만들고자하는초보자를위한강좌이므로라인트레이서로서의동작에목표를두고최대한간단하게동작시킬수있도록한다. 2. 라인트레이서의기본동작알고리즘라인트레이서기본동작센서 2쌍을라인의두께보다약간크게위치하여하드웨어를제작할경우센서가라인외곽을따라주행하도록한다. 더복잡하게할수도있지만여기서는위와같이가장간단한알고리즘으로알아보겠다.

1 번상황에서센서는라인을감지하지못하였으므로직진한다. 2 번상황에서오른쪽센서가인식되었으므로왼쪽바퀴의속도를증가시켜라인트레이서를오른쪽으로향하게한다. 3 번상황에서왼쪽센서가인식되었으므로오른쪽바퀴의속도를증가시켜라인트레이서를왼쪽으로향하게한다. 위의동작을반복하면라인트레이서는라인을따라진행하게된다. 3. 프로그래밍하기기본적인 C 언어프로그래밍과인터럽트에관한공부를먼저해야한다. C언어와인터럽트에관련해서는관련서적에서자세히나와있으므로이강좌에서는다루지않는다. 1 타이머인터럽트를이용하여테핑모터구동하기타이머인터럽트를학습하여타이머인터럽트를이용하여테핑모터구동해본다. 라인트레이서는테핑모터를 2개구동해야하기때문에타이머인터럽트를 2개사용하여타이머인터럽트각각바퀴 1개씩을구동하도록한다. 2 센서입력받기센서의입력을받아흰색과검정색을구분할수있도록한다. 시리얼통신을이용하여값을확인하면쉽게할수있다. 3 메인함수와인터럽트루틴간의데이터공유메인함수에서는속도를변경하면타이머인터럽트에서변경된속도값을타이머에적용하여테핑모터의속도를변경할수있도록한다. 그렇게하기위해서는속도값을전역변수로선언하여메인함수와인터럽트루틴이공유할수있도록해야한다. 4 센서입력에따른테핑모터속도변경왼쪽센서입력이있을경우왼쪽테핑모터의속도를감소시키고오른쪽센서입력이있을경우오른쪽테핑모터의속도를감소시키도록프로그램을작성한다.

4. 예제프로그램 1 타이머인터럽트를이용하여테핑모터구동하기아래소는타이머 2 인터럽트의초기화루틴이다. void timer2_init(void) TCCR2 = 0x00; //stop TCNT2 = 0xF1; //setup OCR2 = 0x0F; TCCR2 = 0x04; //start 아래소는타이머 2 인터럽트의인터럽트서비루틴이다. void timer2_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts temp = PORTD & 0x0f; TCNT2 = l_speed; //reload counter value if(l_speed == 0) temp = temp; else temp = motoroneclock(temp, 1); PORTD = temp (PORTD & 0xf0); SEI(); //re-enable interrupts

2 센서입력받기아래소는 AD Convert 의구동소이다. startconvertion 함수는해당채널의컨버팅을시작하라는함수이고 readconvertdata 함수는컨버팅한채널의데이터를읽어오라는함수이다. void startconvertion(unsigned char ch) ADMUX = 0x20 (ch & 0x0f); ADCSRA = 0xc7; unsigned char readconvertdata(void) volatile unsigned char temp; while((adcsra & 0x10)==0); ADCSRA = ADCSRA 0x10; temp = ADCH; temp = ADCL; temp = ADCH; return temp; 3 메인함수루틴다음소는메인함수에서수행되는무한루프로센서가연결되어있는 6번과 7번센서를컨버팅하여변수에저장시키고이것을임계값과비교하여왼쪽바퀴와오른쪽바퀴의속도를결정하도록하였다. void main(void) volatile unsigned char temp, l_sensor, r_sensor; volatile unsigned char step=0; while(1) l_sensor = 0; r_sensor = 0;

startconvertion(6); // Left sensor Converting l_sensor = readconvertdata(); startconvertion(7); // Right sensor Converting r_sensor = readconvertdata(); PORTF = 0x03; if(l_sensor > THRESHOLD && r_sensor < THRESHOLD) l_speed = SLOW_SPEED; r_speed = FAST_SPEED; PORTF = 0x01; else if(l_sensor < THRESHOLD && r_sensor > THRESHOLD) l_speed = FAST_SPEED; r_speed = SLOW_SPEED; PORTF = 0x02; else l_speed = FAST_SPEED; r_speed = FAST_SPEED; printf("ch6 :%d ch7 : %d\n\r", l_sensor, r_sensor); 5. 소코드 // LineTracer Application // Target : M128 // Crystal: 11.059Mhz // Programed by Minsuk Kim #include <iom128v.h> #include <macros.h> #define FAST_SPEED 0x80 // 센서가감지되었을때빠른바퀴의센서값 #define SLOW_SPEED 0x10 // 센서가감지되었을때느린바퀴의센서값

#define THRESHOLD 17 // 센서의라인감지임계값 unsigned char l_speed=0, r_speed=0; // 모터를구동위한타이머값 void port_init(void) PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0xff; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x03; PORTG = 0x00; DDRG = 0x00; // Stepping Motor Port Left, Right // LED Port PF1, PF2 //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x47; //set baud rate lo UBRR0H = 0x00; //set baud rate hi UCSR0B = 0x08;

//ADC initialize // Conversion time: 75uS void adc_init(void) ADCSRA = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; ADCSRA = 0xC6; //TIMER2 initialize - prescale:64 // WGM: Normal // desired value: 1KHz // actual value: 1.008KHz (0.8%) void timer2_init(void) TCCR2 = 0x00; //stop TCNT2 = 0xF1; //setup OCR2 = 0x0F; TCCR2 = 0x04; //start #pragma interrupt_handler timer2_ovf_isr:11 void timer2_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts temp = PORTD & 0x0f; TCNT2 = l_speed; //reload counter value if(l_speed == 0) temp = temp; else

temp = motoroneclock(temp, 1); PORTD = temp (PORTD & 0xf0); SEI(); //re-enable interrupts //TIMER3 initialize - prescale:64 // WGM: 0) Normal, TOP=0xFFFF // desired value: 1KHz // actual value: 1.008KHz (0.8%) void timer3_init(void) TCCR3B = 0x00; //stop TCNT3H = 0xFF; //setup TCNT3L = 0xF1; OCR3AH = 0x00; OCR3AL = 0x0F; OCR3BH = 0x00; OCR3BL = 0x0F; OCR3CH = 0x00; OCR3CL = 0x0F; ICR3H = 0x00; ICR3L = 0x0F; TCCR3A = 0x00; TCCR3B = 0x04; //start Timer #pragma interrupt_handler timer3_ovf_isr:30 void timer3_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts //TIMER3 has overflowed TCNT3H = 0xFF; //reload counter high value

temp = (PORTD & 0xf0)>>4; TCNT3L = r_speed; //reload counter low value if(r_speed == 0) temp = temp; else temp = motoroneclock(temp, 0); PORTD = (temp<<4) (PORTD & 0x0f); SEI(); //re-enable interrupts //call this routine to initialize all peripherals void init_devices(void) //stop errant interrupts until set up CLI(); //disable all interrupts XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory port_init(); uart0_init(); adc_init(); timer2_init(); timer3_init(); MCUCR = 0x00; EICRA = 0x00; //extended ext ints EICRB = 0x00; //extended ext ints EIMSK = 0x00; TIMSK = 0x40; //timer interrupt sources ETIMSK = 0x04; //extended timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized

/* Analog Converter--------------------------------*/ void startconvertion(unsigned char ch) ADMUX = 0x20 (ch & 0x0f); ADCSRA = 0xc7; unsigned char readconvertdata(void) volatile unsigned char temp; while((adcsra & 0x10)==0); ADCSRA = ADCSRA 0x10; temp = ADCH; temp = ADCL; temp = ADCH; return temp; /*-------------------------------------------------*/ void delay(int n) volatile int i,j; for(i=1;i<n;i++) for(j=1;j<600;j++); /* Stepping Motor derive---------------------------*/ unsigned char motoroneclock(unsigned char step, char dir) unsigned char test; step = step & 0x0f; if(dir) switch(step)

case 0x03 : step=0x06; break; case 0x06 : step=0x0c; break; case 0x0c : step=0x09; break; case 0x09 : step=0x03; break; default : step=0x03; break; else switch(step) case 0x03 : step=0x09; break; case 0x06 : step=0x03; break; case 0x0c : step=0x06; break; case 0x09 : step=0x0c; break; default : step=0x03; break; return step; /* main function-----------------------------------*/ void main(void) volatile unsigned char temp, l_sensor, r_sensor; volatile unsigned char step=0; init_devices(); //insert your functional code here... printf(" \n\n\rtest program...\n\r"); PORTF = 0x03; delay(1000); PORTF = 0x00; delay(1000); PORTF = 0x03;

while(1) l_sensor = 0; r_sensor = 0; startconvertion(6); // Left sensor Converting l_sensor = readconvertdata(); startconvertion(7); // Right sensor Converting r_sensor = readconvertdata(); PORTF = 0x03; if(l_sensor > THRESHOLD && r_sensor < THRESHOLD) l_speed = SLOW_SPEED; r_speed = FAST_SPEED; PORTF = 0x01; else if(l_sensor < THRESHOLD && r_sensor > THRESHOLD) l_speed = FAST_SPEED; r_speed = SLOW_SPEED; PORTF = 0x02; else l_speed = FAST_SPEED; r_speed = FAST_SPEED; printf("ch6 :%d ch7 : %d\n\r", l_sensor, r_sensor);

라인트레이서하드웨어구성도 Sensor Atmega128 Board Atmega128 ADC6 ADC7 Stepping Motor Controller PORTD ATMega128 내부장치사용용도 ADC6 왼쪽센서입력 ADC7 오른쪽센서입력 PORTD0-3 왼쪽모터구동포트 PORTD4-7 오른쪽모터구동포트 타이머3 오른쪽모터구동 타이머2 왼쪽모터구동 UART0 디버깅포트