• 검색 결과가 없습니다.

RELAY

6) HLCD

구동 회로도

구동프로그램 그래픽 에 조선대학교를 쓰기

< > LCD

#include <mega16.h>

#include <delay.h>

#define GLCD_A0 PORTC.0

#define GLCD_RW PORTC.1

#define GLCD_E PORTC.2

#define GLCD_CS PORTC.3

#define G_DATA PORTA

#define GLCD_RET PORTD.7

#define GLCD_C PORTC

#define LCD_RS PORTD.0

#define LCD_RW PORTD.1

#define LCD_E PORTD.2

하위 비트만 사용

#define L_DATA PORTB // 4 unsigned int xy_data;

unsigned char font[5][32] =

조 {{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 //

, 0x1F , 0xFC , 0x00 , 0x80 , 0x00 , 0x80 , 0x01 , 0x40 , 0x02 , 0x20 , 0x0C , 0x18 , 0x30 , 0x06 , 0x00 , 0x80 , 0x00 , 0x80 , 0x00 , 0x80 , 0x00 , 0x80 , 0x3F , 0xFE},

선 { 0x00 , 0x00 , 0x00 , 0x00 , 0x04 , 0x08 , 0x04 , 0x08 //

, 0x04 , 0x08 , 0x0C , 0xF8 , 0x0A , 0x08 , 0x11 , 0x08 , 0x20 , 0x88 , 0x40 , 0x48 , 0x00 , 0x08 , 0x00 , 0x08 , 0x10 , 0x08 , 0x10 , 0x00 , 0x10 , 0x00 , 0x0F , 0xF8},

대 { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 , 0x1F , 0x24 //

, 0x20 , 0x24 , 0x20 , 0x24 , 0x20 , 0x24 , 0x20 , 0x24 , 0x20 , 0x3C , 0x20 , 0x24 , 0x20 , 0x24 , 0x20 , 0x24 , 0x21 , 0xA4 , 0x1E , 0x24 , 0x00 , 0x24 , 0x00 , 0x24},

학 { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0x84 //

, 0x00 , 0x04 , 0x3F , 0xE4 , 0x00 , 0x07 , 0x0F , 0x84 , 0x10 , 0x44 , 0x10 , 0x44 , 0x0F , 0x84 , 0x00 , 0x00 , 0x0F , 0xF8 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 , 0x04 },

교 { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 //

, 0x1F , 0xF8 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 , 0x04 , 0x04 , 0x44 , 0x04 , 0x44 , 0x04 , 0x48 , 0x04 , 0x48 , 0x04 , 0x48 , 0x04 , 0x40 , 0x3F , 0xFE}

};

