12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /*
- * @Author: Sorzn
- * @Date: 2020-01-06 11:00:49
- * @LastEditTime : 2020-01-06 15:15:40
- * @Description: M5Stack project
- * @FilePath:
- * /home/sakabin/Arduino/libraries/M5Stack/examples/Modules/Bala/imuAuto.cpp
- */
- #include "imuCalibration.h"
- static float gyroXOffset = 0;
- static float gyroYOffset = 0;
- static float gyroZOffset = 0;
- static float accX = 0;
- static float accY = 0;
- static float accZ = 0;
- static float gyroX = 0;
- static float gyroY = 0;
- static float gyroZ = 0;
- static float angleAccX = 0;
- static float angleGyroX = 0;
- static float angleX = 0;
- static uint32_t preInterval = 0;
- void imu_CalcInit() {
- M5.IMU.Init();
- M5.IMU.setGyroFsr(M5.IMU.GFS_1000DPS);
- }
- void imu_setOffsetX(float x) { gyroXOffset = x; }
- float imu_getOffsetX() { return gyroXOffset; }
- void imu_calcGyroOffsets() {
- float x = 0, y = 0, z = 0;
- float x_total = 0, y_total = 0, z_total = 0;
- for (int i = 0; i < 3000; i++) {
- M5.IMU.getGyroData(&x, &y, &z);
- x_total += x;
- }
- gyroXOffset = x_total / 3000;
- }
- void imu_update() {
- float interval;
- if (preInterval == 0) preInterval = millis();
- M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
- M5.IMU.getAccelData(&accX, &accY, &accZ);
- angleAccX = atan2(accY, sqrt(accZ * accZ + accX * accX)) * 360 / 2.0 / PI;
- gyroX -= gyroXOffset;
- interval = (millis() - preInterval) * 0.001;
- preInterval = millis();
- angleX = (0.98 * (angleX + gyroX * interval)) + (0.02 * angleAccX);
- }
- float imu_getAngleX() {
- #ifdef M5STACK_MPU6886 || M5STACK_200Q:
- return 0 - angleX;
- #else:
- return angleX;
- #endif
- }
|