2011년 12월 27일 화요일

LS7366 카운터 데이터

http://cafe.naver.com/circuitsmanual.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=23299&

LS7366 카운터 데이터
엔코더 신호 A/ B 를 처리하는 방법으로 LSI/CSI 의 카운터 IC인 LS7366R을 사용하면 고속 카운트가 가능하며 하드웨어가 간단하여 시스템의 안정성이 향상된다.

LS7366R의 사양, SPI 인터페이스, 내부 레지스터 그리고 간단한 프로그램 방법에 관하여 알아 보기로 한다.
32-비트 시리얼 인터페이스(SPI) 쿼더래쳐 카운터
* 동작전압: 3V 에서 5.5V (VDD-VSS)
* 5V 동작 시 최대 주파수 : 40MHz
* 3V 동작 시 최대 주파수 : 20MHz
* 32-비트 카운터(CNTR)
* 32-비트 데이터 레지스터(DTR) 와 비교기
* 32-비트 출력 레지스터(OTR)
* 2 개의 8 비트 모드 레지스터(MDR0, MDR1) 프로그램 가능한 기능모드
* 8 비트 명령 레지스터(IR)
* 8 비트 상태표시 레지스터(STR)
* 캐리, 보로우, 비교, 인덱스의 래치된 인터럽트 출력
* 비-쿼더래처 신호의 업/다운 카운트
* 카운트 영역지정(모듈로-N), 비-반복카운트(Non-recycle), 영역제한(Range-limit) 또는 프리-러닝 카운트 모드
* 8-비트, 16-비트, 24-비트, 32-비트 모드로 설정 가능한 동기(SPI)시리얼 인터페이스
* 3 가지의 패키지 타입: LS7366R (DIP), LS7366R-S (SOIC), LS7366R-TS (TSSOP)
* 표준 SPI (Serial Peripheral Interface): MOSI, MISO, SS/ 그리고 SCK
* 기타: 2, 3, 4 바이트 리드/라이트 시 최상위 바이트부터 바이트 내에서 최상위 비트(B7)부터 리드/라이트 한다.










LS7366R

LS7366R 은 인크리멘털 인코더로부터 출력되는 쿼더래쳐 신호를 직접 수신하는 32-비트 CMOS 카운터 이다. A, B 상의 4 체배, 신호에 포함된 노이즈 필터링 그리고 엔코더나 외부 센서로부터 출력되는 인덱스 신호를 수신하여 카운터 프리 셋, 카운터 클리어 그리고 데이터 캡쳐등의 여러 가지 기능을 사용할 수 있다. Index 신호가 없는 로터리 엔코더에서 1 회전 펄스 수를 설정하여 자동적으로 회전 각도 값을 표시할 수 있는 N-modulo 카운트 기능을 가지고 있다. Index 신호의 인터럽트 출력이 가능하여 고 정밀도의 엔코더를 이용한 3 차원 측정기와 고속 서보 모션 제어기에 사용된다. 마이크로 프로세서와의 인터페이스는 MOTOROLA에서 제정한 시리얼 통신 방식의 SPI를 사용한다.



LS7366R은 마이크로 컨트롤러와의 통신을 위하여 4-선식 SPI(Serial Pheriperal Interface) 버스를 제공한다. LS7366R 은 SPI 규정에서 포지티브 클록(CPOL = 0), 데이터 선. 쉬프트 후 (CPHA = 0)에 맞추어져 있다. LS7366R에서 데이터 전송은 1 바이트부터 최대 5 바이트(설정에 따름)로 이루어진다.
데이터 전송 사이클은 SS/ 신호가 High 에서 Low로 변하면 시작한다. LS7366R 로 보내지는 첫번째 바이트는 언제나 IR 레지스터를 라이트하는 명령어이다. 그리고 2 번째 바이트부터 5 번째 바이트 까지는 데이터로 처리된다. 통신은 SS/ 입력이 Low 에서 High로 되면 종료된다.


SPI 통신

SPI 는 MOTOROLA (Freescale) 사에서 규정한 전이중 통신 방식의 시리얼 인터페이스이다.
4 개의 핀 SCK, MISO, MOSI, /SS 으로 구성되며 고속의 데이터 전송 시 사용된다. SPI는 쉬프트 레지스터를 이용한 통신 방법으로 대부분의 마이크로 프로세서에서 기본 기능으로 채택되어있으며 마이크로프로세서와 연결되는 많은 주변 기기 IC 에서 통신 방법으로 사용된다.
SPI 의 핀 구성