unsigned char flash font3[1024] = {

0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00

이미지 형식의 데이터

//BMP (128*64)

, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x3F , 0xC6 , 0x00 , 0x00 , 0x3F , 0xB6 , 0x0F , 0x00 , 0x3F , 0x36 , 0x00 , 0xC0 , 0x06 , 0x06 , 0x3F , 0xC0 , 0x3F , 0xC6 , 0x30 , 0x06 , 0x3F , 0xB6 , 0x1F , 0x86 , 0x3F , 0x36 , 0x3F , 0xFE , 0x7F , 0xC6 , 0x3F , 0xC6 , 0x0F , 0x1E , 0x30 , 0x06 , 0x0E , 0x36 , 0x39 , 0xC6 , 0x03 , 0xF6 , 0x3F , 0xFE , 0x7F , 0xC7 , 0x00 , 0xC6 , 0x19 , 0x9E , 0x3F , 0xFE , 0x1A , 0x76 , 0x30 , 0xDE

, 0x03 , 0xF6 , 0x07 , 0x70 , 0x31 , 0x87 , 0x00 , 0xC7 , 0x19 , 0x86 , 0x3F , 0xFE , 0x1B , 0x76 , 0x30 , 0xDE , 0x03 , 0x36 , 0x0E , 0x38 , 0x31 , 0x86 , 0x00 , 0xC7 , 0x30 , 0xC6 , 0x30 , 0x06 , 0x1B , 0x36 , 0x39 , 0xC6 , 0x03 , 0xF6 , 0x18 , 0x0C , 0x31 , 0x86 , 0x00 , 0xC6 , 0x00 , 0x06 , 0x30 , 0x06 , 0x31 , 0xB6 , 0x1F , 0x86 , 0x03 , 0xF6 , 0x3F , 0xFF , 0x1F , 0x06 , 0x00 , 0xC6 , 0x00 , 0x70 , 0x3F , 0xFE , 0x31 , 0xB6 , 0x0F , 0x06 , 0x03 , 0x36 , 0x3F , 0xFF , 0x0E , 0x00 , 0x00 , 0x06 , 0x00 , 0xF8 , 0x3F , 0xFE , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x00 , 0x00 , 0x3F , 0xFE , 0x06 , 0x06 , 0x01 , 0x8C , 0x00 , 0x00 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x3F , 0xFE , 0x3F , 0xFE , 0x06 , 0x06 , 0x01 , 0x8C , 0x00 , 0xC0 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x3F , 0xFE , 0x00 , 0x06 , 0x06 , 0x06 , 0x01 , 0x8C , 0x00 , 0xC0 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x06 , 0x06 , 0x06 , 0x00 , 0xF8 , 0x3F , 0xFF , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x06 , 0x3F , 0xFE , 0x00 , 0x70 , 0x3F , 0xFF , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x36 , 0x00 , 0x06 , 0x00 , 0x06 , 0x3F , 0xFE , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xF1 , 0x81 , 0x80 , 0x00 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xF1 , 0x9F , 0xF1 , 0x80 , 0x78 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x31 , 0x9F , 0xFF , 0x80 , 0xDC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x31 , 0x8C , 0x6F , 0x81 , 0x8E , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x31 , 0x8C , 0x6F , 0x83 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x31 , 0x8C , 0x6F , 0x86 , 0x03 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x07 , 0xC1 , 0x88 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xFF , 0x83 , 0x81 , 0x8F , 0xFF , 0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xFF , 0x80 , 0x00 , 0x0F , 0xFF , 0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x01 , 0x8C , 0x00 , 0x00 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x01 , 0x8C , 0x00 , 0x00 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x01 , 0x8C , 0x00 , 0x00 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xFF , 0x8F , 0xFF , 0x80 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0xFF , 0x8F , 0xFF , 0x80 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00

, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x0C , 0x61 , 0x8C , 0x01 , 0xE0 , 0x3E , 0x00 , 0xF8 , 0x07 , 0x83 , 0xF0 , 0x78 , 0x1F , 0x3E , 0x00 , 0xFF , 0x8C , 0x61 , 0x8C , 0x03 , 0xF0 , 0xFF , 0x83 , 0xFE , 0x0F , 0xC3 , 0xF0 , 0xFC , 0x3F , 0xBE , 0x00 , 0xFF , 0x8E , 0x7F , 0xBC , 0x07 , 0x39 , 0xC1 , 0xC7 , 0x07 , 0x1C , 0xE3 , 0x01 , 0xCE , 0x71 , 0xC6 , 0x00 , 0x63 , 0x0E , 0x7F , 0xBC , 0x06 , 0x19 , 0x80 , 0xC6 , 0x03 , 0x18 , 0x63 , 0x01 , 0x86 , 0x61 , 0xC6 , 0x00 , 0x63 , 0x0C , 0x61 , 0x8C , 0x06 , 0x1B , 0x00 , 0x6C , 0x01 , 0x98 , 0x66 , 0x41 , 0x86 , 0x60 , 0xC6 , 0x00 , 0x63 , 0x0C , 0x7F , 0x8C , 0x60 , 0x1B , 0x00 , 0x6C , 0x01 , 0x80 , 0x67 , 0xF0 , 0xFC , 0x61 , 0xC6 , 0x00 , 0x3E , 0x0C , 0x7F , 0x8C , 0x60 , 0x33 , 0x00 , 0x6C , 0x01 , 0x80 , 0xC7 , 0x38 , 0xFC , 0x7B , 0x86 , 0x00 , 0x1C , 0x00 , 0x00 , 0x00 , 0x00 , 0xE3 , 0x00 , 0x6C , 0x01 , 0x83 , 0x82 , 0x19 , 0xCE , 0x3F , 0x86 , 0x00 , 0x7F , 0xFC , 0x00 , 0x00 , 0x01 , 0xC3 , 0x00 , 0x6C , 0x01 , 0x87 , 0x00 , 0x19 , 0x87 , 0x0F , 0x06 , 0x00 , 0x7F , 0xFC , 0x60 , 0x00 , 0x03 , 0x81 , 0x80 , 0xC6 , 0x03 , 0x0E , 0x0E , 0x19 , 0x87 , 0x03 , 0x06 , 0x00 , 0x00 , 0x0C , 0x60 , 0x00 , 0x07 , 0x01 , 0xC1 , 0xC7 , 0x07 , 0x1C , 0x06 , 0x39 , 0xCF , 0x06 , 0x06 , 0x00 , 0x00 , 0x0C , 0x60 , 0x00 , 0x67 , 0xF8 , 0xFF , 0x83 , 0xFE , 0x1F , 0xE3 , 0xF0 , 0xFE , 0x06 , 0x06 , 0x00 , 0x00 , 0x0C , 0x7F , 0xFC , 0x67 , 0xF8 , 0x3E , 0x00 , 0xF8 , 0x1F , 0xE1 , 0xE0 , 0x7C , 0x0C , 0x06 , 0x00 , 0x00 , 0x0C , 0x7F , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 };

