|
Clockwise Rotation -> |
00 01 11 10 00 |
<- Counter Clockwise Rotation |
2. 알고리즘
1) CW와 CCW를 구별하는 것이 키 포인트입니다.
2) 현재의 엔코더 출력값을 직전의 값과 비교하여 CW, CCW 판단을 합니다.
3) 중요부분 PIC 어셈블러 코드
MOVF PORTB,0 ; 현재의 엔코더 값을 읽어 들임.
MOVWF Q_NOW
MOVLW B'00000011'
ANDWF Q_NOW,1
MOVF Q_NOW,0
IORWF Q_OLD,0 ; 이전의 엔코더 값과 결합 ---> 4 비트화
MOVWF Q_ACT ; 결합한 값의 저장
MOVF Q_NOW,0
MOVWF Q_OLD ; 현재의 엔코더 값을 이전 값으로 저장
RLF Q_OLD,1
RLF Q_OLD,1
MOVF Q_ACT,0
ANDLW 0FH
ADDWF PCL,1 ; "이전+현재" 값에 따라 이벤트 발생 !
RETURN ; 00->00
GOTO DEC_COUNT ; 00->01 -1
RETURN ; 00->10 +1 * 이벤트 감소를 위해 무효화
RETURN ; 00->11
GOTO INC_COUNT ; 01->00 +1
RETURN ; 01->01
RETURN ; 01->10
RETURN ; 01->11 -1 * 이벤트 감소를 위해 무효화
RETURN ; 10->00 -1 * 이벤트 감소를 위해 무효화
RETURN ; 10->01
RETURN ; 10->10
GOTO INC_COUNT ; 10->11 +1
RETURN ; 11->00
RETURN ; 11->01 +1 * 이벤트 감소를 위해 무효화
GOTO DEC_COUNT ; 11->10 -1
RETURN ; 11->11
INC_COUNT
DEC_COUNT
3. 고려사항
1) 로터리 엔코더의 종류에 따라 한번(one click) 움직일 때 "00->01->11->10->00"의 순환을
한번 하는 것과 "00->01->11"까지 1/2 순환 하는 것이 있습니다.
2) one click에 4번의 이벤트(A,B상의 변화)가 발생하므로 클릭당 1번의 이벤트 발생을 원한다면
4개의 이벤트 중 3개를 무효화 하면 됩니다.
3) 기계식 로터리 엔코더는 1 회전에 20~30 클릭이므로 걸림없는 부드러운 회전을 원한다면
광학식 엔코더를 사용하면 됩니다. 물론 기계식에 비해 high cost 입니다.
4. 정상 작동을 확인한 모습.
첫댓글 발싸개님의 깔끔한 모습이 아름답습니다. 빵판에다 한것인데도 질서정연한 와이어의 배열을 보니 군대 사열하는 것 같습니다.ㅎㅎㅎㅎ 새해 복 많이 받으세요!!!
하나,둘씩 DDS 의 참맛이 나오는군요,....다음주중으로 DDS 보드 테스트샘플 만들겠습니다....
왕초보라서 flow chart가 있다면 알고리즘의 이해가 더 쉬웠을텐데! 깔끔한 배선가 맘에 속듭니다. 화이팅!