平衡小车趟过的那些坑

最近在研究平衡小车,在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,改一下,可以稳定输出了。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值