imuCalibration.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * @Author: Sorzn
  3. * @Date: 2020-01-06 11:00:49
  4. * @LastEditTime : 2020-01-06 15:15:40
  5. * @Description: M5Stack project
  6. * @FilePath:
  7. * /home/sakabin/Arduino/libraries/M5Stack/examples/Modules/Bala/imuAuto.cpp
  8. */
  9. #include "imuCalibration.h"
  10. static float gyroXOffset = 0;
  11. static float gyroYOffset = 0;
  12. static float gyroZOffset = 0;
  13. static float accX = 0;
  14. static float accY = 0;
  15. static float accZ = 0;
  16. static float gyroX = 0;
  17. static float gyroY = 0;
  18. static float gyroZ = 0;
  19. static float angleAccX = 0;
  20. static float angleGyroX = 0;
  21. static float angleX = 0;
  22. static uint32_t preInterval = 0;
  23. void imu_CalcInit() {
  24. M5.IMU.Init();
  25. M5.IMU.setGyroFsr(M5.IMU.GFS_1000DPS);
  26. }
  27. void imu_setOffsetX(float x) { gyroXOffset = x; }
  28. float imu_getOffsetX() { return gyroXOffset; }
  29. void imu_calcGyroOffsets() {
  30. float x = 0, y = 0, z = 0;
  31. float x_total = 0, y_total = 0, z_total = 0;
  32. for (int i = 0; i < 3000; i++) {
  33. M5.IMU.getGyroData(&x, &y, &z);
  34. x_total += x;
  35. }
  36. gyroXOffset = x_total / 3000;
  37. }
  38. void imu_update() {
  39. float interval;
  40. if (preInterval == 0) preInterval = millis();
  41. M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
  42. M5.IMU.getAccelData(&accX, &accY, &accZ);
  43. angleAccX = atan2(accY, sqrt(accZ * accZ + accX * accX)) * 360 / 2.0 / PI;
  44. gyroX -= gyroXOffset;
  45. interval = (millis() - preInterval) * 0.001;
  46. preInterval = millis();
  47. angleX = (0.98 * (angleX + gyroX * interval)) + (0.02 * angleAccX);
  48. }
  49. float imu_getAngleX() {
  50. #ifdef M5STACK_MPU6886 || M5STACK_200Q:
  51. return 0 - angleX;
  52. #else:
  53. return angleX;
  54. #endif
  55. }