임베디드 HW/SW

소프트웨어로 구현하는 직교위상 카운터(Quadrature Counter)

서론

엔코더에서는 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배수 카운팅을 하기 위한 방법은 다음과 같습니다.

  1. 채널A의 상승엣지에서 MCU는 인터럽트가 발생 합니다.
  2. 인터럽트 처리 루틴에서 채널B의 상태를 체크합니다.
  3. 채널B의 상태가 Low이면 채널A가 90도 앞선 것이므로 카운터를 증가 시킵니다.
  4. 채널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에서도 적용 가능합니다.

stonycho

Recent Posts

아침 식사 중에 일어났던 일

오늘(2024.04.01)도 늘 그렇듯이 아침으로 빵과 썰은 양배추에 마요네스와 토마토 케첩을 썪은 샐러드, 커피 그리고 막걸리…

8개월 ago

돈키호테를 읽고

돈키호테는 단순한 재미를 추구하는 허황된 모험의 얘기도 있지만, 그 이상의 심오한 사회비판과 풍자가 담겨 있다고…

8개월 ago

버지니아 울프의 등대로를 읽으면서.

의식의 흐름 기법으로 쓴 소설은 일반 독자들, 특히, 소설을 많이 읽지 않는 저 같은 사람…

8개월 ago

한장으로도 가능 합니다.

우리가 여행을 하다보면 고속도로 휴게소의 화장실을 들르게 됩니다. 볼일을 본 다음 수돗물에 손을 닦고 젖은…

8개월 ago

지하철 역명의 영문표기에 문제가 있습니다.

서론 우리나라 지하철은 세계적으로 매우 잘 되어 있다라고 알려 져 있습니다. 저는 외국에 많이 나가…

10개월 ago

추월차로 정속주행에 대한 생각

서론 고속도로에는 차로 별로 역할이 있습니다. 이것을 지정차로제라고 합니다. 예를들어 1차로는 추월차로, 2차로는 주행차로, 3차로는…

10개월 ago