안녕하세요? 고객님,
저희 NewTC 제품을 이용하여 주셔서 감사합니다.
메뉴얼에 보면 자세한 사항이 잘 나와 있습니다. 더 자세한 사항은 칩 데이타시트를 보시면 됩니다.
- 아래 -
http://www.newtc.co.kr/dpshop/bbs/board.php?bo_table=m48&wr_id=485&sca=&sfl=wr_subject&stx=3axis&sop=and
간단하게 설명하자면, 1.65V를 기준으로 1.5g 모드의 경우 800mV/g 단위로 전압 값이 변하면서 나타나게 됩니다.
1g라고 할 때, g는 gravity의 약자이구요. 중력 가속도를 의미합니다.
첨부한 그림은 모듈의 핵심 IC인 MMA7260Q 데이터 시트에서 발췌한 부분입니다.
그림을 잘 보면, 이해가 가능하실 겁니다.

우선, 가속도 = static 가속도 + Dynamic 가속도 로 구성된다는 것을 아셔야 합니다.
고객님이 각도 측정만 하려 한다면, Dynamic 가속도같은 것은 심하게 발생하지 않는 다는 것을 가정해야 합니다. 본 모듈에서 static 가속도만 따로 뽑아 내기는 어려우니까요. 즉, 매우 천천히 움직이면, 매우 작은 Dynamic 가속도만 발생될 것이고, 그렇다면 전체 값이 static 가속도에 가까운 값이 나오게 되어, 고객님이 원하는 것처럼, 각도 측정에 사용할 수 있을 겁니다.
-90도 ~ +90도 를 -1g ~ +1g로 대응시켜 보시는 것도 그림과 같이 무리가 아닙니다.
첨부한 3축 가속도 센서 계산법.ppt를 참고하면, 기울기로 변환시키는 방법도 나와 있으니, 참고 바랍니다.
즉, X, Y, Z 축 각각에서 전압값이 나오게 되구요. 0g 일 때, 1.65V 가 나오구요. 1.5g 모드에서 1g당 출력 전압값이 800mV 정도 변하게 됩니다.
gSelect 핀에 아무 연결을 하지 않아도, 기본적으로 1.5g 모드에 맞춰져 있도록 모듈이 제작되어 있습니다. 물론, 변경하면 변경된 모드로 동작합니다.
그리고, 평행하게 놓은 상태에서라면 Z축은 1g가 될 겁니다.
따라서, 1.65V + 800mV = 2.45V 정도 됩니다.
아무리 0g로 놓았다고 하더라도, 사실 정확한 평행을 잡기는 어렵습니다.
이런 경우 offset erro가 있을 수 있습니다. 칩이 레이저로 컷팅되고, 제작되므로, 제작 당시에는 매우 정확하지만, 운송 과정, 기계적인 스트레스, 온도 등으로 인하여 약간씩 에러가 발생할 수 있습니다. 아래의 메뉴얼에 읽어봐도 마찬가지 내용을 보실 수 있습니다.
- 아래 -
http://www.freescale.com/files/sensors/doc/app_note/AN3447.pdf?WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation
다만, 이럴 경우 이 에러를 보상해 주는 알고리즘이 필요합니다.
일단은 0g를 잡아주는 것이 필요한데요. 칩마다 조금씩 상태가 다를 수도 있고,
또한 제조 후에도 칩에 많은 스트레스가 가해지게 되면 상태가 달라질 수 있습니다.
따라서, 0g가 중요한 이슈라면 0g를 잡아주는 offset error correction 을 위한 function을 만들어 두는 것이 좋겠습니다.
아무리 정확하게 평면에 두고 한다고 하더라도 실은 칩이 약간은 기울어져 있을 수도 있기 때문에, 각 축마다 그 방향으로 한바퀴씩 천천히 돌려 보면 가장 크고 가장 작은값이 나올 것이고, 이를 통해서 중간점인 0g를 잡아낼 수 있을 겁니다.
다른 아이디어들도 있는 데, 메뉴얼을 읽어 보시기 바랍니다.
또한, 정확한 사용을 위하여 참고로 MMA7260Q 칩 데이터시트를 한 번 읽어 보시는 것이 좋겠습니다. mma7260q datasheet로 검색엔진에서 검색해 보시면 쉽게 찾을 수 있을겁니다.
아래는 가속도 센서로 거리측정하기에 관련된 답변이니 참고 바랍니다.
- 가속도 센서로 거리측정하기 -
실험을 하기 전에 우선, 센서의 여러가지 원인으로 인한 물리적인 오류를 잡아주기 위하여 첨부한 AN3447.pdf을 참고하여 센서 켈리브레이션을 진행해 주는 것이 좋겠습니다.
또한, 첨부한 AN3397에서 나온 내용을 참고하여 또한 거기서 나오는 켈리브레이션도 함께 진행하면 좋겠지요.
또한, 측정하는 시간간격이 짧을 수록, 즉, 주어진 시간안에 많은 데이터 샘플로 할 수록 양자화 에러도 줄 것이고, 그만큼 정확한 결과를 얻을 수 있겠습니다.
ATMEGA128의 데이터 시트를 봐도 그렇고 실제로 테스트 해 보아도, 보통 AVR은 15kHz가 ADC의 최대치라고 보시면 됩니다. 하지만, 가속도 센서 자체가 11kHz인가에서는 특성이 특별히 좋지 않아지므로, 10kHz 정도로 샘플링 하는 것이 좋겠습니다. AVR로는 거의 채널당 3kHz 정도가 이 가속도 센서로 좋은 데이터를 얻는 최대치라고 봐야 겠지요.
그 정도로 샘플링 한 후에, 크게 움직이면 생기게 되는 갑자기 생기는 물리적인 오류로 인한 이상한 샘플들을 제거하기 위하여 10개 샘플링 할 때마다 상위 2개 하위 2개 정도는 재하고, 중간값들을 소팅으로 정렬한 다음, 나머지 6개 정도의 값을 평균을 내서 하나의 값으로 사용합니다. 이러한 절차가 일종의 소프트웨어 필터 역할을 할 수 있으며, 많은 에러를 걸러주게 됩니다.
그렇게 되면 초당 채널마다 300개 정도의 샘플이 생기게 됩니다. 이 때의 시간 간격을 시간으로 환산하여, 적분할 때 시간축 델타T로 보면 되겠습니다.
초기에 위에서 얘기한 대로, 첨부한 AN3447을 이용 물리적인 에러들을 잡아내어 보정하고, 완전 평형한 상태에서(an3447을 참고) 완전 정지한 상태에서의 가속도 값을 알아내서, 중력 가속도 값으로 지정한 후, 첨부한 an3397에서 나온 것처럼 켈리브레이션 한 후에, 이중 적분으로 거리 계산을 해 내되, 불안정한 움직임을 보이는 경우 노이즈로 인식하여 zero로 만들어 줄 수도 있어야 겠습니다.
실제로 센서칩 자체도 +-1/2LSB의 에러가 있으며, AVR 자체도 +-1/2LSB의 에러가 발생하며, 또한, 전송 과정에서도 +-1LSB 정도의 에러는 발생할 수 있습니다. 최소한의 아날로그 신호의 전송선로를 사용하고, 또한 신호의 노이즈를 막아주는 PCB 설계 등으로 최대한 노이즈를 제거하는 것도 중요하겠습니다.
이를 통하여 거리를 계산하면 보다 정확해 지리라고 생각합니다.
참고로 말한다면, 중력 가속도가 X,Y,Z 축 각각에 따라 기울어짐에 따라서 또한 정적 가속도 값이 각 축마다 달라지게 되는 데, 이를 자이로 센서로 미리 측정하여 두었다가, 그 위치에서 빼는 중력 가속도 값을 불러와서 빼가면서 현재의 동적 가속도만을 알아내는 테크닉도 필요하겠습니다.
이 때는 분명히 자이로 센서의 값을 받아서 동적 가속도 값을 정확히 알아내기 위하여 현재의 기울어짐을 각속도로 정확히 측정하는 것도 필요하겠습니다. 이렇게 보정하면 보다 정확한 결과를 얻을 수 있을 것으로 생각됩니다.
보다 정확한 결과를 위하여, ADC를 외부에 별도로 달아서, 보다 정밀하게 ADC 하는 것도 도움이 될 것 같습니다.
이 내용이 도움이 되었으면 좋겠습니다.
수고하세요.
감사합니다.