1、发生了电机堵转:问题居然是固定电机的前两个孔不能用于固定。。。。无语!!!
2、一直在弄MPU6050的DMP,原来野火有教程。
移植成功:STM32移植MPU6050/9250的DMP官方库(motion_driver_6.12)修改移植 DMP简单使用教程_随波逐流_Huffer的博客-CSDN博客_dmp库 直接复制该文的DMP文件夹、以及根据文章提示添加宏,改下log_stm32的头文件即可
3、ide提示flash错误:即为flash内存不够,代码太大了,其他人都能用,我就不行!!!为什么呢,该锅必扣在HAL库上。此问题可以尝试修改编译优化等级来解决,我第一次可以,但是后面再加代码后即使是最高优化也不行了,于是主控从C8T6换成了CBT6。
于是又引申出一个问题,stm32cubdeide不能直接更换芯片类型,还好我这个是同类型芯片仅仅是flash不同,故解决方案为: 到stm32cubemx更换芯片类型,把mx生成的ioc文件替换掉ide的ioc文件,而又引申出了一个问题,mx和ide生成的ioc版本不一样,而我的ide更新的版本总是低于mx的版本,解决方案为:Error when i try to update STM32
4、c8t6开启定时器时,HAL_TIM_Base_Start(&htim3);加上会错误,只能加HAL_TIM_Base_Start_IT(&htim3);
5、tb6612炸了
目前推测问题:tb6612平均输出电流是1A,而我的线宽是20mil只能输出0.5A,重新画板,待续
确实是这个问题,这个事件告诉我们,要看数据手册。
6:直接上MPU9250! // 以后再来,实验室有!
7:莫名进入STOP按键的EXTI中断: 该按键连接到了TIM3_CH4,而该TIM作为ENCODER模式,于是就会导致一直进入STOP的EXTI中。
8:某个函数的变量被我设置成了static,而该函数在某个中断中也会运行,故有这样的情况:A执行该函数,B中断产生也执行该函数,B完成返回A的时候,该函数的变量值不是中断发送前的值,被B进程给改变了,over!
9:从蓝牙调试助手收到的数据的处理:关于浮点数的问题
float a = 7.5;
printf("%x",(int)a); // 输出的是7
printf("%x",*(int *)&a); // 输出的是7.5在位中的表示 即:40f00000
这篇文章解释的好int转float的坑_qq_45740393的博客-CSDN博客_int转float
10:我在start按键处加了个delay来滤按键抖动,然后一旦按下start后,整个程序就卡住了,通过debug发现程序卡在了iic超时处理,问题分析:设置的start的优先级大于mpu6050的中断优先级,当程序在读取mpu6050时,按下start后进入start的中断处理,在加了delay后,该中断处理花费时间过长,处理完成返回后,程序认为mpu6050没有回应,进入超时处理,而mpu6050的中断又大于Systick的优先级,就一直卡住了。解决:修改优先级,start优先级滚到最后面就好了。但是!HAL库没办法通过delay进行按键滤波,HAL库在进入中断回调函数前就把中断标志位给清除了,这导致还是会重复进入按键的中断服务函数,达不到滤除抖动的效果。
11:
int value = 0;
char a = 0xff; //即a = -1(计算机组成原理
value |= a; // 也等于value += a;
printf("%x",value);
得到的输出内容是ffffffff,可是我只想要让value的低八位为a的值,为什么会这样呢:在表达式计算时,各种整形首先要提升为int类型,故 char 类型 0xff = -1 ,int 类型的-1表示为0xffffff,value的值自然就是0xffffffff了,要解决这个问题,可以改为value |= a&0xff,或者更直接,也是应该的做法,将a类型改为unsigned char。
12、我的PID计算在MPU6050数据中断中进行,周期在10ms,我试想能不能设置一个TIM为5ms,加快计算的周期,达到更好的性能,实验后答案:NO!或许,在EXTI中的速度已经是一个饱和速度了,加快的计算也只是速度环的运算,而位置环的运算没办法加快,而位置环又是平衡的重点,所以性能还是一样。
说说速度环和位置环:
在我的理解中,速度环和直立环是矛盾的存在,速度环负责将速度降为0,而直立环则在乎角度,会输出速度。速度环大,则受到干扰后的速度降为0快,即恢复速度快,直立环大,则受到干扰后的角度稳定在机械中值快,即倾斜角度变化小。
于是可以设想:当速度环的输出>>直立环的输出的情况下,原先小车平衡,速度为0,这时小车受到一个向前的力,角度开始偏转,直立环输出速度,这时!速度环反应很大,不允许你输出,于是小车不会移动,只会继续倒下,直到到达某个角度,该角度输入直立环的输出大于速度环的输出,小车才会移动。当速度环的输出<<直立环的输出的情况下,原先小车平衡,速度为0,这时小车受到一个向前的力,角度开始偏转,直立环输出的速度很大!咻一下,你的角度是到达机械中值了,但是你的速度依旧存在,而你的速度环输出又太小,抑制速度太慢了,这样的现象就是:小车直立的向前跑,停不下来。
需要说明,速度环的输出>>直立环的输出的意思是指,现场、外在地判断速度环和直立环的输出比较,是一个对小车的现象的描述、解释语言,而不是代码中直立环和速度环的输出值的比较(我尽力解释了!!!)
以上两个设想,我都做过实验了!确实如此,速度环的输出>>直立环的输出,小车受到干扰就一直摆摆摆动,幅度很大,这时可以试试加大直立环的kd,来加大直立环的输出,如果加大kd无用的话,就意味着速度环的输出大了,应该减小速度环的输出,即减小速度环的kp。当速度环的输出<<直立环的输出时,如果初始时就高频震荡,轮子小幅度剧烈换方向,意味着直立环的输出大了,应该减小直立环的kd,这时小车在初始下可以平衡,但是受到干扰后有两种可能:1、小车不停的高频震荡停不下来,这就还是意味着你的直立环的输出大了,应该减小直立环的kp。2、小车不震荡,但是速度停不下来,这就意味着你的速度环的输出太小了,恢复速度过慢,应该增大速度环的kp。在我的实验中,小车的倾斜角度,也就是抗干扰能力和恢复速度,也就是速度降为0的时间,二者之间的关系是矛盾的,抗干扰能力强些,恢复速度就慢些,恢复速度快些,抗干扰能力就弱些。如果要遥控小车,应该要重恢复速度,这样小车在平衡状态与遥控状态切换时,才不会抖的太剧烈。
重恢复速度的遥控视频:
重恢复速度的遥控
重抗干扰能力的遥控视频:
开源遥控平衡小车
代码和硬件扔在了B站的简介那里,自取。