회원가입 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 펌웨어 & 코딩언어 HOT텍트로닉스(tektronix) 오실로스코프 질문드려요~~1 파괴지왕 1168 2010.06.24
65 펌웨어 & 코딩언어 HOTspice 프로그램을 만들고 싶습니다1 TreeOfDream 978 2010.06.21
64 펌웨어 & 코딩언어 HOTC언어 초보에요 ㅠㅠ 이쪽부분 간소화할려고하는데..조언좀..11 다크소마 1448 2010.06.19
63 펌웨어 & 코딩언어 HOTMFC 를 공부중입니다 API를 시작해야 하는데..3 TreeOfDream 1122 2010.06.11
62 펌웨어 & 코딩언어 HOT펌웨어 엔지니어입니다. 윈도우응용프로그램 MFC하고싶은데...6 상하이찬 1569 2010.06.02
61 펌웨어 & 코딩언어 HOT리눅스 기반 어셈블리어 작성했는데 자꾸 'command not found'라 뜨네요......2 하늘위의 성 1409 2010.05.30
60 펌웨어 & 코딩언어 HOT코드비젼 소스 설명좀 부탁드립니다 ㅠㅠ1 vsvm 2190 2010.05.24
59 펌웨어 & 코딩언어 HOT맥스포사의 mtm-cm3000 으로 리모콘 모듈이 조종 가능한가요? 철방이 880 2010.05.11
58 펌웨어 & 코딩언어 HOT코드비젼으로 컴파일해봤습니다...도움좀 주세요.4 푸후 1219 2010.05.04
57 펌웨어 & 코딩언어 HOT다시 작성합니다. MSDN 도움말 문제입니다. TreeOfDream 883 2010.04.29
56 펌웨어 & 코딩언어 HOT어셈블 도와주세요 ㅠㅠ1 마왕님 1032 2010.04.26
55 펌웨어 & 코딩언어 HOT왕초보 c언어 질문이요11 hshyo 1053 2010.04.19
54 펌웨어 & 코딩언어 HOT마이컴 제어하는 C언어 학습이 어디까지 이루어져야 할까요?8 봄날 1434 2010.04.17
53 펌웨어 & 코딩언어 HOT액세스 지정자에 대해서 궁금한 점이 있습니다. TreeOfDream 902 2010.04.17
52 펌웨어 & 코딩언어 HOT조이스틱 관련 Firmware,Driver 관련 조언 부탁드립니다.2 루키키 1094 2010.04.14
51 펌웨어 & 코딩언어 HOTc언어 배우려는 초보입니다.9 빛의속도 1026 2010.04.09
50 펌웨어 & 코딩언어 HOTzigbee 통신 프로그램 질문입니다!!5 소울 2451 2010.04.01
49 펌웨어 & 코딩언어 HOT비쥬얼 스튜디오 6.0에 관해서..3 꿇단지 1061 2010.03.24
48 펌웨어 & 코딩언어 HOTc언어 왕초보입니다. 좋은책 추천좀 해주세요10 circuit 1296 2010.03.15
47 펌웨어 & 코딩언어 HOT8051과 일반 C와 많이 차이나나요?5 개똥껄레 1098 2010.02.20
  • 약속으로 배가 채워지지는 않는다.
    - C.H.스퍼전
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.