2016. 3. 4. 14:26 avr 기초

atmega로 led켜기

안녕하세요 쭌지 입니다.


이제 atmega로 led를 켜보도록 하겠습니다.

전 atmega32를 쓰고 있어요.

대부분 atmega128을 쓰실텐데요.


지금처럼 간단한 작업에 128은 낭비입니다. 

커피 자판기 같은곳에도 atmga128 까지 사용하지 않아요. 

커피 자판기만 보더라도 하는 일이 많죠.

동전 넣으면 액수를 나타내야하고 메뉴에 불도 들어와야하며 신호를 주면 커피를 만들고 

거기에 거스름돈도 줘야 합니다. 

그리고 안에서 기본온도 유지 메뉴마다 재료가 다르게 나와야 하는 등등 

이렇게 하는 일이 많지만 atmega128은 오버스펙입니다.

더욱 해줄수 있는 일이 많아요.


그러니 avr을 하실때 무조건 atmega128로만 한다는 생각하지 마시길 바랍니다.

하고자하는 프로젝트의 양에 따라 좀더 싼거를 고르시는걸 추천드립니다.

128이 생각보다 비싸거든요 (변형기판도 같이 사신다면 더욱)


저는 atmega32를 주로 사용합니다.(dip형을 좀 싸게 팔아서 ㅎㅎ)


그럼 서론이 길었는데 본격적으로 하나하나 해보도록 합시다. 


가장 먼저 해야할건 회로를짜고 기판에다 납땜을 해야겠지요?


가장 처음 만들어야 할건 전원부를 만들어 줍시다.


전원부를 만드는 방법은


1. 건전지와 다이오드


2. 집에 쓰다남은 dc어댑터와 레귤레이터(dc전압과 전류를 바꿔주는 칩)


3. 건전지와 레귤레이터


4. spi전원 사용하기(제품마다 다르지만 거의 가능합니다)

등등이 있습니다. 


각각 특징이 있는데요

휴대성을 강조하는건 1,3번 (가격면에서는 1번이 더 쌉니다)


2는 높은 전압원을 공짜로 얻을수 있다는것(보통 노트북 어댑터가 10v는 넘어주시니 레귤레이터만 잘써주시면 다방면으로 쓸수있습니다.

그리고 집에 전기만 들어온다면 건전지 사는돈이나 케이스 비용을 아낄수있어서 작업실에서 사용하실거면

개이득이죠 )


4번이 가장 저렴하다 할수 있겠네요. spi는 보통 다 사시는 것이니까요. 그리고 야외작업하실때 유용하다는점이 좋습니다. 

(보통 5v고정이라 다른전압을 쓰기힘들다는것과 전류도 작아서 간단한것들만 할수 있다는 것이 좀 아쉽습니다.)



전 현재 3번과 4번을 병행 해서 쓰고 있습니다.

  

그럼 어댑터를 이용한 전원부를 만들어 볼텐데요.


준비물: LM1117_5.0, 잭컨넥터, 캐패시터 1n, 저항 200옴, led

칩의 핀번호가 orcad상에는 이상이 없는데 pdf로 만들면 밀리네요.

왜 그런지 모르겠어요 ㅠㅠ 좀불편해도 잘 알아봐 주시길.....

저항부분에 1k라고 나와있는데 잘못 나왔어요. 200옴짜리로 사주세요

led는 어느색이든 상관 없지만 저는 그린을 사용했습니다.



저항갑 계산은 led의 적정 전압과 전류값을 참고 하셔서 계산하셔야 합니다.

밑의 수치는 일반적으로 알려져있는 수치입니다.(하지만 회사마다 좀 달라서 데이터시트를 제공하는 회사는 시트를 꼭 보세요)


red 2v 15ma

green 3v 15ma

yellow 2.5 15ma


이수치와 V=IR로 계산해서 저항갑을 구하는데

green을 쓴다고 했을때 5v의 전압에서 led가 3v를 쓰고 남은 2v를 저항으로 전류를 구해줍니다.

10ma정도를 만들려면 200옴이 있으면 되는거죠.


이렇게 부품을 모두 구하셨다면이제 열심히 빵판에 꽂든 납질을 하든 해서 만들어 줍니다.

(저는 전원부를 작은 기판에 따로 만들어서 사용합니다. 그게 여러모로 좋더라고요)



이제 led 구동을 위한 전체적인 회로도 입니다


저는 아트메가를 딥 형태로 쓰지만

TQFP형을 쓰실분들은 데이터시트를 참고 해주세요.(핀위치랑 gnd,vcc 수가 조금 다릅니다)

http://www.alldatasheet.co.kr/?gclid=CjwKEAiAgeW2BRDDtKaTne77ghgSJACq2U4bDUEqWMxCkkMqsfoUCIMECbnN_cYTUQIvNYSQvZjfgRoCcFvw_wcB 

