当前位置:   article > 正文

STM32F103C8-平衡小车笔记_mpu6050偏航角(yaw)零飘

mpu6050偏航角(yaw)零飘

STM32F103C8-平衡小车笔记

1.PID的作用

(1)比例项:提高响应速度,减小静差

(2)积分项:消除稳态误差

(3)微分项:减小震荡以及超调

2.串级PID

(1)直立环(角度环)作为内环,速度环作为外环

(2)直立环采用PD控制器,速度环采用PI控制器

3.串级PID参数整定

(1)先整定内环,后整定外环,内环是外环的微分。

(2)主调为外环,副调为内环,外环就是只是一个P在起作用,也就是比例在起作用;P也就是修正力度,越大越容易使被控制量震荡。

4.MPU6050 INT中断触发而不用循环,这样有何优势?

放在while循环的话,这个循环是可以被中断打断的。
小车平衡对实时性要求高,如果在while循环里,姿态矫正时,程序被其他模块中断,小车就立不起来了

5. 串口发送一帧数据时,两个字节的间隔时间是多少?

这里先搞懂什么是波特率:
波特率:发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud。

如果波特率为9600,发送一个位需要的时间为1/9600s=0.0001042s=0.1042ms,这里按数据位为8位,停止位为2位,
加起来就是10位,10个位发送所需的时间为:0.1042*10ms = 1.042ms,如果我要发送10个字节的数据,那发送这10个字节数据给接收方需要
的时间为:10*1.042ms = 10.42ms,这是算实际的发送10个字节的数据所需要的时间。我们在接收方接收数据时可以
把时间再加宽一些,让它有一点余量。让接收方能稳定的把数据从发送方接手过来,可以加个5ms,或更宽一点10ms,
加上发送10个字节所花的时间,就是15ms或20ms。

注:波特率为115200或是4800的为发送时间都可以这样算。

6.STM32外部中断触发问题

中断必须要清标志,另外不要在中断里面延时,不要在中断里面延时,中断里面只做一些赋值等简单操作,最好做个标志位,在外面处理。

7.速度处理记录
MotorSpeed = Encoder_GetPosIncr(MotorID)*230.769230;	
  • 1
8.欧拉角定义
  • pitch是围绕X轴旋转,也叫做俯仰角。
  • yaw是围绕Y轴旋转,也叫偏航角。
  • roll是围绕Z轴旋转,也叫翻滚角。
9.陀螺仪检测的缺陷

由于陀螺仪测量角度时使用积分,会存在积分误差,若积分时间 Dt 越小,误差就越小。

10.加速度传感器检测的缺陷

由于这种倾角检测方式是利用重力进行检测的,它无法检测到偏航角(Yaw) 。

另一个缺陷是加速度传感器并不会区分重力加速度与外力加速度,当物体运动的时候,
它也会在运动的方向检测出加速度,特别在震动的状态下,传感器的数据会有非常大的数
据变化,此时难以反应重力的实际值

11.磁场检测器的缺陷

与指南针的缺陷一样,使用磁场传感器会受到外部磁场干扰,如载体本身的电磁场干
扰,不同地理环境的磁铁矿干扰等等

12.姿态融合与四元数

可以发现,使用陀螺仪检测角度时,在静止状态下存在缺陷,且受时间影响,而加速
度传感器检测角度时,在运动状态下存在缺陷,且不受时间影响,刚好互补。假如我们同
时使用这两种传感器,并设计一个滤波算法,当物体处于静止状态时,增大加速度数据的
权重,当物体处于运动状时,增大陀螺仪数据的权重,从而获得更准确的姿态数据。同理,
检测偏航角,当载体在静止状态时,可增大磁场检测器数据的权重,当载体在运动状态时,
增大陀螺仪和 GPS 检测数据的权重。这些采用多种传感器数据来检测姿态的处理算法被称
为姿态融合

13.关于硬件IIC问题

STM32的硬件IIC是存在一定问题的,初始化MPU6050时可能导致初始化失败,所以推荐使用软件IIC。

14.MPU6050偏航角(yaw)零飘

MPU6050的偏航角是不正常的,即使静止不动也会跳动。这个纯粹是硬件问题,就算算法怎么牛逼也解决不了。只能外加磁力计解决,也可以直接使用MPU9250,这个是自带磁力计的。使用时注意不要和电机靠太近,磁场很容易受到干扰。

15.MPU6050万向节锁

默认Z-Y-X顺序下,不知道大家有没有发现这个问题。当MPU6050只转动俯仰角,俯仰角接近90度或者等于90度时,偏航角的角度会发生很大的偏差。那么这个就是万向节锁,此时如果比作一架飞机,当飞机垂直90度向上时,按照Z-Y-X顺序无论怎么改变方向飞机都只能向上飞。
所以不要让俯仰角垂直,这样可以减少bug。

16.采样率设置为200HZ,那么采样时间就是1/200=5ms

根据公式T = 1 / f
实际上采样频率是根据DMP频率,如果两个频率不同最终也以DMP的为主,当然前提是使用DMP。

小车的处理时序越短,理论上小车性能会更好。但是MPU6050的采样频率是有限制的,不能小于5ms。所以时序最短只能设置为5ms,一般会用定时器或者MPU6050中断引脚触发5ms中断然后处理数据输出PWM。

17.C语言 格式化输出–%m.n

%5d 要求宽度为5位,如果不足5位,前面空格补齐;如果足够5位,此语句无效。

%05d 要求宽度为5位,如果不足5位,前面0补齐;如果足够5位,此语句无效。

%-5d 要求宽度为5位,如果不足5位,后面空格补齐;如果足够5位,此语句无效。

%.2d 小数点后只保留2位小数。

18.void * data 数据类型参数解释

void* data 是一个无类型的指针参数,任意类型指针可以赋值给data,当data赋值给其他类型时需要先指定数据类型。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/401623
推荐阅读
相关标签
  

闽ICP备14008679号