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;
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赋值给其他类型时需要先指定数据类型。
|