비트형 제어명령 함수 void LCD_command(char com_data) //4

{

DDRB = 0xff;

LCD_RS = 0;

명령어 쓰기 모드 LCD_RW = 0; //LCD RS 0, RW 0 =

인에이블 LCD_E = 1; //

상위 비트 전송 L_DATA = ((com_data>>4)&0x0f); // 4

delay_us(1);

LCD_E = 0; //E=0 delay_us(1);

LCD_E = 1;

하위 비트 전송 L_DATA = (com_data&0x0f); // 4

delay_us(1);

LCD_E = 0; //E=0 delay_us(50);

}

비트형 데이터 출력 함수 void LCD_data(unsigned char com_data) //4

{

DDRD = 0xff;

LCD_RS = 1;

데이터 쓰기 모드 LCD_RW = 0; //LCD RS 1, RW 0 =

인에이블

LCD_E = 1; //

상위 비트 전송 L_DATA = ((com_data>>4)&0x0f); // 4

delay_us(1);

LCD_E = 0; //E=0 delay_us(1);

LCD_E = 1;

상위 비트 전송 L_DATA = (com_data&0x0f); // 4

delay_us(1);

LCD_E = 0; //E=0 delay_us(50);

}

void LCD_string(unsigned char comm, unsigned char flash *string) 문자열 데이터 플래시 메모리에 할당

//

-{

위치 데이터 전송 LCD_command(comm); //

while(*string != '₩0') {

LCD_data(*string);

string++;

} }

그래픽 명령어 전송 함수 void GLCD_command(unsigned char comm) // LCD

{

그래픽 선택 신호 GLCD_CS = 0; // LCD

GLCD_A0 = 1;

에 명령어 쓰기 모드 GLCD_RW = 0; // A0 1, RW 0 = LCD

인에이블 GLCD_E = 1; //

포트 를 통하여 명령어 전송 G_DATA = comm; // A

GLCD_E = 0;

그래픽 선택 취소 GLCD_CS = 1; // LCD

}

