[로터리 엔코더] 엔코더의 작동 원리 및 사용 방법

임베디드 2016.07.31 19:25

 모종의 일로 엔코더를 접하게 된 기회가 생겨 관련 내용을 조사해 보았는데 엔코더를 완전히 처음 접하게 되는 저의 입장에서 인터넷 상에 올라온 엔코더에 대한 정보를 이해하는데 상당히 많은 시간이 들어 애를 먹었던 기억이 있어 이후 저와 같이 엔코더에 대해 알아보고자 하는 분들에게 좀 더 쉬운 이해를 드리고자 나름의 방법으로 엔코더의 원리와 사용법에 대해 간단히 설명해보고자 이 포스팅을 작성하게 되었습니다. 초심자의 입장에서 이해를 할 수 있도록 하는 방향으로 포스팅을 작성하였으나 여전히 궁금한 점이 있으신 분이라면 부담없이 이 포스팅의 답글로 질문을 해주신다면 환영합니다!


 ※이 포스팅은 오토닉스社의 로터리 엔코더인 E20S시리즈(E20S-2-360-3-N-5-S)를 기준으로 작성하였으며 엔코더 제작사에 따라 회로 구조 및 동작 방식이 다소 차이가 있을 수 있음을 알립니다.


  엔코더는 회전하는 물체의 회전속도(각속도 등)을 측정하기 위해 사용되는 기기로서 엔코더의 회전축에 측정하고자 하는 회전체의 축을 서로 연결하여 돌아가는 방향과 횟수를 정밀하게 측정하는 것을 목표로 사용됩니다.(전자공학에서 디지털 논리 과목에서 듣게되는 Encoder와는 철자만 같을 뿐 전혀 다릅니다. 여기서 설명하는 엔코더는 주로 '로터리 엔코더'로 칭합니다.)


1. 엔코더의 종류

 회전축이 돌아가는 정도를 측정하는 방식으로는 인크리멘탈(Incremental, 증분) 방식과 앱솔루트(Absolute, 절대) 방식이 존재합니다.
 인크리멘탈 방식은 말 그대로 점진적으로 증가하는(더하는) 형식을 쓰는 것으로 엔코더가 돌아갈 때 발생되는 파형의 횟수를 통해 회전축의 회전 속도를 측정합니다. 이는 일정한 방향으로 회전하는 기기에 사용하기 적합한 방식으로 DC모터와 같이 돌아가는 기기의 속도를 정밀하게 측정하기에 적합한 방식입니다.

위 그림은 인크리멘탈 방식의 원리를 간단한 그림으로 나타낸 것입니다. 각 발광소자를 통해 나오는 빛이 A상, B상, Z상을 주기적으로 비추게 되는데 엔코더가 회전을 하게 되었을 때 회전 슬릿으로 나오는 빛이 각 상에 비추었다가 가려지는 식으로 회전축이 돌아가는 속도를 측정하는 방식이라 할 수 있겠습니다.

 한편, 앱솔루트 방식은 이름 그대로 각 지점의 절대값을 설정하여 엔코더가 축을 중심으로 돌던 도중 측정되는 해당 위치에서의 값을 전달하는 방식입니다. 이 방식은 인크리멘탈 방식과는 달리 1바퀴 이상 돌아가지 않는 기기, 즉 특정 각도로 미세하게 움직여야 하는 기기에 사용하기 적합한 방식이라 할 수 있습니다.

앱솔루트 방식의 원리를 그림으로 나타내었을 때 회전 슬릿이 인크리멘탈 방식과 확연히 다르다는 것을 알 수 있습니다. 회전축이 움직이던 도중 특정 위치에서 이동한 만큼의 위치값이 전달되는데 해당 각도에 대한 값이 회전 슬릿의 구멍을 통해 나타내었으며 해당 슬릿을 통과한 빛의 위치 및 가중치를 고려하여 해당 엔코더가 회전한 위치값을 전달하게 됩니다.


2. 분해능

 분해능은 엔코더의 성능 중 가장 중요한 요소로서 사용되는 기기의 특성 및 사양에 따라 달리 사용될 수 있습니다. 분해능이 높을수록 축의 회전 속도 및 위치를 미세하게 측정할 수 있는데 엔코더가 1회 회전하였을 때 발생신호는 분해능의 갯수만큼 출력됩니다.


 예를 들어 인크리멘탈형 엔코더의 경우 분해능이 360인 엔코더에 연결된 기기가 1바퀴를 정확히 돌았을 때 총 360개의 펄스가 발생합니다. 즉, 한 바퀴를 정확히 회전하였을 때 360°이므로 360/360 =1° 이동할 때 마다 1개의 펄스가 발생되는 것이지요. MCU에 연결된 기기에 타이머를 설정하여 특정 시간동안 MCU에 입력된 횟수를 토대로 엔코더의 회전 각속도를 측정해낼 수 있습니다.


 반면 앱솔루트형 엔코더의 경우 회전체가 회전한 위치를 알아내는 것이 목표로서 만약 분해능이 360일 경우 현재 회전체가 회전한 정도를 실제 도수 단위인 1° 단위로 위치를 측정합니다. 만약 90° 정도에 위치했던 회전체가 시계 방향으로 30° 이동하게 되면 엔코더의 출력값이 90°에서 120°로 출력되는 방식입니다.


