2019. 5. 8. 13:20ㆍ전기전자/전자
이번 주제는 자작 AVR 보드입니다
먼저 AVR이란 아트멜사에서 8051 마이크로컨트롤러를 개량한 아키텍처이고
명령어 개수는 약 120개 정도 많은 명령어를 지원하며
개발 보드로 많이 쓰이는 아두이노의 경우에도
AVR이 쓰입니다
지금 현제 아트멜 사는 PIC 마이크로컨트롤러를 개발한
Microchip 회사에게 인수당한 상태이므로
이제부터 아트멜 대신 Microchip 회사로 부르겠습니다
지금 제가 만든 AVR보드는
아두이노 우노 보드에 들어있는
ATmega328p 개발 보드입니다
ATmega328p는 보편적으로 많이 쓰이는 AVR 중 하나이고
다리도 DIP형 이기 때문에 만능 기판에 납땜하기도 쉽습니다
아두이노도 가지고 있으나 AVR방식으로 프로그래밍하면
조금 더 효율적으로 프로그래밍할 수 있고
레지스터를 직접 제어하기 때문에
더 복잡한 코딩도 쉽게 할 수 있습니다
그만큼 배울 점 그리고 코딩하면서 배우는 점도
아두이노에 비해 많습니다
그럼에도 아두이노를 선호하는 분들이 많은데
그 이유는 당연히 많은 예제와 쉬운 접근성 때문이죠
시간과 돈이 된다면
ATmega1284p 도 다뤄볼 예정입니다
전체적인 모습입니다 AVR보드는 간단하게 제작할 수 있습니다
먼저 클럭은 아두이노와 동일한 16 MHz 클럭을 사용했으며
전원선 부분은 떨어지지 않게 에폭시를 발랐습니다
핀 헤더는 원래 핀헤더 소켓으로 구성하려 했는데
집에 핀헤더 소켓 없으므로 핀으로 했습니다
회로 말고 오른쪽에도 비어있는 부분이 있는데
나중에 회로 추가하는 확장성을 고려해서
남겨놨습니다
지금 계획은 없으나
저 자리에는 LCD 회로가 들어갈 것 같습니다
회로 뒷면입니다
납땜은 쇼트 안나게 깔끔하게만 잘하면
잘 작동합니다
여기서 주의하실 점이 있는데
만능 기판 뒷면에 배선 납땜하실 때 IC핀은 대칭되므로
그 점 유의해서 납땜해야 됩니다
그것 때문에 부품 몇 개 태워먹음
AVR 개발환경입니다
AVR 개발환경은 마이크로칩 아트멜에서 기본 제공 IDE
아트멜 스튜디오 7 을 사용했습니다
아트멜 스튜디오는 깔끔하고 개발하기 좋게 되어있습니다
다만 구형 개발장비 STK500이나 AVR MK II 같은 장비는
작동되지 않을수도 있으므로
구형 개발환경 AVR STUDIO 4 를 통해서
프로그램을 구워야 됩니다
저도 마찬가지로 아트멜 스튜디오를 이용하여 프로그래밍하고
구형 개발환경으로 프로그램을 굽는 방법을 사용했습니다
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define delaystep 20
#define delaystep1 10
#define delaystep2 5
int main(void)
{
DDRC = 0xFF;
/* Replace with your application code */
while (1)
{
for(int i=0 ; i<30 ; i++) {
PORTC = 0x01;
_delay_ms(delaystep);
PORTC = 0x02;
_delay_ms(delaystep);
PORTC = 0x04;
_delay_ms(delaystep);
PORTC = 0x08;
_delay_ms(delaystep);
}
for(int i=0 ; i<30 ; i++) {
PORTC = 0x01;
_delay_ms(delaystep1);
PORTC = 0x02;
_delay_ms(delaystep1);
PORTC = 0x04;
_delay_ms(delaystep1);
PORTC = 0x08;
_delay_ms(delaystep1);
}
for(int i=0 ; i<30 ; i++) {
PORTC = 0x01;
_delay_ms(delaystep2);
PORTC = 0x02;
_delay_ms(delaystep2);
PORTC = 0x04;
_delay_ms(delaystep2);
PORTC = 0x08;
_delay_ms(delaystep2);
}
for(int i=0 ; i<30 ; i++) {
PORTC = 0x08;
_delay_ms(delaystep);
PORTC = 0x04;
_delay_ms(delaystep);
PORTC = 0x02;
_delay_ms(delaystep);
PORTC = 0x01;
_delay_ms(delaystep);
}
for(int i=0 ; i<30 ; i++) {
PORTC = 0x08;
_delay_ms(delaystep1);
PORTC = 0x04;
_delay_ms(delaystep1);
PORTC = 0x02;
_delay_ms(delaystep1);
PORTC = 0x01;
_delay_ms(delaystep1);
}
for(int i=0 ; i<30 ; i++) {
PORTC = 0x08;
_delay_ms(delaystep2);
PORTC = 0x04;
_delay_ms(delaystep2);
PORTC = 0x02;
_delay_ms(delaystep2);
PORTC = 0x01;
_delay_ms(delaystep2);
}
}
}
테스트 프로그래밍은 스테핑 모터 제어하는 것으로 프로그래밍했습니다
여기서 클럭 설정은 #define으로 설정해줘야 정상적으로 작동됩니다
클럭 설정을 하지 않을 경우 기본 클럭 (1 MHz) 용으로 프로그래밍되어
딜레이 같은 타이밍이 맞지 않아 오류가 생길 수도 있습니다
예를 들어 1초 정도 딜레이를 줬는데 기본 클럭으로 할 경우
16 MHz 수정발진기를 쓰면 16초 딜레이가 흐릅니다
심각한 문제점이 발생할 수도 있으므로
F_CPU 부분을 define으로 수정하는 것을 추천드립니다
기본 클럭 그대로 사용하시면 define으로 수정하지 않으셔도 됩니다
그다음 부분 DDR 부분은 입출력 포트 설정이고
1은 출력 0은 입력이므로
저는 C 포트 전부 출력으로 쓰기 때문에
11111111
이것을 16진수로 나타내면 0xFF 가 됩니다
DDRC = 0xFF
다음 부분은 스테핑 모터 제어 프로그램입니다
포트를 직접 제어하여 for 문으로 구현했습니다
코드 내용은 점점 빨라지다가
역회전하는 방식으로 코딩했습니다
작동 영상입니다
프로그래밍될 때는 파란색 LED가 켜졌다가
다 되면 꺼짐과 동시에 프로그래밍 한 대로
동작됩니다
모터 작동 관련
모터가 부드럽게 잘 작동하네요
오래 작동하면 모터 드라이버에서 열이 많이 나기 때문에
잠깐 동안 작동하고 껐습니다
일반 42각 스테핑 모터에서는 3단으로 빠르게 돌아가는
코드를 넣었으나
CD롬 모터는 공간상의 제약이 있기 때문에
일부분을 주석 처리하여
2단으로 빠르게 돌아가는 코드를 넣었습니다
AVR장점은 프로그램을 굽는 속도가 빠르고
바로 지울 수 있기 때문에 바로 테스트해볼 수 있는 것이
또 하나의 장점이 아닌가 싶네요
이상 여기서 포스팅을 마치겠습니다
'전기전자 > 전자' 카테고리의 다른 글
가변저항 이론과 사용법 (1) | 2019.05.27 |
---|---|
앰프 만들기 (0) | 2019.05.21 |
자작 전기충격기 (2) | 2019.05.06 |
스테핑모터 구동 (1) | 2019.05.04 |
STM32 자작 디지털 온습도계 (0) | 2019.05.04 |