그래픽 데이터 전송 함수 void GLCD_data(unsigned char data) // LCD

{

그래픽 선택 신호 GLCD_CS = 0; // LCD

GLCD_A0 = 0;

에 데이터 쓰기 모드 GLCD_RW = 0; // A0 0, RW 0 = LCD

인에이블 GLCD_E = 1; //

포트 를 통하여 문자 데이터 전송 G_DATA = data; // A

GLCD_E = 0;

그래픽 선택 취소

GLCD_CS = 1; // LCD }

그래픽 클리어 함수 void GLCD_text_cle(unsigned int cle) // LCD

{

unsigned int i;

커서 위치 선정 명령 GLCD_command(0x46); //

GLCD_data(0x00);

실제 커서 위치 번지 GLCD_data(0x00); // '0000'

그래픽 에 문자 데이터 전송 명령어 GLCD_command(0x42); // LCD

for(i=0;i<cle;i++)GLCD_data(0x00);

번지 부터 번지 까지 으로 채우기 화면 전체를 클리어

//0 4096 0x00 , ?

}

커서 위치 선정 함수 void GLCD_goxy(unsigned int xy) //

{

커서 위치 선정 명령 GLCD_command(0x46); //

GLCD_data(xy & 0x00ff);

바이트 형식의 페이터 파라미터 GLCD_data(xy >> 8); //2

}

도트 형식의 이미지 출력 함수 void font_out() //128*64 BMP

{

unsigned int h,c;

이미지가 표출되는 위치 데이터 xy_data=2023; //

GLCD_goxy(xy_data);

바이트 데이터를 순차적으로 전송 GLCD_command(0x42); // 1024

for(h=0;h<1024;h++) {

GLCD_data(font3[h]);

if(c==15) {

xy_data+=32;

GLCD_goxy(xy_data);

GLCD_command(0x42);

} c++;

if(c==16)c=0;

} }

조선대학교 출력 함수 void data_out() //" "

{

unsigned int i,g,k,l,y,t;

t=1000;

도트 형식의 이미지 출력 함수 호출 font_out(); //128*64 BMP

조선대학교 좌시프트 번지 위치부터 for(y=44;y>23;y--) //" " , 44

번지 위치 까지 이동 23

{

xy_data=y;

g=0;

k=0;

l=xy_data;

그래픽 에 문자 데이터 전송 명령어 GLCD_command(0x42); // LCD

조선대학교 문자를 표출 시키기 위한 문 for(k=0;k<5;k++) //" " 5 for {

도트 형식의 문자로 표출 시키기 위한 문 for(i=0;i<32;i++) //16*16 for

{

문자 데이터를 포트 로 출력 GLCD_data(font[k][i]); // A

바이트 형식의 데이터를 두번 가로로 보내고

if(g==1) //1

아래 칸으로 이동 {

xy_data+=32;

GLCD_goxy(xy_data);

바이트 형식의 데이터를 두번 가로로 보내고 GLCD_command(0x42); //1

아래 칸으로 이동 }

g++;

if(g==2)g=0;

}

도트 형식의 이미지 출력 함수 호출 //font_out(); //128*64 BMP

한글자씩 표출하고 지연되는 시간 delay_ms(t); //

xy_data = l+2;

l+=2;

} t=0;

좌시프트 지연시간 초 지연

delay_ms(500); // 0.5

시프트시 잔상제거 GLCD_text_cle(2022); //

} }

초기화 설정 함수 void GLCD_init(void) //LCD

{

delay_ms(10);

GLCD_command(0x40);

GLCD_data(0x30);

GLCD_data(0x87);

GLCD_data(0x07);

GLCD_data(0x1f);

GLCD_data(0x31);

GLCD_data(0x7f);

GLCD_data(0x20);

GLCD_data(0x00);

GLCD_command(0x44);

GLCD_data(0x00);

GLCD_data(0x00);

GLCD_data(0x7f);

GLCD_data(0x04);

GLCD_data(0x87);*/

GLCD_command(0x4c);

GLCD_command(0x5a);

GLCD_data(0x00);

GLCD_command(0x5b);

GLCD_data(0x0d);

GLCD_command(0x59);

GLCD_data(0x04);

}

