• Daum
  • |
  • 카페
  • |
  • 테이블
  • |
  • 메일
  • |
  • 카페앱 설치
 
카페 프로필 이미지
i love qrp
 
 
 
 

자주가는 링크

 
등록된 링크가 없습니다
 
카페 게시글
검색이 허용된 게시물입니다.
QRP-426(FM radio) 생각 봅시다. 로터리 엔코더...
발싸개 추천 0 조회 480 12.07.10 15:47 댓글 26
게시글 본문내용
 
다음검색
댓글
  • 12.07.10 16:02

    첫댓글 (Ver.0707) 저 같은 경우에는 엔코더를 더블 클릭 했더니 .. 저장 되어 있던 주파수가 모두 사라졌 습니다 . 기냥 수동 주파수로 맞추어야 합니다.

  • 12.07.10 23:54

    퓨즈 비트를 internal 2MHz로 변경하셨나요?

  • 12.07.10 16:06

    32번 Table(데이터 시트상) 의 해석이 위 A,B 그림인가요 ?
    C 랭귀지 책을 아들책징에서 꺼냈는데 랭귀지 공부는 다음순위 같아서 . . .
    기라성 같은 선배님들 만 믿고 . . . ㅎ ㅎ ㅎ (염치없는 웃음)

  • 작성자 12.07.10 19:40

    아니요. 윗그림은 장착된 엔코더를 돌려보며 실제 검출한 값입니다. 도표는 INT0(외부 인터럽트0번핀)을 언제 작동케할지를 설정하는 것으로 특정 레지스터에 이값을 넣게 됩니다.

  • 12.07.10 16:50

    제가 생각하기에는.. 회전당 멈춤쇠 수와 펄스수가 기계적으로 다른 타입이 아닐까..따라서 프로그램으로 고치기는 어려울거라 생각 됩니다만..그림에서 보듯이 멈춤쇠 30에 15펄스 엔코더 .. 보통은 멈춤쇠와 펄스수가 같은데..아닌것도 있네요.고로.. 엔코더를 바꾸는게 스트레스 안받는 일 아닐까요?
    (제조업체:ALPS제품 카테고리:인코더
    RoHS:Y
    회전당 펄스(PPR):15 PPR
    멈춤쇠 수:30
    장착 스타일:Through Hole
    종단 스타일:Solder Pin
    출력:Incremental
    샤프트 타입:Metal
    스위치 포함:With
    포장:Tray
    Standard Pack Qty:700)

  • 12.07.10 17:36

    기계식 엔코더가 두 종류가 있어요. 한 클릭 돌릴 때 펄스가 나오는 것이 있고, 상태가 바뀌는 것이 있어요. 상태가 바뀌는 엔코더는 두 클릭 돌려야 펄스(H->L->H)가 한개 만들어지니까, 부품에 포함된 엔코더가 이것인 모양이군요.
    겉에 표시가 안되어 있으니 구별이 안될 거에요.(저도 구매할 때 실수를 한 적이 있어서)

  • 12.07.10 17:41

    이 번에 사용한 엔코더가 30 detent(클릭), 15 펄스 출력입니다.
    제 프로그램에서는 A상의 rising edge에서 B상의 레벨이 high인지 low인지를 체크하기에 위의 엔코더를 사용하면 두 클릭에 한번 주파수가 변합니다. 제 생각에는 좀더 세분해서 비교한다면 (1/4주기) 0-1-3-2 (CW), 0-2-3-1 (CCW) 가 인지되니 한 클릭에 한번 주파수 변화를 줄 수 있을 것 같습니다. 이렇게 어려운 것은 고수님께 패~스.

  • 12.07.10 17:43

    제가 encoder를 구입할 때 24 detent, 24 pulse 나오는 것도 있기는 했는데 샤시 체결형이 아니라서 그냥 이번 걸로 구입하였습니다.

  • 12.07.10 17:42

    두 클릭에 한 펄스가 나오면 이미지의 코드값을 두개 사용하면 한 클릭당 한 펄스가 나옵니다,
    반대로 한 클릭에 두 펄스가 나오면 코드값을 한개만 사용하면 됩니다.
    과거 상태 값과 현재 상태값을 비교하여 좌/우회전을 판별합니다.

  • 작성자 12.07.10 19:50

    전후 값을 비교하면 되지만...
    인터럽트를 사용하려다 보니 그렇습니다.

    A,B값은 클릭후 값이 00->11->00을 반복하므로 CW, CCW를 구별하기 어렵습니다.

  • 12.07.10 20:08

    int0, int1 둘 다 인터럽트를 걸면 어떨까요? 라이징, 폴링 다 감지하고요.

  • 12.07.10 20:17

    윗 그림을 보면 다른 엔코더와 다른 점이 없는데요.
    A상 쪽에 인터럽트가 발생하고 B상을 모니터링하는 방식이라면 폴링에지를 사용하면 해결되는 것이 아닌가요?
    A상쪽에서 폴링에지에 인터럽트가 발생할 때 B상 모니터링 결과가 HIGH면 역회전, LOW면 정회전으로 간단히 처리하면 될 것같은데요.
    ISR(INT0_vect)
    {
    if(B상 == HIGH)
    encoder_dir = reverse;
    else
    encoder_dir = forward;
    }

  • 12.07.10 21:58

    엔코더 중에 두 클릭에 펄스 하나가 나오는 것이 있나요?
    만약 있다면 그 용도는 뭘까요?
    회로도를 자세히 보지 않아 잘 모르겠지만, 엔코더 출력 쪽에 풀업이 걸려있지 않나요?
    그럼 엔코더 대기 상태에서는 두 상 모두 하이가 떠야 되는데, 윗 그림 상으로는 두 상 모두 LOW에서 출발하네요.
    헷깔립니다.

  • 12.07.10 22:37

    엔코더 쪽에 풀업 저항 있습니다.
    이것이 36클릭 18펄스인 엔코더(EC11E18244AU )이고요, 빨간 선이 클릭 멈춤위치입니다. 우리 것은 30클릭 15펄스인데 그림은 비슷할겁니다. 전압을 재어 보면 매 클릭마다 H-H, L-L 로 나옵니다.
    엘레파츠에 보니 2 클릭에 1 펄스 나오는 엔코더가 꽤 많이 있네요. 맞는 용도가 있기는 있는 모양입니다.

  • 12.07.10 22:35

    24클릭 24펄스(알프스 EC12E24204A9) 엔코더입니다. 역시 빨간 표시된 곳이 매 클릭 멈춤 위치입니다. A상에 인터럽트를 걸어 두고 오르막 또는 내리막일 때 B상의 상태를 체크하는 프로그램 방식으로는 이 넘을 써야 될 것 같습니다.

  • 12.07.10 22:56

    그렇군요. 2클릭을 모두 인식하려면 A상에 인터럽트가 걸리는 방식은 그대로 두고, interrupt trigerring을 any change로 변경한 후 인터럽트 서비스 루틴을

    MCUCR |= (0 << ISC01) | (1 << ISC00);

    ISR(INT0_vect)
    {
    if(((PIND & 0x40) && !(PIND & 0x80)) || (!(PIND & 0x40) && (PIND & 0x80))
    encoder_dir = forward;
    else if((!(PIND & 0x40) && !(PIND & 0x80)) || ((PIND & 0x40) && (PIND & 0x80))
    endcoder_dir = reverse;
    }

    로 바꾸면 어떨까요? 그럼 한 클릭에 1번 주파수 변경이 될 듯 한데요.

  • 12.07.10 23:41

    매 클릭마다 주파수가 변하기는 하는데 cw, ccw 다 주파수가 내려갑니다. (엔코더 핀 연결에 따라서 올라가기만 할 수도 있습니다. 즉 한 방향으로만 변합니다.)

  • 12.07.11 00:18

    논리상으로는 가능할 듯 한데, 다른 문제가 있나 봅니다.

    엔코더와 MCU를 구해서 내일 테스트해보고 결과올리겠습니다. 첨부한 그림에서 화살표는 falling or rising edge 시 입력포트의 로직레벨을 표시한 건데, 엔코더를 1 클릭할 때 마다 대기상태가 00 또는 11을 가정한 겁니다. 오실로스코프로 파형을 보고 실제 프로그래밍해보겠습니다.

  • 12.07.11 00:46

    매번 PIND를 읽으므로써 제한된 포트 리딩 타이밍을 놓치는 문제일수도 있을 것같습니다.

    ISR(INT0_vect)
    {
    unsigned char pind = PIND;

    if(((pind & 0x40) && !(pind & 0x80)) || (!(pind & 0x40) && (pind & 0x80))
    encoder_dir = forward;
    else if((!(pind & 0x40) && !(pind & 0x80)) || ((pind & 0x40) && (pind & 0x80))
    endcoder_dir = reverse;
    }

    로 테스트해보시겠습니까?

  • 12.07.11 00:50

    결과가 동일합니다.

  • 12.07.11 01:02

    A상이 PD2, B상이 PD3에 연결된 것이 맞나요? 인터럽트0(PD2)를 사용하는 것은 맞는 것처럼 보이고요.

    아래 소스는 내일 테스트해볼 자료로 그냥 올리는 것이니, 내일 지우도록 하겠습니다.

    ISR(INT0_vect)
    {
    unsigned char pind = PIND;
    unsigned char A = pind & 0x40;
    unsigned char B = pind & 0x80;

    if((A && !B) || (!A && B))
    encoder_dir = forward;
    else if((!A && !B) || (A && B))
    endcoder_dir = reverse;
    }

  • 12.07.11 01:07

    회로도에 나온대로 PD2 에 B상, PD3 에 A상, PD2에 INT0 사용합니다. A상 B상은 바뀌어도 방향만 바뀌는 것이니 문제는 없을 것으로 봅니다.

  • 12.07.11 01:23

    위와 같이 하면 제 프로그램에서는 엔코더를 어느 방향으로 돌리든 if((A && !B) || (!A && B)) 에 해당됩니다(forward)

  • 12.07.11 14:33

    오리님께 한세트 받은 라디오키트에 포함된 엔코더로 테스트했습니다.

    오실로스코프로 확인한 결과, CW, CCW 공히 시간차 공격이 일정하지 않습니다. 특히 CW의 경우 시간차가 없는 경우가 많고 CCW의 경우는 시간차가 있는 경우와 없는 경우로 나눠지며 시간차도 일정치 않습니다.
    엔코더 품질의 문제가 아닐까 싶은데, 좀 더 테스트해보겠습니다만, 품질의 문제가 확실하면 사용이 불가할지도 모르겠네요.

    소스는 아래와 같습니다.

  • 12.07.11 14:44

    수고 많으십니다.
    디지탈 오실로를 들이대니 다 보이는 군요

  • 12.07.11 14:33

    ISR(INT0_vect)
    {
    unsigned char pind = PIND;
    unsigned char A = (pind & 0x04) ? 1 : 0;
    unsigned char B = (pind & 0x08) ? 1 : 0;

    if(A != B)
    {
    if(++step > 108)
    step = 88;
    }
    else if(A == B)
    {
    if(--step < 88)
    step = 108;
    }
    }

최신목록