3. 출력 방식

 인크리멘탈형 엔코더의 경우 증분 방식으로 회전수를 측정하는 것이 목표이므로 MCU 측에서는 Rising-Edge 입력 인터럽트를 통해 회전율을 측정하게 됩니다.

 위 그림은 인크리멘탈형 엔코더의 출력 방식을 그림으로 나타낸 것으로 시계방향(CW : Clockwise)으로 회전시의 모습입니다. A상과 B상의 주기는 같으나 회전 방향에 따라 위상차가 생겨 이를 사용하여 엔코더의 회전 방향을 예측할 수 있습니다. 반면 Z상의 경우 B상보다 주기가 2배이며 회전 방향을 식별하지 않아도 되는 경우, 즉 엔코더가 한쪽 방향으로만 돌기 때문에 이를 굳이 구분할 필요가 없을 경우 Z상만 사용해도 될 듯 합니다.


시계방향(CW)

반시계방향(CCW)

  위 그림은 A상과 B상의 위상을 통해 엔코더의 회전 방향을 분석하는 방법을 타나낸 것입니다. 엔코더의 축이 시계방향(CW)으로 돌 경우 A상이 B상보다 90° 앞서고 있으며 반시계방향(CCW)으로 돌 경우 반대로 B상이 A상보다 90° 앞서게 되는 것을 보실 수 있습니다. 이러한 A상과 B상의 위상차를 사용하여 엔코더의 축이 돌아가는 방향을 알아내는 방법은 다음과 같습니다.


1) 소트프웨어 방식

 A상을 GPIO Input 모드로 연결하고 B상을 Rising Edge 방식의 Interrupt로 설정합니다. B상에 의해 Interrupt 발생시 A상의 입력값이 1일 경우 시계방향(CW)으로, 0일 경우 반시계방향(CCW)으로 회전함을 확인할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
unsigned char rotate_direction;
 
void Interrupt_InputB(){
    unsigned char state = IfxPort_getPinState(&MODULE_P33, 0); // identify phase A
    if(state){
        rotate_direction = 1;
    }else{
        rotate_direction = 0;
    }
}
cs


2) 하드웨어 방식

 간단한 D플립플롭을 사용하여 회전 방향을 알 수 있는 회로를 보도록 합니다.

 위 그림은 A상을 입력 D에, B상을 클록에 연결하여 출력 Q값을 통해 방향을 확인할 수 있습니다. D 플립플롭의 특성상 클록이 rising edge가 입력될 때 까지 출력값 Q가 고정되었다가 rising edge가 입력된 순간 A상의 위상을 출력하게 됩니다. 축의 회전방향에 따라 A상과 B상의 위상이 바뀌는 특성을 이용하여 위에서 보시는 바와 같이 회전방향을 출력해 내는 것을 확인하실 수 있습니다.


 한편, 앱솔루트 방식의 엔코더를 사용할 경우 엔코더의 위치값이 그대로 출력되므로 MCU의 GPIO Input모드로 각 값을 받아들여 값을 처리하면 됩니다.

위 그림은 앱솔루트형 엔코더의 파형을 나타낸 것입니다. 이 엔코더의 분해능은 6으로 빨간색으로 표시한 부분을 통해 엔코더가 회전한 위치를 알 수 있습니다. 분해능이 6인 앱솔루트형 엔코더를 통해 기기의 회전체가 60°, 120°, 180°, 240°, 300°, 360° 위치로 움직였음을 알 수 있습니다.


4. 회로 설계방법

 엔코더의 물리적 사용법에 따라 인크리멘탈형과 앱솔루트형을 선택한후 다음으로 엔코더를 설치할 회로의 특성에 따라 토템폴 방식, NPN오픈콜렉터 방식, PNP오픈콜렉터 방식 라인드라이버 방식이 있습니다. 각 방식의 장점은 다음과 같습니다.


토템폴(Totem Pole) 방식       - 파형의 왜곡 및 노이즈의 영향을 적게 받고 엔코더와 회로의 거리가 멀 때 사용하기 좋다.

NPN(PNP)오픈콜렉터 방식     - 엔코더의 전원전압과 회로의 전원전압이 다를 경우 사용하기 좋다.

라인드라이버(Line Driver)방식 - 엔코더로부터 회로의 위치가 멀리 떨어져있을 경우 빠른 응답속도로 동작할수 있다.


 엔코더를 사용하고자 하는 목적에 따라 회전횟수를 측정하여야 하는 경우 인크리멘탈형으로, 회전체의 미세한 이동각도를 측정하고자 하는 경우 앱솔루트형 엔코더를 사용하며 자신의 회로에 맞는 특성을 고려하여 엔코더를 고르신다면 제작에 큰 도움이 되시리라 기대합니다.


