닫기

[Tech Insight] LED 제어와 시뮬레이션

  • 등록 2015.01.20 17:24:17
URL복사

마이크로콘트롤러(이하 MCU)로 LED를 제어하는 것은 제어의 기본이라고 할 수 있다. 그런데 실무에서는 소스 코드(source code)가 상당히 긴 편이므로 기본적인 코드를 많이 숙지하면 응용에 도움이 된다. 그래서 LED 제어로 기본 응용을 파악하고, 노하우를 잘 익히면 LED 제어를 다양하게 할 수 있다.

LED 제어에는 기본적으로 DDR(Data Direction Register) 레지스터와 PORT 레지스터를 사용한다. DDR 레지스터는 Atmega128 MCU의 PORT 입출력을 결정하며, PORT 레지스터는 실제 데이터를 설정해 준다. DDR 레지스터와 PORT 레지스터의 리셋 후 초깃값은 0이다. 여기서는 Atmega128 MCU를 사용하여 LED를 제어하는 방법을 살펴본다.

 

간단한 LED 제어

비교적 간단한 LED 제어에 대한 회로는 그림 1과 같다. 이 회로에서 PORT에 직접 LED가 연결되어 있으며, 스위치를 이용하여 선택적인 동작을 할 때는 Buffer IC(74HC244)를 사용할 수도 있다. LED는 Active Low 방식으로 구동된다.

 

 

회로를 구동하기 위하여 WinAVR2010의 Mfile에서 Makefile을 만든다. Makefile에서는 Main file name이 C 소스 코드와 같아야 한다. 확장자는 쓰지 않는다. Makefile을 만들었으면 (예)portled 폴더를 만들고 그 안에 저장한다.

그리고 MCU 타입에서는 자신의 마이크로컨트롤러 타입을 선택한다. 그 아래의 Output format에서는 ihex를 선택한다. 그 아래의 최적화 레벨 Optimization level에서는 “0”을 선택하여 컴파일 시 최적화를 수행하지 않도록 한다. 그 아래의 Debug format인 디버그 정보 형식 메뉴에서는 “AVR-ext-COFF(AVR Studio 4.07+, VMLAB 3.10+)"를 선택하여 컴파일 시 디버그 정보를 저장하기 위해 ext-COFF를 선택한다. 그 아래의 C standard level에서는 gnu99를 선택한다. 이와 같이 한 다음 Makefile을 저장하기 위하여 File->Save As로 가서 원하는 폴더에 Makefile을 만든다.

Makefile을 만든 후 WinAVR->Programmers Notepad를 실행하여 소스 코드를 작성한다. 그리고 그 파일 이름을 portled.c라고 저장한다. 그런 후 메뉴 Tools->WinAVR[make all]을 눌러 실행한다. 만약 Process Exit Code : 0이 나왔다면 프로그램이 에러 없이 잘 실행된 것이다. 그리고 WinAVR2010의 Programmers Notepad에서 C언어로 프로그래밍을 한다. 또는 AVR Studio 4에서 직접 코드를 작성하고 컴파일을 해도 되지만, Programmers Notepad가 컴파일 시간이 더 빠르다.

PORTB의 PB1, PB3이 PB0, PB2와 교대로 LED에 불이 들어오도록 프로그래밍을 해 본다.

[예제 1]

 

 

proteus VSM으로 시뮬레이션 한 결과를 살펴보면 그림 2와 같다.

 

 

 

다수 LED 제어

Bus LED 제어 방식의 회로는 간단한 LED 제어 회로보다 약간 더 복잡하다(그림 3 참조). 이 제어방식도 Port를 사용한다.

 

 

이 회로에서는 Port B에서 Current Darlington IC인 ULN2803를 통해 FND(7segment)에 데이터를 보내며, Port E에서는 com 단자를 통해 8개의 FND에서 특정 FND를 선택한다. 이러한 구동방식을 Static Display 방식, Dynamic Display 방식 중 Dynamic Display 방식이라고 한다.

FND를 구동하기 위한 C언어를 다음과 같이 예제로 다뤄보았다.

[예제 2] 이 프로그램은 8개의 FND에서 맨 오른쪽 FND부터 좌측으로 움직이면서 0, 1, 2, 3, 4, 5, 6, 7이 차례로 켜지는 것이다. FND 디스플레이의 제어 동작을 확인하기 위해 대기시간을 100ms로 하였다.

 

 

[예제 3] 이 프로그램은 8개의 FND에서 맨 오른쪽 FND부터 좌측으로 움직이면서 0, 1, 2, 3, 4, 5, 6, 7이 차례로 켜지는 것이다. FND의 동작 속도를 us 단위로 했기 때문에 착시현상으로 FND가 모두 켜있는 것처럼 보인다.

 

 

복잡 LED 제어

복잡 LED 제어를 위해서는 latch IC, 74HC138 같은 Decoder IC를 사용하며, MCU의 Bus와 memory를 이용하여 회로를 설계하기도 한다. 그리고 실무에서 러닝머신 같은 복잡한 장치를 위한 회로에서는 Decoder로 74HC4514 IC, Current Darlington IC인 ULN2803은 Current LED Sink Driver로 MBI5026 IC를 사용하기도 한다.

FND를 구동하기 위한 C언어를 다음과 같이 예제로 다뤄보았다.

(예제4) 74HC574 IC 2개, ULN2803 IC, 74HC573은 D형 latch IC, Address 신호에 대한 Decoder 기능을 수행하는 74HC138를 이용하여 FND 응용 프로그램을 작성해 본다. 이 프로그램은 4개의 FND com1, com2, com3, com4에 16진수 숫자 “0~9”를 표시하고, 16진수 문자 “A~F"를 표시한 후 모든 digit가 off 되는 동작을 한다.

 

 

[예제 4 코드 보기]

 

윤덕하 객원전문기자 (아이에셋)






주요파트너/추천기업