초기화 설정 함수 void LCD_init(void) //LCD

{

delay_ms(50);

LCD_command(0x28);

delay_ms(4);

LCD_command(0x28);

delay_us(100);

커서 LCD_command(0x0c); //Display On, Off delay_us(100);

오른쪽으로 증가 화면 시프트 LCD_command(0x06); //Entry mode set - , X?

delay_us(100);

화면 지우기 LCD_command(0x01); //LCD

delay_ms(2);

}

void main(void)

내부 레지스터 초기설정 값

{ //

PORTA=0x00;

포트 를 출력으로 설정 DDRA=0xFF; // A

PORTB=0x00; //?

DDRB=0x0f;

PORTC=0x00;

DDRC=0xff;

PORTD=0x80;

DDRD=0x8f;

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

MCUCR=0x00;

MCUCSR=0x00;

TIMSK=0x00;

ACSR=0x80;

SFIOR=0x00;

그래픽 초기화 함수 호출 GLCD_init(); // LCD

초기화 함수 호출 LCD_init(); //LCD

그래픽 클리어 함수 호출 GLCD_text_cle(4096); // LCD

LCD_string(0x80," LCD graphic ");

LCD_string(0xc0," test ");

while (1) {

data_out();

};

}

서보 모터 제어 8. RC

서보는 관성이 작아 정밀제어가 가능한 모터 즉 DC서보 모터와 5개의 감속기어, 각을 젤수 있는 보륨 가변저항( ), 그리고 제어 회로로 구성된 모듈이다.

일반적으로 R/C서보 혹은 서보라고 부르며 그 용도는 이름 그대로 R/C(Radio Control) 모형에 사용된다. 입력단자는 3개로 그중 빨강은 +4.8~6V전원이고 검정은 0V 그리고 노 랑은 제어용 단자이다.

서보는 -90 ~ 0 ~90◦ ◦ ◦까지의 동작 범위를 가지고 있다.

전원은 4.8V ~ 6V까지 사용되며 조금 넘어도 무리는 가지만 동작은 한다.

토크는 구동축에서 1Cm거리에서 들 수 있는 무게를 나타내는데 1Kg 이하부터

이상까지 다양하다

20Kg .

사이즈는 엄지 손가락만한 것부터 주먹의 반 만한 것까지 있다.

사이즈와 토크는 보통 비례관계이며 무게도 이와 같다.

무게는 10 g여 에서 200g 까지 있다.

각속도는 60◦를 회전 하는 대 걸리는 시간으로 보통 0.15~0.4sec이다.

현제 사용중인 서보는 하이텍사에서 제작한 HS-422모델로 동작 전압은 4.8V ~ 6V 이고 토크는 4.8V 일때 3.1Kg/Cm

이고 6V일때 3.5Kg/Cm 이며 무게는 45.5g으로 Standard형 서보중 하나입니다.

제어방법 1)

의 과 의 이 조합된 신호

20msec low level 0.7~2.3msec high level

로 제어됩니다. high level은 서보의 구동각을 좌우하며 0.7msec는 -90 , 1.5msec◦ 는 0 ,◦ 그리고 2.3msec는 90◦에 대응된다. 서보모터의 제어는 PWM신호를 기반으로 하며, 일반

모터와 달리 일정 주기로 주어야 정확한 각도 조절이 가능하다

DC .

일반적인 PWM 신호는 다음과 같다. 이 PWM신호에서 1이 되는 구간의 시간을 조절함으 로써 서보 모터의 제어가 가능하다. 한주기를 20msec로 하고 1이 되는 시간을 0.7ms로 맞추게 되면 최대 촤향 주기로 서보모터가 최대 좌향으로 이동하게 된다.

