학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

AVR PC 통신 (DC모터제어)

학습목표

12V 동작하는 모터드라이버 BA6209 PWM0 DC모터의 회전과 속도를 제어한다.

학습주제

좌측 그림은 PC에서 모터의 회전방향과 속도를 제어하는 화면이다. 오른쪽 그림은 아래 회로도에 따라 제작한 보드이다.

 

 

통신 프로토콜

통신은 4개의 문자를 보낸다. [통신시작(0x02)] [회전방향] [회전속도] [통신종료(0x03)]

회전방향 - 우회전(0x06), 좌회전(0x05), 정지(0x00)

회전속도 – 50~250 까지의 숫자를 문자로 바꾸어 송신하면 CPU OCR0 값으로 입력된다.

마이크로프로세서는 위의 데이타를 수신해서 모터의 회전을 제어한다.

예습내용

AVR PWM0 제어 참조하여 PWM 제어를 공부한다.

BA6209 데이터북 에서 모터 드라이버 회로도를 공부한다.

실습방법

   

1.       모터드라이버 보드의 제작

아래 그림과 같이 AVR B포트로 모터드라이버(BA6208) 구동한다.

포트번호

PB0

PB1

PB4

AVR 프로그램

우회전

1

0

PWM

PORTB.0=1   PORTB.1=0

좌회전

0

1

PWM

PORTB.0=0   PORTB.1=1

 

0

0

PWM

PORTB.0=0   PORTB.1=0

 

2. AVR 프로그램

 

보기1. PC에서 4개의 문자를 수신해서 방향과 속도를 제어하는 프로그램 [소스 프로그램 내려받기]

 

 

#include <mega128.h>

// …. 프로그램 생략

char receive=0;

 

// USART0 Receiver interrupt service routine

#pragma savereg-

interrupt [USART0_RXC] void uart0_rx_isr(void)

{

char status,data;

#asm

    push r26

    push r27

    push r30

    push r31

    in   r26,sreg

    push r26

#endasm

status=UCSR0A;

data=UDR0;

//RS232에서 0x02 수신되면 rx_buffer0 데이터를 저장하고

//0x03 전송되면 receive=1 데이터를 저장해 메시지를 발생 시킨다.

if(data == 0x02)    // 통신시작

       rx_wr_index0 = 0;  

 

if(data == 0x03)           // 통신 완료 - 메세지 발생

       receive=1;     

 

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

   {

   rx_buffer0[rx_wr_index0]=data;

   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;

   if (++rx_counter0 == RX_BUFFER_SIZE0)

      {

      rx_counter0=0;

      rx_buffer_overflow0=1;

      };

   };

#asm

    pop  r26

    out  sreg,r26

    pop  r31

    pop  r30

    pop  r27

    pop  r26

#endasm

}

#pragma savereg+

 

// …. 프로그램 생략

void main(void)

{

// …. 프로그램 생략

// Timer/Counter 0 initialization

ASSR=0x00;

TCNT0=0x00;

// ATmega128(L) Data Book P102

TCCR0 = 0x6f;      // (1) Fast PWM Mode, 16000000/(1024*256)=61Hz 주기 선택

OCR0 = 0xa0;        // 듀티비조절

// …. 프로그램 생략

// Global enable interrupts

#asm("sei")

 

 

while (1)

      {

      // rx_buffer0[1]=회전방향 rx_buffer0[2]=듀티비로 속도 조절

      if(receive==1) {

         if(rx_buffer0[1] == 0x30)

                  PORTB=0x01;

              else if(rx_buffer0[1] == 0x31)

                    PORTB=0x02;

              else if(rx_buffer0[1] == 0x32)

                    PORTB=0x00;

              OCR0 = rx_buffer0[2];

        receive=0; // 메시지 수신 상태를 0 설정

      }

 

      };

}

 

3. PC 프로그램

 

보기2. PC 화면에서 회전방향이나 속도의 노브값이 변하면 SendData 함수를 실행하여 4개의 문자를 송신 한다. [소스 프로그램 내려받기]

 

 

void CRs232Dlg::OnPointerValueChangedCwknob1(long Pointer, VARIANT FAR* Value)

{      // 회전방향 노브값 변화

       SendData();

}

 

void CRs232Dlg::OnPointerValueChangedCwknob2(long Pointer, VARIANT FAR* Value)

{      // 회전속도 노브값 변화

       SendData();

}

 

void CRs232Dlg::SendData()

{

       CString strTemp;

 

       if(m_nKnob.Value==0)

              strTemp.Format("%c%c%c%c",0x02,0x30,(char)m_nVelocity.Value,0x03);

       else if(m_nKnob.Value==1)

              strTemp.Format("%c%c%c%c",0x02,0x32,(char)m_nVelocity.Value,0x03);

       else if(m_nKnob.Value==2)

              strTemp.Format("%c%c%c%c",0x02,0x31,(char)m_nVelocity.Value,0x03);

       m_ComuPort.WriteComm((unsigned char*)(LPCTSTR)strTemp,4); // 4개의 문자를 송신한다.

}

 

처음