SCK : Serial Clock 데이터를 동기화 시키는 기준 클럭
MISO : Master Input Slave Output 마스터는 데이터 입력, 슬래이브는 데이터 출력
MOSI : Master Output Slave Input 마스터는 데이터 출력 슬래이브는 데이터 입력
/SS : Slave Select 슬레이브 셀렉트 (마스터가 슬래이브를 선택하기위한 신호)


SPI 는 프로그램시 3 가지를 고려하여야 한다.
클록 극성:

클록의 시작이 LOW -> HIGH 종료가 HIGH->LOW
클록의 시작이 HIGH->LOW 종료가 LOW->HIGH
클록위상:

CPHA = 0: 클록의 시작시 데이터를 샘플링하고 클록의 종료시 데이터 쉬프트된다.
CPHA = 1: 클록의 시작시 데이터를 쉬프트하고 클록의 종료시 데이터를 샘플링한다.
데이터 전송 순서:

바이트를 구성하는 8 개의 비트가 MSB가 선 송신/수신인지 LSB 가 선 송신/수신인지 결정한다.
MOTOROA 프로세서는 MSB 로 고정되어 있으나 LSB 선 송신/수신을 선택 가능한 마이크로 프로세서도 있으므로 확인하여야 한다.


카운터는 1,2,3 또는 4 바이트 카운터로 동작할 수 있다. N-바이트 카운터로 구성되면 CNTR, DTR, 그리고 OTR은 모두 N 바이트 레지스터로 설정된다. 여기서 N 은 1,2,3 또는 4 이다. 명령/데이터의 형식은 자동적으로 N-바이트 환경으로 일치된다. 예를 들어 카운터가 2 바이트로 구성되면 DTR 쓰기 는 명령어 바이트 다음에 2 바이트가 따라 오는 것으로 처리된다. 만약 카운터가 3 바이트 카운터로 구성되면 같은 명령에서 3 바이트의 데이터가 따르는 것으로 예상한다.
적당한 수의 바이트가 전송된 후 다른 데이터의 전송이 시작된다면 SS/ 입력이 High 에서 Low 로 전환되어 새로운 명령 사이클이 개시되기 전까지 무시된다.
카운터는 두개의 모드 레지스터 MDR0 와 MDR1 레지스터를 라이팅하여 여러 개의 다른 동작 모드로 동작하도록 프로그램 가능하다.

LS7366R의 핀사양
LS7366R은 14Pin 으로 구성되어있다, 3 개의 패키지 버전(DIP, SOP, TSSOP)이 있으나 핀수와 핀번호에 정해진 기능은 모두 동일하다.


A(Pin 12)-입력, B(Pin 11)-입력

인크리멘탈 엔코더로부터 출력되는 A, B 쿼더래쳐 신호 입력이며 LS7366R의 입력으로 직접 연결한다. 이 입력은 90° 위상 차이가 있다. A상 신호와 B상 신호는 서로 상대적이다. A 신호의 변화가 B 신호의 변화보다 시간적으로 앞서면 카운터 값은 증가하며 반대로 늦으면 카운터 값은 감소한다. A와 B 신호는 내장된 디지털 필터를 거치게 되며 업/다운 방향과 카운트 클록 신호로 분해된다. 비-쿼더래쳐 모드에서 A 는 카운트 펄스 입력으로 B 는 방향 입력으로 동작한다. (B = High: 업 카운트 B=Low: 다운 카운트) 비-쿼더래쳐 모는 입력이 필터 처리되지 않는다.


INDEX/ (Pin 10)-입력