이 되는 시간을 로 맞추게 되면 서보 모터의 중간이 된다

1 1.5ms .

이 되는 시간을 로 맞추게 되면 서보 모터의 최대 우향 주기가 된다

1 2.3ms .

이렇게 이 되는 시간을1 0.7ms와 2.3ms 사이의 시간으로 조절하면 원하는 각도로의 회전 이 가능하다.

와 의 특징 2) analog servo digital servo

analog servo

아날로그회로는 구성되어 연속된 입력신호에 의해 제어 각이 결정된다. 신호 자체가 아날로그를 동작시키는 원리로 작동되며 신호가 없으면 모터는 오동작을 하거나 아무동 작을 하지 않은 오픈상태가 된다 전원이 없는 상태와 동일하다. .

제어 펄스의 주기가 토크와 직결되어 주기가 20msec일 때와 5msec일 때의 수치가 다르 다. 실험에 의하면 주기가 짧을수록 토크는 크며 목표 각에 이르는 속도 또한 빠르다. 반면 주기가 길수록 토크는 작아지며 목표 각에 이르는데 오랜 시간이 걸린다. 시간이야 초 이내지만 토크의 차이는 많이 나므로 이점을 고려해가면서 프로그래밍해야 한다

1~2 . .

이는 펄스의 주기를 서보 내에서 모터의 제어 주기로 사용하기 때문에 나타나는 현상으 로 아날로그 서보에서만 나타나는 현상이다. 외부에서 서보에 회전 부하가 걸리면 펄스 의 주기에 맞추어 목표 각으로 가기위한 모터제어가 일어난다. 모터제어는 high level일 때만 일어나며 high level의 시간 값을 각 값으로 이용하므로 주기가 짧으면 그만큼 자 주 모터가 제어 될 것이고 주기가 길다면 모터는 가끔 제어될 것이다 결국 모터의 제어. 량은 일정시간동안은 high level의 총량이 된다.

digital servo

디지털회로로 구성되어 입력신호에 의해 각이 결정되나 아날로그서보와 달리 신호를 로 간주해 통신을 하는 원리로 동작합니다 그러므로 연속된 신호가 없어도 각을 유

data .

지 할 수 있으며 제어주기와 상관없이 동작하므로 토크의 변화도 없다.

서보 제어시 알아두어야 할 사항 3)

서보의 속도는 60 /0.2sec◦ 로 너무 빠르기 때문에 주의해야 할 사항이 있다. 스펙대로 라면 모터의 움직임은 불과 0.1초 사이에 움직일 것이다. 큰 폭으로 각도가 변하는 경우 모터에 무리가 가 얼마 안가서 고장이 날것이다. 이러한 점을 예방하기 위해서는 특별한 루프를 프로그램에 넣어야 한다. 바로 움직여야 하는 각을 여러 개로 나누는 루프를 말 한다. 30◦에서 60◦까지의 각이 있다면 한번에 60◦까지 가는 것이 아니라 10개로 나누어 서 33 , 36 , 39 ...◦ ◦ ◦ 이렇게 나온 각을 가지고 이각을 0.1초에 하나씩 대입을 하여 펄스 를 생성한다. 그러면 0.1초에 3◦만 움직이게 되는 것으로 모터에 무리가 안 가게 된다. 그리고 더 부드러운 모션을 원한다면 각을 더 세분하면 된다.

사용하여 프로그래밍하기 4) CodeVision AVR

프로젝트 만들기

< new >

칩 선택 포트 설정

< > < >

외부 인터럽트 설정 타이머 카운터 설정 설정

< > < / > < LCD >

활성화 화면

< >

예제 프로그램 5)

#include <mega128.h>

#include <delay.h>

#include <lcd.h> // 헤더 파일 선언부

#include <stdio.h>

#define total_Servo 40000 // 20ms

