본문 바로가기
myGyro300SPI

myGyro300SPI에서 결과값 읽기

by irmus 2009. 12. 20.
이전 글(2009/12/17 - myGyro300SPI의 명령)에서 마지막 소스 코드 역시 잘못된 것이라고 말했었다. 그 이유는 ADIS16100의 출력 데이타 형식 때문이다. 다시 ADIS16100 데이타쉬트를 살펴보자.

12페이지 하단의 figure 22를 보면 출력 데이타 형식을 볼 수 있다.
사용자 삽입 이미지

DOUT의 15,14비트는 항상 0이다. 또한 ADD1, ADD0는 이전 글에서 설명했었던 command word에 있었던 ADD1, ADD0와 동일하게, 즉 ADC하기 위해 선택했던 채널 주소가 들어있다. 물론 이 주소는 이전 프레임에서 선택한 채널의 주소다(성질급한 조교)
예를 들어 이전 프레임에서 "gyro 값을 읽어"라고 0x8300 명령을 내렸다면 이번 프레임의 출력 값 15:12 비트에는 0000b 값이 들어있다. 마찬가지로 이전 프레임에서 "AIN1 값을 읽어" 라며 0x8b00 명령을 내렸다면 이번 프레임의 출력 값 중 15:12 비트에는 0010b가 들어있다.
이처럼 출력 값 16비트 중 상위 4비트는 ADC 결과 값이 아닌 다른 데이타가 들어있기 때문에 ADC 결과 값을 얻기 위해서는 이 상위 4비트를 적절히 처리해 줘야만 한다. 이 점을 생각하면서 이전 글의 마지막 소스코드를 다시 살펴보자.
10라인에서 AIN1 채널을 ADC하고 그 결과를 straight binary로달라고 명령을내렸고, 14라인에서 이 결과값을 읽게 된다. 13라인의 put과 14라인의 get은 동시에 이루어 진다고 설명했었다. 그러므로 13,14 라인의 데이타 프레임을 살펴보면 아래 그림처럼 될 것이다.
사용자 삽입 이미지
위 그림을 자세히 보면 이전 글에서 성질급한 조교를 언급하며 설명했었던 바와 같이 DIN에서의 ADD1, ADD0와 DOUT의 ADD1, ADD0가 서로 다름을 알 수 있다. 까먹지 말자고 한번 더 언급...
14라인에서 SSIDataGet() 함수를 수행하고 나면 ain1 변수에는 위 그림에서와 같이 15:12 비트에 0010b가 들어있고 실제로 ADC 한 결과값은 11:0 비트에만 있다. 이 변수 값을 이상태 그대로 사용하면 엉뚱한 값이 나올 수 밖에. 앞머리에 주소가 있으니 이 부분을 잘라 내야 한다. 간단하게 해당 bit들을 mask out 시켜버리자. 아래와 같이.
이제 15:12비트에 있던 값들이 모두 잘려나가고 순수하게 ADC 결과 값만 각 변수에 남아 있다. 여기서 또 한가지 살펴봐야 하는 것은 음수 표현에 따른 현상이다.
음수를 2진수로 표현하기 위해 2's complement(2의 보수) 표현법을 사용한다. ain1의 경우 "straight binary 형태로 출력하시오" 라고 명령을 내렸기 때문에 음수는 나오지 않는다. 결과값은 0~4097의 범위를 가지는 정수이다. 반면 gyro 값을 읽을때 사용한 커맨드는 0x8300, 즉 2의 보수로 출력하도록 지정했고, 출력값은 -2048~2047의 범위를 가지는 정수로 나온다. 이처럼 음수를 표현하기 위해 최상위 비트를 sign bit로 사용한다. 최상위 비트가 0이면 양수, 1이면 음수인 것이다. 문제는 gyro 변수(long type)의 최상위 비트는 31번 비트인 반면, myGyro300SPI에서 읽은 DOUT에서 나오는 최상위 비트는 11번 비트라는 점이다. gyro 값이 양수인 경우에는 상관없지만 음수인 경우 위의 코드로는 정상적으로 값을 읽지 못한다. 이런 경우에 sign extension을 해 줘야 한다. 간단하게 11번 비트의 값을 12~31비트에 복사해 주면 된다.
지금까지 단계별로 설명하기 위해 부족한 소스들만 계속 나왔었지만 이제 정상적으로 동작하는 소스코드를 하나 얻었다. 지금까지 글들은 정말 기본적인 내용들이다. 정상적인 수업 듣고 배운 사람이라면 이해하지 못할 내용은 없어 보이고, 더불어 데이타쉬트에 다 나오는 내용들이다. 여기까지가 myGyro300SPI 기본 사용에 대한 내용이며, 앞으로 나올 내용들은 응용편이라고 보면 될것 같다. 뭐 그렇다고 거창한건 아니고;;