GeekIMU/2.Firmware/ICM42688P_HAL/Core/Src/accelerometer.c

144 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "accelerometer.h"
typedef struct accCalibration_s
{
Axis3i32 accSum;
Axis3i16 accZero;
stdev_t var[3];
uint16_t cycleCount;
int ok;
uint16_t accZeroFlashSign;
} accCalibration_t;
//软件二阶低通滤波参数单位Hz
#define ACCEL_LPF_CUTOFF_FREQ 200.0f
//传感器对齐定义的机体坐标系的安装方向
#define ACCEL_ALIGN CW0_DEG
//mpu6000初始化加速度量程为FSR_8GACC_1G_ADC = 65536 / (2 * 16) = 4096
#define ACC_1G_ADC 4096.0f
Axis3i16 accADCRaw; //加速度原始AD数据
Axis3i16 accADC; //校准后的AD数据
Axis3f accf; //转换单位为G的数据
static accCalibration_t accCalibration; //加速度校准结构体参数
biquadFilter_t accFilterLPF[XYZ_AXIS_COUNT];//二阶低通滤波器
void accSetCalibrationCycles(uint16_t calibrationCyclesRequired)
{
accCalibration.cycleCount = calibrationCyclesRequired;
}
//执行校准
static void performAcclerationCalibration(Axis3i16 accADCSample)
{
for (int axis = 0; axis < 3; axis++)
{
//复位数据
if (accCalibration.cycleCount == CALIBRATING_ACC_CYCLES)
{
accCalibration.accSum.axis[axis] = 0;
devClear(&accCalibration.var[axis]);
}
//陀螺数据累加
accCalibration.accSum.axis[axis] += accADCSample.axis[axis];
//复位零偏
accCalibration.accZero.axis[axis] = 0;
if (accCalibration.cycleCount == 1)
{
//校准完成
accCalibration.accZero.axis[axis] = (accCalibration.accSum.axis[axis] + (CALIBRATING_ACC_CYCLES / 2)) / CALIBRATING_ACC_CYCLES;
if(axis==2)
accCalibration.accZero.axis[axis] -= (int)ACC_1G_ADC;
accCalibration.ok = 0;
//EEPROM_write(3);
}
}
accCalibration.cycleCount--;
}
bool ACC_Calibration(void)
{
if(accCalibration.ok == 0)
return 1;
return 0;
}
bool accInit(float accUpdateRate)
{
//初始化软件二阶低通滤波
for (int axis = 0; axis < 3; axis++)
{
biquadFilterInitLPF(&accFilterLPF[axis], ACCEL_LPF_CUTOFF_FREQ , accUpdateRate);
}
accSetCalibrationCycles(CALIBRATING_ACC_CYCLES);
accCalibration.ok = 0;
return true;
}
void accUpdate(Axis3f *acc)
{
//读取原始数据
accADCRaw.x= accX1();
accADCRaw.y= accY1();
accADCRaw.z= accZ1();
//传感器数据方向对齐
applySensorAlignment(accADCRaw.axis, accADCRaw.axis, CW90_DEG);
//加速度计校准
if (accCalibration.ok==1)
{
performAcclerationCalibration(accADCRaw);
return;
}
//计算accADC值减去零偏
accADC.x = accADCRaw.x - accCalibration.accZero.x;
accADC.y = accADCRaw.y - accCalibration.accZero.y;
accADC.z = accADCRaw.z - accCalibration.accZero.z;
////板对齐
//applyBoardAlignment(accADC.axis);
//转换为单位 g (9.8m/s^2)
accf.x = (float)accADC.x / ACC_1G_ADC;
accf.y = (float)accADC.y / ACC_1G_ADC;
accf.z = (float)accADC.z / ACC_1G_ADC;
// //软件低通滤波
// for (int axis = 0; axis < 3; axis++)
// {
// accf.axis[axis] = biquadFilterApply(&accFilterLPF[axis], accf.axis[axis]);
// }
*acc = accf;
}