用stm32f407zgt6做一个小车全向轮地盘(三个电机)通过编码器读取电机值通过pid算法联合陀螺仪让车走直线不偏离轨道,求大神

2019-07-20 02:19发布

用stm32f407zgt6做一个小车全向轮地盘(三个电机),通过编码器读取电机值通过pid算法联合陀螺仪让车走直线不偏离轨道,求大神帮忙

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
HexAI
2019-07-21 02:10
本帖最后由 HexAI 于 2018-8-17 19:44 编辑

位置式PID
PID_P.png
增量式PID
PID_Inc.png

MPU6050初始化
MPU6050.png
读取与积分(上点时持续收集10000个数据来统计零漂并在后期减去)
使用的为STM32的硬件 I2C + 中断,软件I2C或者轮询I2C太占CPU
MPU6050 Int.png
滤波和姿态融合都没贴上去,然后PID只截取了部分代码,不包括一些核心算法

速度公式如下,
Underpan.Speed_Wheel_1 =        -1.0f        *        Underpan.Speed_x
                                                -SQRT_3        *        Underpan.Speed_y
                                                +Ratio        *        Underpan.Speed_a;
Underpan.Speed_Wheel_2 =        +2.0f        *        Underpan.Speed_x
                                                +ZERO        *        Underpan.Speed_y
                                                +Ratio        *        Underpan.Speed_a;
Underpan.Speed_Wheel_3 =        -1.0f                *        Underpan.Speed_x
                                                +SQRT_3        *        Underpan.Speed_y
                                                +Ratio        *        Underpan.Speed_a;
如果前进的话,那么
Speed_x = 0;
Speed_y = 随便一个你想要的速度,当然你有定位器的话可以根据横坐标和PID进行纠正;
Speed_a = PID_Regular_Cacl(&PID_Underpan_Yaw);
利用PID来纠正角度误差

你没有正交全向轮定位系统,有的话可以如下来获得基于上电时刻的实时坐标
初始化:
EncoderConfig.png

坐标更新 每1ms
Encoder.png


同时屏幕上可以实时显示坐标,电机速度电流位置,PID参数并可实时调节
LCD.png

一周热门 更多>