3/3 这两天速度有点慢,别人不到半天搞出来的uart通信我花了两天,知道如何通过查看龙邱的库(我买的套件全是龙邱的)来修改逐飞的库,用以前写STM32的XCOM(串口发送)来接收uart发送的脉冲数据,学长教我用Sprintf函数可以实现把任何类型转换为字符型输出(我原来uint16的脉冲值输出到串口全是乱码),结果是可以输出,但是一旦值上千就全是乱码,匿名的上位机还不知道什么情况,估计和XCOM一样,暂时不打算再研究为何是乱码了,因为IAR的调试可以每1000ms查看脉冲值,不需要弄到上位机上看。目前乱码估计就是数据类型方面出现了溢出。
5/3 今天搞懂了cannot open file"8700_2100.h"文件的原因,在options里c/c++complier里要包含文件。今天浩哥PID直立调的差不多了,我却还没弄好MPU6050程序,差他3~5天进度,现在浩哥给我他正在调的程序,什么都有了,但不是我会的,按理来说这不是危机,而是好机会,你如何利用他的程序,来加快进度(跟快的懂,但一定要懂)。我要尽快看懂PID(原理不用太怎么看了,基本上代码),没你想的那么可怕,他并没有比你积累很多,只是几天而已又不是几月。我现在如果把它程序看懂,知道波形如何出来(有问题及时交流),明白PID调什么,怎么调。现在他的程序里卡尔曼滤波,角速度计算等不懂。估计看懂也得两三天,反正我是一定不要去写,而是在他的基础上调其他的,我想成为他的理论顾问,而我只用看他的代码。以后我写其他模块,永远明白我们是要搞团队合作,而不是只顾追求个人能力,既然现在能力不足,就虚心学习,何乐而不为呢?
6/3 今天看了卓晴的《PID调试》,把PID中三个参数的意义淋漓尽致地解释很完美了(遗憾的是没实践还不能全部吸收),下午迷茫了一阵,主要是在看浩哥PID调参程序时有些看不懂,然后看不懂九轴的寄存器英文手册而耗了一个多小时,接着又看了龙邱九轴视频,知道了SA0口是选从机(九轴)地址,默认接地。晚上看了一晚上卓晴的直立参考方案,对控制框架不是很理解,浩哥代码了也似懂非懂。
7/3 今天上课比较多,学了三小时,把直立要调的东西来来回回又看了,还看了平衡车资料,丰富了关于九轴数据采集使用的融和(加速度计测量的角度和陀螺仪测量的角速度积分后两传感器通过卡尔曼滤波实现采集)
8/3 今天把平衡控制的代码看得似懂非懂,卡尔曼看不懂,但知道是把九轴测量的角速度和角。为何说加速度计可以测量角度,实际上测量的是角加速度,然后通过反三角函数
Angle_Y
=atan2(
Accel_Y,Accel_Z
)*180/PI 求得角度,陀螺仪直接测得的角速度。国二程序里采集的都是通过AD转换来的,而九轴实际上采集到的数据已经是AD转换过了的,所有可以直接通过IIC获取,浩哥把int16的acc_Z/12调试出来是5(acc_z=16912),后面改了数据类型(int16)(float(acc_z)/12)就没问题了。
9/3 10/3 11/3 九轴采集的数据卡死(棘手),硬件:供电不稳定 电磁干扰 软件:全局变量太多,被重复赋值 融合算法有毛病
12/3 开始参考国一程序写代码,由于课多,写到采集九轴数据时比较慢,实在是理解不够。
13/3 下午看到了浩哥发的《陀螺仪和加速度计指南》,这是见过最有价值的文档之一,把原理通俗易懂的讲解,花了三小时了解,但卡尔曼滤波中要改变的Q_angle和Q_acc等参数不懂,看了文档还是没懂,一天都在到处说话浪费了点时间,没做什么
14/3 开始自己写直立函数,头绪很乱
15/3
问题很多,特别是自己创建文件的时候,遇到最大的问题就是找不到“add.h"文件,现在还是没搞懂原理,但是在Mr_Song里copy了inc和src并同时把自己创建的".c"和".h"文件分别放入但还是没用,最后在IAR/program里直接放.c文件就没问题了,希望去解决原理
16/3 今天终于把程序BUG都解决了,但是中断居然不输出数据了,最后发现把数据发送到上位机的占用时间太长,不应该放在pit中断里,但具体的中断原理还是不懂,就待解决
17/3 把采集MPU6050的函数放在PIT中断后发现又没有数据了,通过标志位发现中断有执行,可是无论把中断时间扩大多少都没数据,最终发现是接线问题而不是程序。
18/3
19/3
20/3 终于弄懂MPU6050方向,对于朝陀螺仪y轴正半轴看,顺时针旋转角速度<0,对于加速度计x轴若朝水平面以上则>0,但自己车模限制了它只能朝下,故<0.
21/3 和浩哥去问了学长终于发现用卓晴的互补滤波比卡尔曼好,互补滤波的角速度跟随性比卡尔曼好,所以车直立情况比较好也比较硬,而卡尔曼无论如何调节PD都要么抖动太大要么反应太慢太软
22/3 终于解决自己的程序为何左轮不转右轮转,由于右轮没改引脚口,同时占空比没有负的原因是作为判断的变量是uin32
23/3 研究了许久卓晴的方案,多少懂了原理,结合自己对脉冲采集的理解,不转换成转速而是直接用脉冲。现在完全使用卓晴的方案。
24/3 现在整个框架都写好了,把速度环和转向环都屏蔽后调直立环,发现车若开启的位置接近平衡位置则车能较好地稳定,但一旦给外力就不停摆动,也就是没有出现高频抖动,而是大摆动
25/3 中午问了一下学长为何车不断摆动,机械上:陀螺仪没有跟车轮的轴在一条线上,造成误差较大。软件上:微分太大(实际上加大后不摆了,只是朝一个方向前进。学长特别指明:电机力矩或力量不够大,应叠加死区
26/3 搞了一天MATLAB
27/3 还在调直立,若角度给错,没有速度环,依然会往前或往后(给21.6°则匀速往前,给16.4则匀速往后。给19°能在20cm内来回摆动)。左轮死区值70,右轮40时,两轮能相对直线。现在d从0.02(高频抖动)——>0.005(高频抖动)——>0(还是高频抖动)。(((mpu_acc_angle-g_fCarAngle)*0.5——>0.1,高频抖动消减了一点,但无法稳定在一点。
0.35*g_fGyroscopeAngleSpeed 0.35也高频抖动,但是很软。
28/3 ANGLE_CONTROL_D=0.05,抖动更小一点,但电池电量不足也会导致抖动小且软
29/3无论任何调节,最好有理论基础,乱调效率最低。我发现为何给的角度太大车就一直往前而不停?因为你PWM输出限幅50%了。理论说会有积分饱和,故需要控制。今天又明白了”加权“,其实在清华滤波算法框图中,1/Tg和所说的Z轴比例就是两个加权(0~1). 采用卓晴的转速表示时(转/s)不再猛跑了,但是存在:1.积分饱和,即随时间跑速不断增加。只要一开主控,就开始积分。但先开电机后开主控一开始车会向前倒下,然后自己站起来往前跑
30/3 今天弄OLED发现显示乱码,原因是不知道OLED所能显示字符的长度,比如ANGLE_CONTROL_P就太长,超出了OLED显示,所以数据跳动,故需要要缩短名字,但其缺点是不能改变程序的值,并且掉电后OLED值全部重置(白调)。