참고자료 : 오토닉스社 제품 사용 설명서
http://autonics.co.kr/products/products_2.php?big=01&mid=01/06

  • 고마워요 2017.04.03 18:42 ADDR 수정/삭제 답글

    잘정리된 글 덕분에 이해가 되네요 고맙습니다

  • 감사합니다 2017.07.06 14:55 ADDR 수정/삭제 답글

    정말 이해가 많이 되었습니다.

  • 오굿 2018.02.01 23:11 ADDR 수정/삭제 답글

    어려운 내용인데 상세한 설명덕분에 바로 이해가 되네요. 고맙습니다

  • 와우 2018.09.05 11:09 ADDR 수정/삭제 답글

    이해가 한번에 됬습니다. 죄송하지만 제 블로그에 링크좀 걸어놓을게요^^ 두고두고 확인하게용 ㅎ

    • Justin T. 2018.09.05 11:37 신고 수정/삭제

      제 블로그의 글이 도움이 되셨다고 하시니 저야말로 감사합니다. 제 글이 다른 분들께도 도움이 된다면 저야 기쁘지요

  • 대단해요 2018.10.20 20:21 ADDR 수정/삭제 답글

    덕분에 이해가 쉽게되고 과제에 많은 도움이 되었습니다.
    정말 감사합니다.!!!

  • ㅎㄷㄷ 2018.11.16 15:03 ADDR 수정/삭제 답글

    과제 하는데 많은 도움이 되었어요 고마워용!!

  • 궁금합니당 2018.11.25 01:51 ADDR 수정/삭제 답글

    정말 엔코더 원리 이해는데 도움 많이 되었습니다. 질문이 있습니다. 앱솔루트 엔코더 타이밍도에서 빨간색 부분만을 통해 위치 확인한 이유가 있나요? 그외의 타이밍도는 뭘뜻하나요?

    • Justin T. 2018.11.25 02:32 신고 수정/삭제

      안녕하세요.
      먼저 첫 번째와 두 번째 펄스는 Timing Pulse로 빨간 네모로 표시한 펄스가 입력되는 시기에 입력된 펄스를 올바르게 인식하기 위한 것으로 목표로 하는 각도에 도달하는 타이밍을 맞추기 위해 사용되는 것으로 이해하시면 될 것입니다.
      마지막줄에 있는 펄스는 Parity Pulse로 입력값에 오류가 있는지를 확인하는 용도로 사용되는 것입니다. 그림에서 주어진 펄스는 Odd pariry pulse로서 입력 펄스와 parity pulse에서 표시되는 high의 개수가 무조건 홀수여야합니다. 위의 그림에서 확인하실 수 있듯이 빨간색으로 표시한 부분과 Parity pulse에서 출력이 high인 펄스의 개수가 각 각도별로 모두 홀수가 됨을 확인하실 수 있습니다.

  • 라인드라이버방식 2019.03.04 21:47 ADDR 수정/삭제 답글

    제가 구매한 엔코더가 라인드라이버 방식인데 리시버가 필요하다고 하는데 시중에 나와있는게 없는 것 같은데 꼭 리시버가 필요한것인가요? 필요하다며 어떤 걸 사용해야하는 건지 알 수 있을까요?

    • Justin T. 2019.03.04 22:15 신고 수정/삭제

      https://support.maxonmotor.com/hc/en-us/articles/360006438213-Encoder-Line-Driver

      라인드라이버의 신호를 수신하기 위해서는 라인리시버가 필요합니다.
      라인드라이버에 맞는 라인리시버는 아마도 라인드라이버 설명서에 있으리라 생각됩니다.

  • z상 2019.11.18 18:56 ADDR 수정/삭제 답글

    글 잘 읽었습니다!! 저는 NI-9401 이라는 제품에 엔코더를 연결해서 Labview 프로그램으로 RPM을 측정 하려고 합니다!! 그렇다면 A,B상은 굳이 9401에 연결하지 않고, Z상만 연결해도 RPM값을 볼 수 있는건가요??

    • Justin T. 2019.11.18 19:04 신고 수정/삭제

      엔코더의 회전 방향이 상관 없다면 Z상만으로 회전수를 측정하는 것이 가능합니다.

    • Z상 2019.11.18 19:28 수정/삭제

      답글 감사합니다. 혹시 엔코더의 회전 방향이 상관없다는게 무슨 의미인지 다시 여쭤봐도 될까요?
      회전 방향에 따라서 값이 음수가 나올 수 있는건가요?

    • Justin T. 2019.11.18 19:30 신고 수정/삭제

      Z상은 엔코더의 회전 횟수 외에는 알 수 없습니다.
      A상과 B상은 엔코더가 시계방향으로 회전하는지 반시계방향으로 회전하는지 확인할 수 있습니다.

    • Z상 2019.11.18 19:35 수정/삭제

      아아~ 그럼 단순히 RPM측정을 원하는 거라면 Z상만 연결해도 된다는 뜻이네요??

    • Justin T. 2019.11.18 19:37 신고 수정/삭제

      네 그렇습니다.
      자세한 내용은 위의 글을 한 번 읽어주세요!

    • Z상 2019.11.18 19:42 수정/삭제

      친절한 설명 감사합니다 ㅎㅎ