#define Servo_start 1400 // 0.7ms 전처리 명령어 사용하여 사용하기 편리하게 함

#define Servo_end 4600 // 2.3ms

구별 char servo_flag = 0, SW_on_off = 0; // high low Flag

원하는 희망각

unsigned int angle_target = 3000 ; // 사용할 변수 선언 int speed = 1; // Sevor_speed

char sbuf[30]; // lcd 사용에 필요한 Sbuf

#asm

.equ __lcd_port=0x15

#endasm

interrupt [TIM1_OVF] void timer1_ovf_isr(void) {

타이머 정지 TCCR1B=0x00; //

if(servo_flag == 0 ) // out_high

{

servo_flag = 1; // high 와 low 구분하기 위한 Flag PORTF = 0x01; // 포트 에F 0번 비트를 high TCNT1H = ( ( 65535 - angle_target ) >> 8 ) & 0xff ;

타이머 주기 설정 상위

// ( )

TCNT1L = ( 65535 - angle_target ) & 0xff ; 타이머 주기 설정 하위

// ( )

}

else if (servo_flag == 1 ) // out_low {

servo_flag = 0; // high 와 low 구분하기 위한 Flag PORTF = 0x00 ; // 포트 F에 번 비트를0 low

TCNT1H = ((65535 - (total_Servo - angle_target ) ) >>8 ) & 0xff ; 타이머 주기 설정 상위

// ( )

TCNT1L = ( 65535 - ( total_Servo - angle_target ) ) & 0xff ; 타이머 주기 설정 하위

// ( )

SW_on_off = 1; // 스위치 체터링을 위한 Flag }

TCCR1B=0x02;

}

// External Interrupt 0 service routine

오른쪽으로 이동 interrupt [EXT_INT0] void ext_int0_isr(void) //

{

스위치 체터링을 위한 if (SW_on_off == 1 ) // Flag {

SW_on_off = 0; // 스위치 체터링을 위한 Flag

서보 모터의 회전 각도 선정 일때 도씩 angle_target += (speed * 100); // 1 5

최외각 각도까지 갔을때 처리 if (angle_target >= Servo_end ) //

{

angle_target = Servo_end ; }

} }

// External Interrupt 1 service routine

왼쪽으로 이동 interrupt [EXT_INT1] void ext_int1_isr(void) //

{

if (SW_on_off == 1 ) {

SW_on_off = 0;

일때 도씩 angle_target -= (speed * 100); // 1 5

if (angle_target <= Servo_start ) {

angle_target = Servo_start ; }

} }

// External Interrupt 2 service routine

interrupt [EXT_INT2] void ext_int2_isr(void) // speed up {

스위치 체터링을 위한 if (SW_on_off == 1 ) // Flag {

SW_on_off = 0; //스위치 체터링을 위한 Flag

최고의 이동 각도 까지 갔을때 처리 if (speed >= 5 ) //

{

speed = 5;

}

스위치 눌렀을때 처리 else if (speed < 5 ) //

{

speed ++;

} } }

// External Interrupt 3 service routine

interrupt [EXT_INT3] void ext_int3_isr(void) //speed down {

if (SW_on_off == 1 ) //스위치 체터링을 위한 Flag {

SW_on_off = 0; //스위치 체터링을 위한 Flag if (speed <= 1) // 최고의 이동 각도 까지 갔을때 처리 {

speed = 1;

}

스위치 눌렀을때 처리 else if (speed > 1 ) //

{

speed --;

} } }

void main(void) {

PORTA=0x00;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0x00;

스위치 사용을 위해 상태 유지 PORTD=0x0f; // high

DDRD=0x00;

PORTE=0x00;

DDRE=0x00;

PORTF=0x00;

서보 모터 신호 선을 위해 출력으로 선언 DDRF=0x0f; //

PORTG=0x00;

DDRG=0x00;

문서에서 하드웨어 설계 및 프로그래밍 (페이지 89-106)

관련 문서