서론
엔코더에서는 A상과 B상이 90도의 위상차를 가진 구형파를 생성 합니다. 이 파형을 이용하여 모터의 회전수라든가 직선운동을 하는 경우는 위치가 얼마나 이동을 하였는지 등을 측정할 수가 있습니다. 이것을 우리는 Quadrature Counter(직교위상카운터)라고 합니다. 엔코더에서 어떻게 두개의 구형파를 생성하는지는 다음 기회에 다루기로 하고 여기서는 출력되어 나온 신호를 어떻게 디코딩하여 우리가 원하는 값을 얻을 것인지에 대해 고찰해 보고자 합니다.
분석
아래는 엔코더에서 나오는 출력파형에 대한 그림입니다.
A, B 어느 채널의 위상이 앞서느냐에 따라 방향을 결정할 수 있습니다. 카운터 동작의 경우 A채널이 앞서면 증가, B채널이 앞서면 감소를 시키거나 그 반대의 동작을 할 수 있습니다. 엔코더 신호를 받아서 카운팅 해 주는 전용 IC가 있습니다. LSI/CSI사의 LS7366R이 그것인데 이것을 이용하면 간단한 설정 만으로 카운터 기능을 할 수 있으며 마이크로콘트롤러와는 SPI통신을 통해 카운터 데이터를 전달 할 수가 있습니다. 아래 주소에서 이 IC에 대한 Datasheet을 구할 수 있습니다.
https://lsicsi.com/products/ls7366r-s-ls7366r-ts-ls7366r/
전용 IC를 쓰게 되면 마이크로콘트롤러에 부하를 주지 않으면서 카운터 기능을 수행 할 수 있는 장점이 있습니다. 그러나 간단한 제품의 경우는 BOM이 늘어나는 것에 대한 부담 때문에 마이크로콘트롤러에서 직접 카운팅 하는 것도 하나의 방법이 될 수 있습니다.
소프트웨어로 카운터 구현
소프트웨어로 Quadrature Encoder를 디코팅 할 경우 디코딩 배수를 선택 할 수 있으며 디코딩 배수에 따라 해상도가 달라 집니다. 배수를 1배수(x1), 2배수(x2) 그리고 4배수(x4)를 선택 할 수 있으며 원하는 배수에 따라 회로 구성과 소프트웨어 알고리즘이 조금씩 달라지게 됩니다. 본 글은 기본적인 1배수 디코딩에 대해 설명하겠습니다. 엔코더의 두 개의 출력 중 A채널 신호를 MCU의 한 개의 I/O포트에 연결하고 B채널 신호는 다른 I/O포트에 연결합니다. A채널 신호에 연결 된 I/O포트는 상승엣지에 Interrupt가 가능한 Input 포트로 설정하고 B채널에 연결된 I/O포트는 일반 Input 포트로 설정 합니다. 연결도는 아래와 같습니다.
아래는 상승엣지에서의 인터럽트를 이용해서 카운터를 증가시키고 감소시키는 것을 설명하는 그림입니다.
소프트웨어로 1배수 카운팅을 하기 위한 방법은 다음과 같습니다.
- 채널A의 상승엣지에서 MCU는 인터럽트가 발생 합니다.
- 인터럽트 처리 루틴에서 채널B의 상태를 체크합니다.
- 채널B의 상태가 Low이면 채널A가 90도 앞선 것이므로 카운터를 증가 시킵니다.
- 채널B의 상태가 High이면 채널A가 90도 뒤진 것이므로 카운터를 감소 시킵니다.
아래는 위과 같은 방법으로 소트프웨어 코딩을 한 예 입니다. MCU는 Texas Instrument사의 MSP430을 기준으로 작성 하였습니다.
#define CHA BIT0
#define CHB BIT1
initPort()
{
P1SEL = 0;
P1DIR = 0;
P1OUT = 0;
P1IES = 0; // Rising Edge(상승엣지)에서 인터럽트가 발생하도록 설정
P1IE = CHA // Channel A 인터럽트를 활성화 시킨다.
}
#pragma vector = PORT1_VECTOR
_interrupt void port1_ISR(void)
{
if(PiIFG & CHA) // A Channel에서 인터럽트가 발생 하였는지를 체크한다.
{
(P1IN & CHB) ? Count_Value– : Count_Value++; // Channel B가 High 이면 Count_Value를 감소 시키고 Low 이면 증가 시킨다.
P1IFG &= ~CHA; // 인터럽트를 Clear 시킨다.
}
}
결론
이상과 같이 소프트웨어로 구현하는 직교위상카운터를 알아 보았습니다. MCU는 MSP430을 기준으로 하였으나 다른 MCU에서도 적용 가능합니다.
I was recommended this web site by means of my cousin. I’m not
positive whether or not this put up is written by him as nobody else know such distinctive about my
trouble. You’re incredible! Thanks!