INDEX/ 는 인크리멘털 엔코더로 부터 출력된 인덱스 신호에 의하여 직접 구동 되도록 프로그램 가능하다. MDR0를 프로그램하여 터치 프리셋 (DTR로부터 CNTR에 로드), 터치 리셋 (CNTR을 0으로), 캡쳐(CNTR로부터 OTR 에 로드) 그리고 Index을 사용하지 않도록 할 수 있다.
쿼더래쳐 모드에서 INDEX/ 입력은 동기 또는 비동기 모드로 동작하도록 프로그램할 수 있다. 비동기 모드에선 A, B 의 상태에 관계없이 Index 가 Low 레벨이 되면 즉시 Index 동작(프리셋, 리셋 또는 캡쳐)이 실행된다. 동기모드 일 때 INDEX/ 입력은 입력 A 와 B 를 샘플링 하기 위한 클록에서 샘플링 된다. A 와 B 입력은 위상관계를 만족하여야 한다. A 와 B 가 동시에 High 이거나 동시에 Low 인 동안에 Index 는 Low 를 유지하고 있어야 한다. 비-쿼더래쳐 모드에서 INDEX/ 입력은 샘플링하지 않으며 어느 위상이든 직접 적용된다.


fCKi(Pin 2)-입력, fCKo(Pin 1)-출력

이 두 핀에 A, B 그리고 INDEX/ 입력을 필터링 하기위한 기본 클럭을 발생하기 위하여 크리스털을 연결한다. 크리스털 대신에 fCKi 에 외부 클록을 연결할 수 있다.
fCKi 에 입력되는 주파수는 2 분주(MDR0<B7> = 1) 또는 1 분주(MDR0<B7> = 0)하여 필터 주파수 ff가 되며 A, B 와 INDEX/ 입력의 정확한 필터링이 되기 위하여 A, B 상 주파수보다 4배 이상 커야 한다.


SS/ (Pin4)-입력

SS/ 가 High에서 Low로 변할 때 LS7366이 양방향 시리얼 통신이 되도록 한다. Low 에서 High 로 되면 시리얼 통신은 금지되며 MISO 핀은 하이-임피던스 상태가 된다. 이것은 여러 개의 슬래이브 유닛이 가능하게 한다.
CNT_EN (Pin13)-입력

CNT_EN 이 High 이면 카운트 가능 상태로 된다. 이 핀이 Low 이면 카운트 정지이다. 이 입력은 내부적으로 Pull-Up 저항이 부착되어 있어 이 핀을 사용하지 않을 때 개방 상태로 두어도 된다.


LFLAG/ (Pin8)-출력, DFLAG/ (Pin 9)-출력

