embeded/AVR (ATmega,ATtiny)2013. 12. 29. 14:14
걍 귀찮아서.. 날로 먹은 소스코드임
일단 거상인 ATmega8 보드와 엘레파츠에서 이제는 매진되버린(!) 서보 모터를 사용함

[링크 : http://www.eleparts.co.kr/EPX33N6R] ES-311
[링크 : http://www.gersangin.com/shop/goods/goods_view.php?&goodsno=1092&category=] ATmega8

AVR Studio 프로젝트 설정시 ATmega8 과 클럭은 8,000,000 Hz(8MHz)로 설정한다.


퓨즈비트는 귀찮으니.. 내부 RC 8MHz 클럭으로.. 물론 보드에 16MHz 외부 크리스탈 있으니
필요하다면 변경하고 위의 주파수를 설정해주면 된다.


일단.. 가장 중요한건.. 전원이 부족해서 USB 파워로는 안될건 뻔하고..
그렇기에 전원을 분리했더니 그라운드가 달라서 오작동을 한다.(미친듯이 왼쪽으로만 끝까지 가버리는...)
그런 이유로 보드에 인가되는 전원 그라운드와 서보에 인가되는 전원 그라운드를 묶어주어야 한다.
(이러면.. 아날로그노이즈가 타고 오지 않으려나? ㅠㅠ)


일단은 GPIO를 이용해서 간단하게 중앙 - 좌 - 중앙 - 우
왕복시키는 코드이다. 이제 갯수도 늘려봐야 하는데 크앙!
서보 특성상 20ms 주기로 PWM 신호를 보내주고
신호의 길이는 1500usec이 neutral(중앙/센터)
+- 800usec인 700usec / 2300usec 범위에서 제어를 한다.

#include < avr/io.h >
#include < avr/interrupt.h >
#include < util/delay.h >

/******************************************/
int main(void)
{
	int idx = 0;
	int val = 1500;

	DDRB = 0xFF;
	PORTB = 0x00;
	
	while(1)
	{
		for(idx = 0; idx < 50; idx++)
		{
			PORTB = 0xFF;
			_delay_us(1500);

			PORTB = 0x00;
			_delay_us(20000 - 1500);
		}

		for(idx = 0; idx < 50; idx++)
		{
			PORTB = 0xFF;
			_delay_us(700);

			PORTB = 0x00;
			_delay_us(20000 - 700);
		}

		for(idx = 0; idx < 50; idx++)
		{
			PORTB = 0xFF;
			_delay_us(1500);

			PORTB = 0x00;
			_delay_us(20000 - 1500);
		}

		for(idx = 0; idx < 50; idx++)
		{
			PORTB = 0xFF;
			_delay_us(2300);

			PORTB = 0x00;
			_delay_us(20000 - 2300);
		}
	}

	return 0;
}
Posted by 구차니