제어할 모터 스팩






RA-20GM 03TYPE (12V) with 2channel Encoder

● 감속비 : 1/10 ~1/866 (감속비율 총 20종)
● 정격 토크 : 160gf-cm ~ 1800gf-cm
● 정격회전수 : 670 rpm ~ 8.5 rpm
● 장착된모터 : DC 12V / 8,000 rpm / 1.5 W Motor
● 엔코더사양 : 6P/R 






 (출처 : http://www.dnj.co.kr/2013_html/spur_ra20gm_03_en.html)



(회로도는 나중에에 올림)


ATmega128 로 DC motor 제어


 DC motor 를 제어하기 위해서는 pwm 신호로 적당한 고주파를 만들어 주어야 한다. pwm 신호를 만드는 방법은 타이머 인터럽트에 여러가지 모드가 있는데 그중에 normal mode를 사용하겠다. 


  타이머 인터럽트 normal mode 라 하면 다른 기능은 아무것도 쓰지 않고 내가 정해준 타이밍이 되면 알아서 인터럽트가 발생하기만 하는 것이다. 참고로 인터럽트 처리과정은 다음과 같다.



(출처 : http://cafe.naver.com/openrt)


 위 과정 중 인터럽트 처리에서 하나의 변수를 만들어놓고 그 변수를 카운트를 한다. 변수의 값이 일정 수준으로 되면 모터 신호를 ON. 그리고 변수가 다시 어느정도 되면 모터 신호를 OFF. 하고 이과정을 같은 주기로 반복 시키면 이것이 바로 pwm 신호이다.


 먼저 타이머 인터럽트를 설정할 것이다. 설정하기에 앞서 모터 고주파는 10 kHz 로 할 것이다. 10 kHz 의 역수는 100 us. 타이머 인터럽트 발생 주기를 10us 로 하고 인터럽트가 10번 발생할 때 pwm 신호를 조작하면 되겠다.


#include <mega128.h>


// *****************비트제어***************


#define sbi(PORTX, BitX) PORTX |= (1 << BitX)

#define cbi(PORTX, BitX) PORTX &= ~(1 << BitX)


// ************전체 인트럽트 설정*************


#define DISABLE_ISR cbi(SREG, 7)

#define ENABLE_ISR sbi(SREG, 7)



static unsigned int cnt;


void interupt_init()

{

  DISABLE_ISR;


  TIMSK = 0x01; // TImer0 overflow interrupt 활성화 

  TCCR0 = 0x02; // 8분주 

  TCNT0 = 236;   // TCNT0 시작

               

  ENABLE_ISR;

}


  /* (1/16)us * (8분주비) * (256 - 236) = 10 us */


 다음은 인터럽트 루틴 소스이다.


interrupt [TIM0_OVF] void timer_int0(void)

{

  TCNT0 = 236;


  cnt++;

  if(cnt == 6) PORTC &= ~0x30;  // PORTC.4 와 PORTC.5 모터 인에이블 핀

  

  else if(cnt == 9){

    PORTC |= 0x30;

    cnt = 0;

  }

}


 코드를 설명하면, 인터럽트가 발생하면 TCNT0 의 값이 0 으로 초기화 된다. 그런데 우리는 계속해서 10us 를 얻어야 하므로 TCNT0 = 236; 으로 다시 설정 함으로써 앞으로도 계속 인터럽트 발생 주기는 10 us 가 된다. cnt 라는 변수는 전역변수로 선언 되었고 카운트를 하기 위한 변수이다. TCNT0 값이 계속 상승하다가 TOP 값을 만나서 overflow 가 되면서 인터럽트가 발생한다. 그러면 위 인터럽트 루틴을 실행하게 되는데 cnt 변수를 증가 시킨다. 미리 PORTC.4 번과 PORTC.5 번을 ON 시켜 놓았다가 cnt 가 6 이 되면 다른 핀을 제외하고 PORTC.4 번과 PORTC.5 번을 OFF 시킨다. 그리고 계속 카운트. cnt 가 9 가 되는 순간 다른 핀을 제외하고 PORTC.4 번과 PORTC.5 번을 ON 시킨다.  여기서 다른핀을 제외하고 원하는 핀만 ON 시키고 OFF 시키는 방법을 익혀두길 바란다( &= ~, |= )


문제점


 여기까지 하는 과정 중에는 큰 문제가 발생하지 않았다. 하지만 다음에 사용할 UART 수신 완료 인터럽트를 사용하는 과정에서 문제가 생겼었다. 그 문제는 UART 수신완료 인터럽트가 아무리 잘 설정해도 실행이 되질 않았었는데 그 이유는 타이머 인터럽트가 너무 빠른 시간에 많이 발생하였기 때문이다.

 

 처음에 타이머 인터럽트 발생 주기를 2 us 로 했었다. 참고로 인터럽트에도 우선순위가 있다. ATmega128 에는 35 개의 인터럽트가 있는데 이러한 인터럽트들이 동시에 발생했을 때 누가 먼저 실행할 것인가를 미리 정해 둔 것이다. 아무튼 이러한 우선순위 때문에 UART 수신완료 인터럽트와 타이머 인터럽트가 동시에 발생하면 타이머 인터럽트를 먼저 실행하게 된다. (근데 타이머 인터럽트를 먼저 실행하면 그다음 UART 수신 완료 인터럽트를 실행하면 되는것 아닌가..? .. 아예 인터럽트가 씹혀버렸었는데 왜 그런지는 모르겠다.) 그렇다 보니 타이머 인터럽트 주기를 너무 빠르게 하면 안된다!

'project > 스마트폰으로 avr 제어' 카테고리의 다른 글

step3. UART 통신 (비동기 통신)  (0) 2013.11.19
step2-1. DC Motor pwm control  (2) 2013.11.19
step1. 모터드라이브 L298N 제어  (0) 2013.11.19
step0. project 목차  (0) 2013.11.19
RF 용어 설명  (0) 2013.11.16
Posted by 나무길 :

 여짓것 UART 를 써오면서 통신에 대한 이해없이 그냥 소스코드를 ctrl + c,  ctrl + v 로 사용해 왔다. 그래서 뭐 통신이란 말이 나왔다하면 RS232C, UART, SPI 이런 단어들이 맨날 나오면서도 뭔소린지 몰랐었는데 이번 기회에 비동기통신에 대해 한번 정리해 볼려고한다.



비동기 통신 UART, RS232C


 먼저 UART 를 실제 사용하면 RS232C 케이블로 외부장치와 연결해야 하고 RS232C 통신규격에 따라 송수신을 해야한다. 여기서 계속 나오는 RS232C 가 무엇일까. 앞으로도 다른 무엇을 할 때 통신하면 빼놓지 않고 같이 나오는 것이다. RS232C 란 원래 모뎀과 터미널간의 인터페이스 방법에 대한 EIA (미국전자공업협회)의 RS (Recommended Standard) 규격이다. 실제로 UART 는 "RS232C 기능을 수행하는 장치"라고 할 정도로 RS232C 규격에 따라 송수신을 한다.


 RS232C 는 통신 프로토콜 (protocal) 중 하나이다. 음.. 일단 프로토콜이란 "통신상의 규약"이다. 결국 통신상에는 여러가지 규약이 있는데 그중 하나가 RS232C 라는 말이다. 이렇게 통신 규약이 있는 이유는 장치 상호간에 데이터의 송수신을 원활히 하기 위해서는 회선의 접속 및 절단, 비트 신호의 형태 및 의미, 전송 속도 및 제어 방법 등이 수신과 송신 양방간에 서로 맞아야 하므로 이런 것들에 대하여 미리 규약을 정할 필요가 있는데, 이와 같은 장치 상호간의 통신 규약을 프로토콜 (protocal) 이라고 한다.


  RS232C 에서는 회선의 접속, 정보전송, 절단 등과 같은 통신 프로토콜 외에도 보율, 패리티 방법, 프레임, stop 비트의 수 등에 대해서도 규정하고 있는데 이들 중 보율 (baud rate) 은 가장 기본이 되는 규약이다. 그 다음으로 기본이 되는 규약은 프레임 구성에 대한 것이다. 프레임 (frame) 이란 정보를 이루는 하나의 단위 (RS232C에서는 1바이트) 를 특별한 구조로 조직하게 하는 틀을 말한다. 데이터 비트의 수, 패리티의 종류, stop 비트의 수 등이 있다. 



보율 (baud rate)


 보율 (baud rate). 앞에서 나온것과 같이 보율은 RS232C 에 있어서 가장 기본이 되는 규약이다. 보율이란 (baud rate) 1초 동안에 전송되는 비트의 수, 즉 "초당 비트 전송 수 (BPS: Bits Per Second)" 로서, 수산과 송신 양측에서 이것이 같아야 한다. 


baud rate = bits/sec(bps)




프레임 (frame)


 그 다음으로 중요한 것이 프레임 (frame)이다. RS232C 에서는 하나의 바이트를 아래 그림과 같은 구조로 조직한다. 1개의 start 비트, 8개 또는 9개의 데이터 비트, 1개의 stop 비트가 직렬로 구성된다. 


 비동기 통신에서는 동기 통신에서와 달리 데이터를 시스템 클럭에 동기해서 전송하지 않기 때문에 동기 통신처럼 연속해서 데이터를 보낸다면 하나의 바이트가 어디서 시작해서 어디서 끝나는지 알 길이 없다. (여기서 동기 통신의 특성 다시한번 볼것) 그래서 시작점과 끝 점을 알려줘서 다른 장치 상호간 통신을 할 수 있게 하는 것이다. start 비트는 1개로 논리 0 이고 stop 비트는 1~2개로 논리 1이다.


 RS232C 수신에서는 start 비트를 놓치면 어떻게 될까? 망하는 거다. 그래서 start 비트가 중요한데 통신이 시작되기 전에는 mark 상태라고 해서 논리 1의 상태가 지속된다. 통신이 시작되면 start 비트부터 수신되므로(논리 0) 쉽게 start 비트를 잡을 수 있다. 문제는 그 다음인데, 데이터는 논리 값이 지 맘대로다. 그렇다면 stop 비트가 논리 1 이라 한들 어떻게 데이터 비트와 stop 비트를 구분할 수 있을까. 그것은 프레임(틀이 정해져있으므로)으로 알수 있다. stop 비트 자리가 정해져 있기 때문에 stop 비트 자리에 논리 1이 있고 바로 이어서 논리 0이 있으면 이것을 start 비트로 인식한다. 만약 start 비트 자리에 이것이 없으면 framing error(USR<4>) 를 발생한다.






 start BIT 앞 부분이 mark.


사진 출처 : http://blog.naver.com/PostView.nhn?blogId=ubicomputing&logNo=150121031176&categoryNo=34&viewDate=&currentPage=1&listtype=0&from=postList

내용 출처 : AVR과 그 응용

'project > 스마트폰으로 avr 제어' 카테고리의 다른 글

step2-2. DC Motor pwm control  (0) 2013.11.20
step2-1. DC Motor pwm control  (2) 2013.11.19
step1. 모터드라이브 L298N 제어  (0) 2013.11.19
step0. project 목차  (0) 2013.11.19
RF 용어 설명  (0) 2013.11.16
Posted by 나무길 :

PWM 이란?


 먼저 pwm 단어가 무엇인지 알고 시작하자. pwm 은 Pulse-Width modulation 의 약자로써 해석하면 대략 펄스 폭 조절기 정도 되겠다. 이 먼 펄스를 조절하느냐 하면 일단 좀있다 알도록 하고, 우선 우리는 일상 생활이 전부 아날로그로 되어있다. 예를 들면 전압, 전류, 목소리 등 시간과 크기 모두에서 제한되지 않은 분해능(resolution)을 가지는 연속적으로 변하는 값을 갖는다. 이러한 값들을 이용하면 좋기는 한데 연속적이므로 시시각각 조금씩 값이 변하므로 정교하지 않다. 노이즈에 민감하고.. 아무튼 그렇다. 그래서 이것을 좀더 안정적으로 사용하기 위한 방법이 디지털로 전환시키는 것이다. 디지털로 전환이 되면 구간이 나뉘므로 일정 구간 안에서는 값이 변하지 않고 일정한 값을 출력한다. 그러므로 좀더 안정적이라 할수 있다. 여기서! 다음 그림을 통해 펄스라는 것을 알도록 하자.



위 사진에 보면 PWM signal 이라는 곳에 사각형 모양의 파형이있다. 이것이 바로 펄스라는 것인데 이러한 신호 자체를 PWM 이라 부르기도 한다. 그리고 그 펄스의 폭을 조절하는 것이 pwm 이라는 것.



Duty Rate(듀티비)


 그럼 펄스 폭을 조절해서 무엇을 하느냐 하면 모터를 가지고 설명하겠다. 우리가 앞으로 사용할 모터는 12v 모터다. 12v 모터를 제어할 때 그냥 냅다 12v 를 갖다 꽂으면 돌아가기는 하는데 계속 최고 속도로만 돌아간다. 모터를 달고 굴려야하는 작품이 속도 조절 안되고 계속 최고속도로만 돌아댕기면 난감하겠죠? 그래서 이 것의 속도를 조절하는 방법은 몇가지가 있는데 그중 하나가 지금 위에서 설명한 pwm 을 통해 전압을 낮추어서 하는 방법이 있다. 


 전원을 껏다 켰다 하는 것인데 이를 통해 전류나 전압이 On_time 에는 전원이 공급되고 Off_time 에는 전원이 끊기게 된다. 이때 전원이 끊기는 시간과 공급되는 시간 의 비율을 Duty Rate 이라 한다. 아래 그림을 보면 이해가 좀 빠를 것이다.



이를 통해서 12v 전원의 Duty Rate 이 50% 이면 6v 의 전원이 들어가는 것이고 80% 되면 대략 9.6 v 가 들어가게 되는 것이다. 이로

써 속도 조절 완성!




제어할 모터에 대한 설명과 ATmega128 에서 motor 제어는 다음편에서 설명


사진 출처 : http://commons.wikimedia.org/wiki/File:Delta_PWM.png

http://www.hanb.co.kr/network/view.html?bi_id=1087



'project > 스마트폰으로 avr 제어' 카테고리의 다른 글

step2-2. DC Motor pwm control  (0) 2013.11.20
step3. UART 통신 (비동기 통신)  (0) 2013.11.19
step1. 모터드라이브 L298N 제어  (0) 2013.11.19
step0. project 목차  (0) 2013.11.19
RF 용어 설명  (0) 2013.11.16
Posted by 나무길 :