위 사이트로 가셔서 검색하시면 보실수 있습니다.


회로도에 대해 간단히 설명하자면

외부클록으로 크리스탈 16MHZ를 달고 안정된 전압을 위해 커페시터 하나

avcc에도 안정된 전압을 위해 코일과 커페시터로 만들어줍니다.(avcc를 안쓰실거면  vcc랑 avcc를 바로 연결 하셔도 상관없지만 이렇게 해두는게 여러모로 좋아섷ㅎ)

vcc가 +  gnd가 -  이건 다들 아시죠? (전 처음에 이런것도 몰랐다는 ㅋㅋㅋ 전 gnd가 땅에 팩박아서 접지하는건줄 ㅋㅋㅋㅋ)



자 이렇게 납질도 하고 해서 모양이 얼추 나왔다면 이제 소스를 넣어야 겠져?



led.h


delay.h

먼저 딜레이와 led의 헤더파일입니다.

딜레이에 대한 설명은>>> delay.h 헤더파일 소스 설명


기본 순서대로 점등


#include <avr/io.h>

#include "./../../header/delay.h"

#include "./../../header/led.h"

#define f_cpu 16000000ul //16Mhz


int main(void)

{

     DDRB= 0x0F //portb의 하위 비트를 출력으로 사용

    /* Replace with your application code */

    while (1) 

    {

PORTB= LED1_ON; //0b00001110

delay_ms(500);

PORTB= LED2_ON; //0b00001101

delay_ms(500);

PORTB= LED3_ON; //0b00001011

delay_ms(500);

PORTB= LED4_ON; //0b00000111

delay_ms(500);

    }

return 1;

}







딜레이를 변화를 줌으로서 점점 빨라지는 함수




#include <avr/io.h>

#include "./../../header/delay.h"

#include "./../../header/led.h"


#define LED_PORT PORTB

#define LED_DIP DDRB


int main(void)

{

    LED_DIP= 0X0F; //PORT B의 하위비트를 출력

int i= 0;

int j= 0;

    while (1) 

    {

for(i= 256; i>64; i=i-32){

LED_PORT= LED1_ON;  

delay_ms(i);

LED_PORT=LED2_ON;

 delay_ms(i);

LED_PORT= LED3_ON;  

delay_ms(i);

LED_PORT=LED4_ON; delay_ms(i);

}

for(j= 64; j>0; j=j-1){

LED_PORT= LED1_ON;

delay_ms(j);

      LED_PORT=LED2_ON;

delay_ms(j);

LED_PORT= LED3_ON;

delay_ms(j);

LED_PORT=LED4_ON; delay_ms(j);

}

LED_PORT= LED_ON; delay_ms(250);

LED_PORT= LED_OFF; delay_ms(250);

LED_PORT= LED_ON; delay_ms(250);

LED_PORT= LED_OFF; delay_ms(250);

    }

return 1;

}


밝기변화(delay)




#include<avr/io.h>           

#define Time 100             // 밝기변화 시간 변경가능


void delay(volatile unsigned int i) //avr studio 5 이상은 volatile 씀 4버전은 안써도 무방

{

while(i--);

}


int main()

{

unsigned int i,ON=0,OFF=Time;


DDRB=0x0F;            // PORTB의 하위비트를 출력으로 씀

PORTB=0x0F;           // PORTB 초기화 LED off

while(1)

{

while(OFF)                      //점점 밝아지는 동안...

{

for(i=0;i<Time;i++)

{

PORTB=0x0F;

delay(ON);

PORTB=0x00;

delay(OFF);

}

ON++;                         // LED를 켜는 시간을 점점 늘린다.

OFF--;                        // LED를 끄는 시간을 점점 줄인다.

}  //OFF 가 0이 되면 while 문을 빠져나가 아래 while으로 들어가 점점 어두워 지는 동작을 하게 된다.


while(ON)                       //점점 어두워지는 동안...

{

for(i=0;i<Time;i++)

{

PORTB=0x0F;

delay(ON);

PORTB=0x00;

delay(OFF);

}

ON--;

OFF++;

}  //ON이 0이 되면 while 문을 빠져나가 위의 while문으로 들어가 점점 어두워 지는 동작을 하게 된다.

}

}


이렇게 간단한 소스 3개를 알아봤어요


혹시 컴파일법을 모른다면>>> avr studio 7 사용법 및 컴파일법 여기를 참고해주세요.



그럼 내일봐요~


'avr 기초' 카테고리의 다른 글

atmega32/ 128 fnd(7-segment)제어  (0) 2016.03.12
atmega led switch  (0) 2016.03.07
delay.h 헤더파일 소스 설명  (1) 2016.03.03
delay, led, fnd 헤더파일  (0) 2016.03.02
헤더파일 불러오기  (0) 2016.03.02
Posted by 탕구이

블로그 이미지
엔지니어를 꿈꾸는 공대생
탕구이

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

글 보관함