ÇнÀ¸ñÇ¥    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°³ÀÇ ¹®ÀÚ¸¦ ¼Û½ÅÇÑ´Ù.

}

 

óÀ½

 

°ú    Á¦