Embedded/Arduino

Arduino MPU9250(MPU6050) FIFO overflow error 해결하기

변화의 물결1 2024. 3. 24. 01:22

 

 

안녕하세요.

 

  이번에 MPU9250를 사용하다가 overflow error 가 발생해서 찾아보다가 해결방법을 찾게 되어 공유드립니다.

  사실 지난번에 댓글로 문의하신 분이 계셨는데 그때는 저도 경험하지 못하고 있어서 I2C 통신 문제라고만 말씀드렸습니다. 이 글로나마 도움 되셨으면 합니다.

 

  구글링 해보면 여러 가지 답변들이 나오는데 시원한 답글이 없었습니다. 그렇지만 해결하신 분들이 있어 참고해서 작동 확인하였습니다.  결론을 먼저 말씀드리면 MPU9250 DMP 출력 주기를 조정해 주는 것입니다.

 


 

1. 에러 발생 부분

 

  - MPU9250 DMP 사용하는 샘플 코드를 사용했다면 아래와 유사한 코드가 들어 있는 것을 확인할 수 있습니다. 그리고 여기서 버퍼 처리가 다 되지 못해서 "FIFO overflow"가 발생시킵니다.

 

 

MPU9250 샘플소스 중 FIFO 에러 발생 부분

 

 

 

2. MPU9250 FIFO overflow error 해결 방법

 

   - 방법은 버퍼 크기를 키워 될 수도 있으나 결국 속도 내에 처리하지 못하면 다시 데이터가 쌓여서 오버플로가 발생하므로 처리 주기를 조금 느리게 해주어야 합니다.

 

  - 구현한 소스 혹은 참조한 소스 파일을 보면 MPU9250_9-axis_MotionApps41.h 와 비슷한 이름을 가진 파일이 포함되어 있을 겁니다. 파일을 불러서 "D_0_22"로 검색을 합니다.

 

  -  D_0_22 inv_set_fifo_rate 주석을 찾게 되고 마지막 부분(노란색)에 초기 설정된 값을 변경해 주면 됩니다.

 

 

MPU9250_9-axis_MotionApps41.h 의 D_0_22 위치

 

 

 

- 답은 소스 아래 주석에 있었습니다.

 

// This very last 0x01 WAS a 0x09, which drops the FIFO rate down to 20 Hz. 0x07 is 25 Hz,

// 0x01 is 100Hz. Going faster than 100Hz (0x00=200Hz) tends to result in very noisy data.

// DMP output frequency is calculated easily using this equation: (200Hz / (1 + value))

 

  - 설명처럼 DMP 출력 주기를 조절해주면 overflow 발생하는 것을 막을 수 있습니다.

초기 값이 0x03으로 되어 있는데 위의 계산식으로 해보면 (200Hz / (1+3)) = 50Hz 이 됩니다.

  즉, 초당 50번 계산해서 출력하게 되는 것입니다. 그런데 버퍼에 값을 처리하는 속도보다 빠르게 저장되다 보니 문제가 발생하는 듯했습니다. 그래서 적절한 속도를 조절해 주면 Overflow 문제없이 MPU9250를 사용할 수 있습니다.

 

  - 예로, 0xC7로 하면 십진수로 199가 되고 (200Hz / (1+199))로 1Hz가 되어 초당 1번으로 값을 전달받게 됩니다.     

 

  - 다르게 자신이 필요한 초당 횟수가 있다면 x = (200 / (횟수)) -1로 구할 수 있습니다.

  예를 들어, 초당 4회 출력이 필요하다면 (200/4) -1 = 49 = 0x31를 입력하시면 됩니다.

 

 - 이것으로 모든 FIFO overflow 가 해결되는 것은 아니므로 참고 정도 하시면 좋을 것 같습니다.

 

감사합니다.

 

 

<참조 사이트>

1. IMU9250 every 2 seconds (Read 1 time)

https://forum.arduino.cc/index.php?topic=478750.0

2. How to clear FIFO buffer on MPU6050?

https://arduino.stackexchange.com/questions/10308/how-to-clear-fifo-buffer-on-mpu6050  

반응형