|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2019-8-2 11:10:24
|
显示全部楼层
在初始化的过程中会调用如下的函数,这个就是校准吧?
void MpuGetOffset(void) //校准
{
int32_t buffer[6]={0};
int16_t i;
uint8_t k=30;
const int8_t MAX_GYRO_QUIET = 5;//限制前后两次陀螺仪输出的偏差范围
const int8_t MIN_GYRO_QUIET = -5;
/* wait for calm down */
int16_t LastGyro[3] = {0};
int16_t ErrorGyro[3];
/* set offset initial to zero */
memset(MpuOffset,0,12);
MpuOffset[2] = 8192; //set offset from the 8192 因为Z轴静止时也是有值的。
//在获取参考值时禁止系统调度时钟,即获取到陀螺仪加速度计的参考值之后再开始大循环
//在校准过程中关闭TIM3
TIM_ITConfig( //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
DISABLE //使能
);
while(k--)//30次前后两次输出的偏差都在范围内
{
do
{
delay_ms(10);
MpuGetData();
for(i=0;i<3;i++)
{
ErrorGyro = pMpu[i+3] - LastGyro;
LastGyro = pMpu[i+3];
}
}while ((ErrorGyro[0] > MAX_GYRO_QUIET )|| (ErrorGyro[0] < MIN_GYRO_QUIET)
||(ErrorGyro[1] > MAX_GYRO_QUIET )|| (ErrorGyro[1] < MIN_GYRO_QUIET)
||(ErrorGyro[2] > MAX_GYRO_QUIET )|| (ErrorGyro[2] < MIN_GYRO_QUIET)
);//不在限制范围内则一直循环
}
/* throw first 100 group data and make 256 group average as offset */
for(i=0;i<356;i++)//一共获取356次,舍弃前100次,用后256次的平均值作为参考值
{
MpuGetData();
if(100 <= i)
{
uint8_t k;
for(k=0;k<6;k++)
{
buffer[k] += pMpu[k];
}
}
}
for(i=0;i<6;i++)
{
MpuOffset = buffer>>8;
}
TIM_ITConfig( //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
ENABLE //使能
);
} |
|