2016-01-26 21 views
1

我正在为我的四轴编程飞行控制器。到目前为止,它在速率模式下效果很好,所以我决定添加角度模式。这需要我的加速度计和陀螺仪数据的融合,以获得四维空间的真实位置。所以我能够从陀螺仪的度/秒集成到一个角度,并获得从所述加速度的角度,如下所示:STM32F103互补过滤器溢出

微控制器:STM32F103

PS:所有变量都是结构{双X,Y中,Z; },dt是一个uint64_t

//getting angle from gyro rate 
gyroAngle.x += gyroRate.x * dt/1000; 
gyroAngle.y += gyroRate.y * dt/1000; 
gyroAngle.z += gyroRate.z * dt/1000; 

//getting angle from accel 
accelAngle.x = atan2(accel.y, sqrt(pow(accel.x,2) + pow(accel.z,2))) * (180/M_PI); 
accelAngle.y = -atan2(accel.x, sqrt(pow(accel.y,2) + pow(accel.z,2))) * (180/M_PI); 

//combines the two into true rotational position 
angle.x = .85 * (angle.x + gyroAngle.x * (dt/1000)) + (.15 * accelAngle.x); 
angle.y = .85 * (angle.y + gyroAngle.y * (dt/1000)) + (.15 * accelAngle.y); 

问题:我有一个250hz的循环。不幸的是,在一两分钟后gyroAngle开始返回乱码(我认为它溢出了),因此角度也会返回gabage,因为它使用了gyroAngle。 accelAngle没有给我任何麻烦。

这是串行监控一些输出:

angle: -1  3  /* 
angle: -1  3  */normal until here 
----------------------------------------------------------- 
angle: -98  406  /* 
angle: -338  582  * 
angle: -710  646  * 
angle: -1113  716  * starts giving me garbage 
angle: -1616  849  * 
angle: -2327  1016  * 
angle: -3047  1377  */ 

我完全不解,为什么出现这种情况。任何帮助是极大的赞赏。

回答

1

您很可能正在进入集成溢出。这很正常,并且在许多类似的情况下会造成“漂移”。

会发生什么情况是您的测量是有限的,而不是无限精确的(传感器分辨率的限制)。随着时间的推移,您读取的10或12位以下的小数位会加起来。

很快这会导致您有一个寄存器溢出,或者由您已采取的错误*数量的样本得出一个值。你的四振动会加剧这个问题。

解决方法是简单地将积分重置为零,或者当它超过某个限制(值或迭代)时。

试图保持长时间有限精度数值积分的绝对结果必然会失败。

/1000你在几个地方也通过截断导致精度的丢失 - 你总是四舍五入。我不会试图通过舍入来解决这个问题,但它可能会导致很多错误。

浮点可能是一个选项?也许甚至是一个F4组件来取代F103 - 你可以得到一个引脚兼容的组件。如果您没有使用SMD的经验,请将芯片拿到当地的手机维修店

您可能需要添加磁力计,以便重置为更好的估算值。