회원가입 ID/PW 찾기
AA

PWM 제어로 할려구 하는데요.

PWM은 PE3

en은 PE1

dir은 PE2  이렇게 연결했습니다.

밑에 써놓은 것은 정회전입니다.

 DDRE = 0xFF;

 TCCR3A = 0b10101010;
 TCCR3B = 0b00011010;
 TCNT3 = 0;
 ICR3 = 1000;

 

 PORTE=0b00000010;
 
 OCR3A = 2000;

 

그래서 역방향으로 할려면 빨간색인 부분을 바꿔야 될 것 같아서

제 생각대로 바꿔봤는데 잘 안바뀌네요;;;

여기서 어떻게 해야 역방향으로 돌까요 ㅠㅠ

(모터 드라이버는 http://www.devicemart.co.kr/mart7/mall.php?cat=017012005&query=view&no=15731 입니다.)

댓글 8
  • No Profile

    듀티비를 쪽을 참고해보세요

  • No Profile
    듀티비는 상관없을것 같고요..PORTE 의 0x02 (b00000010) 얘를 그냥 '0'으로 만들어 주시면 역회전 합니다.
  • 테나르님께
    No Profile
    글쓴이 붑붑붑붑 10.05.30 20:58 댓글 좋아요 0 싫어요 0

    이상하네요..... 역회전이 안되네요..... 정지해버려요.....
    다른 방법 없을 까요?

  • No Profile

    만약 정회전이 정상적으로 되고 있다면 역회전도 무리없이 되야 할텐데...
    소스코드를 전부다 올려 보시죠..

  • 테나르님께
    No Profile
    글쓴이 붑붑붑붑 10.05.31 12:06 댓글 좋아요 0 싫어요 0

    #include <avr/io.h>
    #include <string.h>

    // Address MAP
    #define LCD_EN (*(volatile unsigned char *)0x8000)
    #define LCD_WRITE (*(volatile unsigned char *)0x8002)
    #define ENC1_DATA (*(volatile unsigned char *)0x8010)
    #define ENC1_CNTL (*(volatile unsigned char *)0x8011)
    #define ENC2_DATA (*(volatile unsigned char *)0x8020)
    #define ENC2_CNTL (*(volatile unsigned char *)0x8021)

    // LCD Control Params
    #define LINE1 0x00 //LCD_DISPLAY_LINE1
    #define LINE2 0x40 //LCD_DISPLAY_LINE2

    // 7166 Control Params
    #define MASTER_RESET  0x20 // master reset command
    #define INPUT_SETUP   0x48 // setup counter input mode
    #define QUAD_X1    0xC1 // quadrature multiplier to 1
    #define QUAD_X2    0xC2 // quadrature multiplier to 2
    #define QUAD_X4    0xC3 // quadrature multiplier to 4
    #define ADDR_RESET   0x01 // reset address pointer
    #define LATCH_CNTL   0x02 // latch counter
    #define CNTL_RESET   0x04 // reset counter
    #define PRESET_CNTL   0x08 // transfer preset to counter
    #define OUTPUT_SETUP  0x80

    void delay_us(unsigned char);
    void delay_ms(unsigned int);
    void FunctionSet();
    void DisplayOnOffControl();
    void DisplayClear();
    void EntryModeSet();
    void DisplayChar(unsigned char);
    void DisplayString(unsigned char *);
    void SetLCDAddress(unsigned char);
    void DisplayInt(unsigned int);
    void InitEncoder();
    void PresetEncoder( unsigned char channel, unsigned char c3, unsigned char c2, unsigned char c1);
    unsigned long ReadEncoder( unsigned char channel );

    int main(void)
    {

     MCUCR = 0x80;
         XMCRA = 0x40;
         XMCRB = 0x80;
     
     // LCD  초기화
     FunctionSet();   // CPU와의 Interface를 4bit로 할것인지/8bit로 할 것인지 결정
     DisplayOnOffControl(); // Display를 On
     DisplayClear();  // 화면을 지우는 것
     EntryModeSet();  // 화면 출력 방식 결정

     delay_us(200);
     SetLCDAddress(LINE1);
     DisplayString("PROGRAM");
     SetLCDAddress(LINE2);
     DisplayString("STARTED");
     
     // 7166 초기화
     InitEncoder();
     PresetEncoder( 1, 0x10, 0x00, 0x00 ); // Preset 0x100000
     PresetEncoder( 2, 0x10, 0x00, 0x00 ); // Preset 0x100000


     DDRE = 0xFF;
     PORTE = 0x00;

     //Timer setting
     TCCR3A = 0b10101010;
     TCCR3B = 0b00011010;
     TCNT3 = 0;
     ICR3 = 1000;

     PORTE = 0b00000010;

     OCR3A = 2000;
     
     while(1){


      }

     
    }

    void InitEncoder( void )
    {
     ENC1_CNTL = MASTER_RESET;
     ENC1_CNTL = OUTPUT_SETUP;
     ENC1_CNTL = INPUT_SETUP;
     ENC1_CNTL = QUAD_X4;
     ENC1_CNTL = CNTL_RESET;
     ENC1_CNTL = ADDR_RESET;

     ENC2_CNTL = MASTER_RESET;
     ENC2_CNTL = OUTPUT_SETUP;
     ENC2_CNTL = INPUT_SETUP;
     ENC2_CNTL = QUAD_X4;
     ENC2_CNTL = CNTL_RESET;
     ENC2_CNTL = ADDR_RESET;
    }

    void PresetEncoder( unsigned char channel, unsigned char c3, unsigned char c2, unsigned char c1)
    {
     if( channel == 1 ) {
      ENC1_CNTL = ADDR_RESET;
      ENC1_DATA = c1;
      ENC1_DATA = c2;
      ENC1_DATA = c3;
      ENC1_CNTL = PRESET_CNTL;
     }
     else if(channel == 2) {
      ENC2_CNTL = ADDR_RESET;
      ENC2_DATA = c1;
      ENC2_DATA = c2;
      ENC2_DATA = c3;
      ENC2_CNTL = PRESET_CNTL;
     }
    }

    unsigned long ReadEncoder( unsigned char channel )
    {
      long position=0;
     if( channel == 1 ) {
      ENC1_CNTL = LATCH_CNTL;
       ENC1_CNTL = ADDR_RESET;
      position = (unsigned long)ENC1_DATA;
      position += (unsigned long)ENC1_DATA << 8;
      position += (unsigned long)ENC1_DATA << 16;
      }
     else if( channel == 2 ) {
      ENC2_CNTL = LATCH_CNTL;
       ENC2_CNTL = ADDR_RESET;
      position = (unsigned long)ENC2_DATA;
      position += (unsigned long)ENC2_DATA << 8;
      position += (unsigned long)ENC2_DATA << 16;
     }
     return position;
    }

    void DisplayInt( unsigned int cnt )
    {
     unsigned char c1, c2, c3, c4, tmp;
     
     c4 = cnt/1000; // c4 = 1
     c3 = (cnt % 1000)/100; // c3 = (245)/100 = 2
     tmp = cnt % 100; // tmp = 45
     c2 = tmp/10;
     c1 = tmp%10;
      
     DisplayChar(c4+48);
     DisplayChar(c3+0x30);
     DisplayChar(c2+0x30);
     DisplayChar(c1+0x30);
    }


    void delay_us(unsigned char time_us)
    {
     register unsigned char i;
     for(i=0;i<time_us;i++) // 4 cycles
     {
      asm volatile("PUSH R0"); // 2 cycles
      asm volatile("POP R0"); // 2 cycles
      asm volatile("PUSH R0"); // 2 cycles;
      asm volatile("POP R0"); // 2 cycles;
      asm volatile("PUSH R0"); // 2 cycles;
      asm volatile("POP R0"); // 2 cycles;
     }
    }

    void delay_ms(unsigned int time_ms)
    {
     register unsigned int i;
     for(i=0;i<time_ms;i++)
     { 
      delay_us(250);
      delay_us(250);
      delay_us(250);
      delay_us(250);
     }
    }

    void DisplayChar(unsigned char c)
    {
     LCD_WRITE = c;
     delay_us(50);
    }

    void DisplayString(unsigned char* s)
    {
     unsigned char i, j;
     i = 0;
     j = strlen(s);
     for(i=0;i<j;i++) {
      DisplayChar(s[i]);
     }
    }

    void SetLCDAddress(unsigned char mode)
    {
     LCD_EN = (0x80 | mode);
     delay_us(50);
    }

    void FunctionSet()
    {
     delay_us(40);
     LCD_EN = 0x38;
    }

    void DisplayOnOffControl()
    {
     delay_us(40);
     LCD_EN = 0x0c;
    }

    void DisplayClear()

     delay_us(40);
     LCD_EN = 0x01;
    }

    void EntryModeSet()
    {
     delay_ms(2);
     LCD_EN = 0x06;
     delay_us(40);
    }

  • 테나르님께
    No Profile
    글쓴이 붑붑붑붑 10.05.31 12:09 댓글 좋아요 0 싫어요 0

    왜...이럴까요?ㅜ

  • No Profile
    죄송합니다만...정회전 하는 것도 정상적으로 도는 것이 맞나요? 스코프로 원하시는 파형이 출력되는지 직접 확인하셨나요?
  • 테나르님께
    No Profile
    글쓴이 붑붑붑붑 10.06.01 00:32 댓글 좋아요 0 싫어요 0

    수정하다 보니 제가 잘못한 점을 알아서 이제 역회전으로 돌기 시작했어요
    감사합니다. 신경써주셔서ㅜ^^

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
66 개발용역 HOTPCB Art Work 제작9 박팔뚝 5505 2010.10.18
65 개발용역 HOT계약직 또는 알바 형태로 프로그램 짜 주실분 찾습니다.(종료) 푸른하늘은하수 5666 2010.10.14
64 개발용역 HOT자동차 밧데리 충전기 개발1 C1 6571 2010.10.11
63 개발용역 HOT의뢰: Arduino로 제작된 코드를 ARM7용으로 포팅해 주실 분을 찾습니다.1 센서블유아이 5243 2010.09.28
62 개발용역 HOT삼성 3.5인치 TFT-LCD (Touch 포함) 싸게 드려요. 삼성 3.5인치 TFT-LCD (Touch 포함) 싸게 드려요. 띵요루슛 4713 2010.09.17
61 개발용역 HOT8051: 적외선 물체 감지3 enshiper 6463 2010.09.13
60 개발용역 HOTPCB 임베디드 프로그래밍 , 아르바이트 의뢰. 업체도 문의 가능1 대경 11844 2010.09.05
59 개발용역 HOT고압 파워 개발1 미스메이커 5544 2010.08.27
58 개발용역 HOTPCB 아트웍 / PCB 제작 / PCB 조립 전문 업체1 용가리3 12192 2010.08.14
57 개발용역 HOTPCB ARTWORK 설계 / 교육 업체 CADROOM 입니다.1 코딱지 5517 2010.08.11
56 개발용역 HOTserial port data를 pc로 전송하여 그래프화를 하고 싶습니다.1 Cool™ 5504 2010.08.10
55 개발용역 HOT사인파를 정류해서 led로 표시할려면3 초초 6215 2010.08.04
54 개발용역 HOT이런것도 개발 의뢰라고 해야하나...4 밤귀신 6249 2010.07.27
53 개발용역 HOT회로설계 & pcb 아트웍 배우고 싶으신분10 용가리3 12028 2010.07.17
52 개발용역 HOTWireless + Touch 제품 MCU S/W 개발 알바가능하신분 연락바랍니다. Quadro 11744 2010.07.17
51 개발용역 HOT전자회로,펌웨어등 유능한 인재를 모십니다. 파워짱 6404 2010.06.05
50 개발용역 HOTled콘트롤5 아크마 6843 2010.05.27
49 개발용역 HOT제작의뢰 : 8051 적외선센서5 벤트너 6203 2010.05.09
48 개발용역 HOT전광판 컨트롤러 개발자료 가지고 계신분 모십니다.3 쓰나미 5597 2010.05.03
47 개발용역 HOT샘플 보드 손으로 smd 땜해 주실분 있나요?5 땜고수 5129 2010.04.29
Prev 1 ... 3 4 5 6 7 8 9 10 11 12 Next
  • 가족이란 선택하는 것이 아니다. 그들은 당신에게 주어진 신의 선물이다. 당신이 그들에게 그러하듯이.
    - 투투
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.