最近在研究平衡小车,在TB上买了一个小车套件,源代码是用的stm32的3.5库,自己打算移植到hal库上面去,顺便深入了解一下平衡小车控制原理。下面就说说移植过程中趟过的坑,
1.匿名科创地面站本是一款调试四轴的利器,但是拿来调试平衡车也相当棒,问题出在小车集成了一键下载功能(usb转口,利用DTR和RTS做复位和boot引脚拉低),匿名地面站应该是触发了boot,导致程序下载调试和运行都有问题,
解决办法:很简单,下载,调试,复位期间断开匿名地面站的串口就好了
2,在移植过程中,hal库是默认打开滴答的,而小车原来的代码,用滴答做的延时,所以需要改成自己的延时函数。
3.mpu一直在dmp_load_motion_driver_firmware()初始化失败,一开始怀疑定时器,后来看有人说是电压不稳,结果我的最终问题是,小车使用的dmp的INT中断作为自己时基单元,hal库没错又是HAL库,在初始化的时候默认打开了对应的引脚中断,这就导致初始过程不断被打断。
解决办法:很简单,先关闭引脚中断,MPU初始完成后,在打开.
4,这是个小坑,这次还是HAL库,stm32MxCube生成Keil工程后,默认优化级别是level-3,导致调试莫名其妙,
解决办法:也很简单,改为level-0就好了。
2018-04-02目前先把MPU6050和hal库环境移植成功,下一步开始测试电机控制相关。
-------------------------------------------------------------------------------------------------------------------------
5.继续趟坑,dmp_load_motion_driver_firmware()终于初始化成功了,可是发现四元数转出的欧拉角有问题,
代码如下:
void Read_DMP(void){
unsigned long sensor_timestamp;
unsigned char more;
long quat[4];
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more);
if (sensors & INV_WXYZ_QUAT )
{
q0=quat[0] / q30;
q1=quat[1] / q30;
q2=quat[2] / q30;
q3=quat[3] / q30;
Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
Roll= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
}
}
问题1,没有包含,math.h文件,问题2,hal库初始化中断引脚默认是rising,我们需要的是falling,改一下,可以稳定输出了。