LFLAG/ 와 DFLAG/ 는 Carry( 카운터 오버 플로우)가 발생, Borrow(카운터 언더 플로우) 비교 (CNTR = DTR) 그리고 INDEX 가 발생할 때 플래그가 출력되도록 설정이 가능한 출력 이다.
LFALG/는 오픈 드레인이며 래치 출력이다. 반면에 DFLAG/는 푸쉬-풀 출력 이다. LFLAG/는 여러 개의 슬래이브 구성에서 묶여질 수 있다(Wired-OR). 그러므로 하나의 프로세서가 여러 개의 LS7366R에서 발생한 인터럽트 처리 가능하다. 활성화된 LFLAG/스위치가 0 으로 되면 스태터스 레지스터 STR를 클리어 하여 하이 임피던스 상태로 복귀된다. 마이크로 프로세서에서 이 핀을 인터럽트 처리하려면 LOW 레벨 모드로 설정한다.
DFLAG/ 는 Carry, Borrow, Compare 그리고 INDEX 상태에 즉시 low 상태로 된다.( Carry, Borrow, Compare 그리고 INDEX 상태에서 벋어나면 즉시 High 상태로 복귀된다. 마이크로 프로세서에서 이 핀을 인터럽트 입력 처리 하려면 에지 트리거 모드로 설정한다.
LFALG/와 DFLAG/는 MDR1에서 설정 한다.


MOSI (Pin 7)-입력

마스터가 출력한 데이터를 수신한다. SS/ 가 Low 상태에서만 입력한 데이터가 유효하다.


MISO (Pin 6)-출력

LS7366R로부터 데이터가 출력되는 핀이다. MISO는 SS/ 가 High 가 되면 하이-임피던스 상태가 되어 여러 개의 슬래이브 유닛이 Wired-OR 출력이 가능하도록 한다.


SCK (Pin 5)-입력

SCK 입력은 MOSI, MISO의 데이터 전송 시 LOW->HIGH 이며 쉬프트는 HIGH->LOW 일때 실행하는 MOTOROLA SPI 사양의 Mode 0 조건으로 동작한다. LS7366R은 항상 슬래이브 모드로 동작하므로 SCK 신호는 호스트 마이크로 프로세서에서 공급하여야 한다.


LS7366R의 레지스터:

다음 열거되는 것이 LS7366R의 내부 레지스터 이다.
파워-온 리셋되면 레지스터 DTR, CNTR, STR, MDR0, MDR1 은 0 으로 리셋된다.


DTR. 소프트웨어 설정 가능한 DTR 은 8, 16, 24 또는 32 비트 입력 데이터 레지스터이며 MOSI 로부터 직접 라이트 될 수 있다. DTR 데이터는 32-비트 카운터(CNTR)로 부터 프로그램 제어 또는 Index 신호에 의한 하드웨어 적으로 CNTR로 전달될 수 있다. DTR 은 클리어 명령에의 하여 클리어 될 수 있다. DTR의 주 용도는 CNTR 레지스터를 프리셋 하는 것이다. (CNTR로 직접 라이트 할 수 없다.) 그리고 모듈로-N 모드 동작 시 DTR 은 모듈로 N 값, 영역-제한 모드 동작 시 제한 데이터를 저장하고 있다. 비교 동작에서 비교 플래그가 세트되면 DTR 은 CNTR 과 비교 된다. 4 바이트 모드로 설정된 경우 B31-B24, B23-B16, B15-B8 그리고 B7-B0 의 순서로 라이트 한다.


CNTR. 소프트웨어 설정 가능한 CNTR 은 8, 16, 24 또는 32-비트 업/다운 카운터이며 A 와 B 입력에 가해진 쿼더래쳐 신호를 1 체배, 2 체배 또는 4 체배(MDR0 B1, B1에서 선택)하여 얻어진 Up/Down 펄스를 카운트 한다. CNTR 은 클리어 하거나 DTR로부터 데이터를 가져올 수 있다(Pre-Set). CNTR은 마이크로 프로세서에서 데이터를 읽기(MISO 핀으로 출력)만 가능하며 쓰기는 할 수 없다. 4 바이트 모드로 설정된 경우 데이터를 읽을 때 B31-B24, B23-B16, B15-B8 그리고 B7-B0 의 순서로 출력된다.


OTR. 소프트웨어 설정 가능한 OTR은 8, 16, 24 또는 32-비트 레지스터 이며 MISO 를 통하여 출력된다. 주로 Index 펄스에 의하여 CNTR 값을 래치한 후 읽어내는 용도로 사용한다.


STR. 8-비트의 상태 레지스터이며 카운트와 관련된 정보를 저장하고 있다.

STR. 8-비트의 상태 레지스터이며 카운트와 관련된 정보를 저장하고 있다.


CY
BW
CMP
IDX
CEN
PLS
U/D
S
7
6
5
4
3
2
1
0


CY: 캐리(CNTR 오버플로우) 래치 (CNTR 이 0xFFFFFFFE에서 0xFFFFFFFF 로 되면 발생)
BW: 보로우(CNTR 언더플로우) 래치 (CNTR 0x00000001 에서 0x00000000 로 되면 발생)
CMP: 비교 (CNTR = DTR) 래치
IDX: 인덱스 래치(Index 핀이 High -> Low)
CEN: 카운트 인에이블 상태: 0: 카운트 정지, 1: 카운트 가능
PLS: 파워 손실 표시 래치: 파워 업시 세트
U/D: 카운트 방향 표시: 0: 카운트 다운, 1: 카운트 업
S: 부호비트 1: 음수 0: 양수






IR. 8-비트 레지스터인 IR은 MOSI 핀으로 입력되는 데이터열로 부터 명령어를 페치하여 선택한 레지스터를 조작한다. 명령은 CLR(Cear), RD(Read), WR(Write) 그리고 LOAD의 4 명령 이며 레지스터는 MDR0, MDR1, DTR, CNTR, OTR 그리고 STR의 6 개 레지스터이다.


B7
B6
B5
B4
B3
B2
B1
B0


B2 B1 B0 = XXX (사용하지 않음)
B5 B4 B3 = 000 : 선택 하지 않음
= 001 : MDR0 선택
= 010 : MDR1 선택
= 011 : DTR 선택
= 100 : CNTR 선택
= 101 : OTR 선택
= 110 : STR 선택
= 111 : 선택하지 않음
B7 B6 = 00 : 레지스터 CLR
= 01 : 레지스터 RD
= 10 : 레지스터 WR
= 11 : 레지스터 LOAD






CLR, RD, WR 그리고 LOAD 와 레지스터를 조합한 명령어


바이트 수


명령 코드


레지스터


IR(Binary)



IR(Hex)



동작


1



CLR



MDR0


MDR1


DTR


CNTR


OTR


STR













00001000


00010000




00100000




00110000













0x08


0x10




0x20




0x30













MDR0 를 0 으로 클리어


MDR1 를 0 으로 클리어




CNTR 을 0 으로 클리어




STR 을 0 으로 클리어













2 에서 5



RD



MDR0


MDR1


DTR


CNTR


OTR


STR













01001000


01010000




01100000


01101000


01110000













0x48


0x50




0x60


0x68


0x70













MDR0 을 TXD(MISO)에 의하여 시리얼 출력


MDR1 을 TXD(MISO)에 의하여 시리얼 출력




CNTR을 OTR 로 전달하고 MISO에 출력


OTR 을 TXD(MISO)로 시리얼 출력


STR 을 TXD(MISO)로 시리얼 출력













2 에서 5



WR



MDR0


MDR1


DTR


CNTR


OTR











10001000


10010000


10011000




10101000











0x88


0x90


0x98




0xA8











MOSI를 통하여 MDR0에 시리얼 데이터 라이트


RXD(MOSI를 통하여 MDR1에 시리얼 데이터 라이트


RXD(MOSI를 통하여 DTR에 시리얼 데이터 라이트














1



LOAD



STR


MDR0


MDR1


DTR


CNTR


OTR





















11100000


11101000





















0xE0


0xE8





















DTR 을 CNTR 로 파라렐 전송


CNTR 을 OTR 로 파라렐 전송
















MDR0. 모드 레지스터 MDR0 는 8 비트 리드/라이트 레지스터 이며 LS7366R 의 동작모드를 설정한다. MDR0에서 Index 신호가 없는 로터리 엔코더에서 1 회전 펄스 수를 입력하여 자동적으로 기준 각도(0 도)를 표시할 수 있는 N-modulo 카운트 기능이 설정 가능하다. MDR0는 파워-업 시 0으로 클리어 된다.


B7
B6
B5
B4
B3
B2
B1
B0


B1 B0 = 00: 비-쿼더래쳐 카운트 모드. (A = 클록, B = 방향).
= 01: x1 쿼더래쳐 카운트 모드( 쿼더래쳐 사이클당 1 카운트)
= 10: x2 쿼더래쳐 카운트 모드( 쿼더래쳐 사이클당 2 카운트)
= 11: x4 쿼더래쳐 카운트 모드( 쿼더래쳐 사이클당 4 카운트)
B3 B2 = 00: Free-running 카운트 모드
= 01: Single-Cycle 카운트 모드(카운터는 캐리나 보로우가 발생하면 동작을 멈춘다.
리셋이나 프리셋에 의하여 재 카운트 가능
= 10: Range-Limit 카운트 모드( 0 과 DTR 설정 값 내에서만 카운트 가능하다)
= 11: Modulo-n 카운트 모드이며 CNTR 은 DTR 값이되면 0 이된다.
B5 B4 = 00: 인덱스 기능 사용하지 않음
= 01: 인덱스 펄스가 입력되면 DTR 값을 CNTR 로 로드한다.
원점 신호에 의한 프리셋으로 사용한다.
= 10: 인덱스 펄스가 입력되면 CNTR 을 0 으로 초기화 한다.
원점 신호에 의한 절대 위치 설정
= 11: 인덱스 펄스가 입력되면 CNTR 값을 OTR 로 로드한다.
3 차원 측정기에서 프르부 터치에 의한 좌표 측정 시 사용한다.









MDR1: Mode Register 는 8-비트의 읽기/쓰기 가능 레지스터이다. 추가적인 모드 설정을 위하여 MDR0 에 부가된다. MDR1 레지스터는 전원 투입시 0 으로 클리어된다.


B7
B6
B5
B4
B3
B2
B1
B0




B1 B0 = 00: 4-바이트 카운트 모드
= 01: 3-바이트 카운트 모드
= 10: 2-바이트 카운터 모드
= 11: 1-바이트 카운트 모드
B2 = 0: Enable counting
= 1: Disabling counting
B3 = : 사용하지 않음
B4 = 0: NOP (아무 동작하지 않음)
= 1: IDX 입력시 FLAG 세트(STR 레지스터의 B4)
B5 = 0: NOP
= 1: DTR 과 CNTR 이 일치할 때 FLAG 세트(STR 레지스터의 B4)
B6 = 0: NOP
= 1: 보로우(BW) 발생시 FLAG 세트(STR 레지스터의 B4)
B7 = 0: NOP
= 1: 캐리(CY) 발생시 FLAG 세트(STR 레지스터의 B4)







LS7366R의 간단한 테스트 회로구성

브레드 보드에 로터리 엔코더, LS7366R, ATMEL 사의 8ㅂ트 프로세서 ATMega8 을 실장하여 테스트 보드를 만든 것이다. LED 8 개를 사용하여 카운트 값의 변화를 볼 수 있다. Index 신호는 택트 스위치를 사용하여 입력한다. 프로세서의 클럭은 내장 RC 오실레이터 8MHz 로 퓨즈비트에서 설정한다.
프로그램 다운로드는 ATMEL 의 AVRISP-MK2 를 이용하였다.























LS7366R 프로그래밍 예

1 회전에 256 펄스를 출력하는 엔코더의 A, B상 신호를 LS7366R에서 카운트하고 ATMEL 사의 ATMega8 프로세서에서 8 개의 LED에 1 바이트 카운트 값을 표시한다. 그림-5는 테스트용 회로도이며 그림-6 은 브레드 보드에 LS7366R 테스트 회로를 구성한 것이다. 소프트웨어 개발환경은 미국 ImageCraft 사의 ICC-AVR C 데모 버전 컴파일러를 사용하였다.


그림-7은 C로 작성한 LS7366R 테스트용 프로그램이다.
마이크로 프로세서가 전원 ON 되면 프로세서의 내부 그리고 PORT 입/출력 등의 초기화를 실행한다. 다음으로 LS7366R을 초기화 한다. 그리고 LS7366R의 카운터(CNTR)값을 읽어 PORTD 에 출력을 반복한다.
Line19 init_devices() 에서 PORT의 방향(입력/출력) 및 초기 값(High/Low)설정은 SPI에 맞도록 한다. /SS 핀은 출력/HIGH, CLK 핀은 출력/LOW, MOSI 핀은 출력, MISO 핀은 입력으로 되도록 설정한다. SPI 의 모드는 SPI Mode = 0인 CPOL = 0, CPHA = 0으로 설정한다. 데이터는 MSB(최상위 비트) 가 먼저 전송되도록 설정한다.
Line13 의 unsigned char shift_data_io(unsigned char c)는 1 개의 바이트를 SPI 를 통하여 내보내고 1 개의 바이트를 수신하여 반환하는 함수이다. ATMega8 의 데이터 시트의 예제 코드를 인용한 것이다.
Line19 void init_LS7366R(void)는 LS7366R을 초기화 시킨다. MDR0 를 4체배 모드로 MDR1에서 1 바이트 카운트 모드로 설정한다. 그리고 CNTR, STR 레지스터를 클리어한다.
Line64 의 while 무한 루프문에서 CNTR 을 읽어 ATMega8 의 PORTD 에 라이트한다.
Line66 은 CNTR 값을 읽기 위한 명령어를 0x60을 IR 로 보낸 것이다.
Line67 은 LS7366R의 MISO 핀에서 출력되는 데이터를 PORTD 에 라이트한다. 0x00 는 SPI 통신 특성상 어떠한 데이터라도 출력되어야 하므로 0x00 을 보낸 것 이므로 LS7366R에서 무시되므로 다른 어떤 값이라도 관계없다


PORTD 핀(7~0)이 0 상태에서 LED 가 ON 된다. 엔코더를 회전시키면 8 개의 LED 에 CNTR 카운터의 변화를 확인할 수 있다.











































월간 FA 저널 구독 신청
http://www.fajournal.com/
[출처]

댓글 없음:

댓글 쓰기