[STM32F1] 自平衡小车

[复制链接]
1679|18
 楼主| doit888 发表于 2018-3-8 13:19 | 显示全部楼层 |阅读模式
开源 MPU6050 STM32 方案 自平衡小车!
 楼主| doit888 发表于 2018-3-8 13:20 | 显示全部楼层
机加工图1
3mm铝合金底板.JPG
 楼主| doit888 发表于 2018-3-8 13:21 | 显示全部楼层
机加工图2
轮子连接器.JPG
 楼主| doit888 发表于 2018-3-8 13:21 | 显示全部楼层
机加工图3
前挡板.JPG
 楼主| doit888 发表于 2018-3-8 13:23 | 显示全部楼层
机械加工的截图
机械加工的截图.png
 楼主| doit888 发表于 2018-3-8 13:23 | 显示全部楼层
机加工压缩资料

机械设计图纸打包.zip

1.58 MB, 下载次数: 11

 楼主| doit888 发表于 2018-3-8 13:25 | 显示全部楼层
原理图

原理图.PDF

240.93 KB, 下载次数: 18

 楼主| doit888 发表于 2018-3-8 13:27 | 显示全部楼层
PCB资料

PCB.PDF

485.26 KB, 下载次数: 10

 楼主| doit888 发表于 2018-3-8 13:27 | 显示全部楼层
原理图 压缩文件

原理图.zip

74.57 KB, 下载次数: 10

 楼主| doit888 发表于 2018-3-8 13:28 | 显示全部楼层
PCB压缩文件

PCB1.~(1).zip

99.83 KB, 下载次数: 9

 楼主| doit888 发表于 2018-3-8 13:31 | 显示全部楼层
以下是程序部分 贴出来 希望大家 一起探讨!
 楼主| doit888 发表于 2018-3-8 13:31 | 显示全部楼层
1:配置采集方向信号——操作硬件ADC
2:配置定时器配置——tim1,tim8
3:差速算法,速度合成
4:PWM输出

单片机型号:STM32F103RCT6 32KB 256KB

需要用到的资源
PB13 34 TIM1_CH1N           PB14 35 TIM1_CH2N
PA8  41 TIM1_CH1           PA9  42 TIM1_CH2

PA7 23 TIM8_CH1N           PB0 26 TIM8_CH1N
PC6 37 TIM8_CH1                   PC7 38 TIM8_CH2
 楼主| doit888 发表于 2018-3-8 13:32 | 显示全部楼层
主程序 很简单 如下:

#include "stm32f10x.h"
#include "SysTick.h"
#include "assignment1.h"
#include "assignment2.h"
#include "assignment3.h"

extern float Angle;//角度

int main(void)
{

    SysTick_Init();//①系统滴答时钟初始化

    I2C_MPU6050_Init();//②重力传感器接口初始化

    InitMPU6050();//③初始化MPU6050

//        LED_Config();//④显示LED初始化

    TIM1_Init();//⑤定时器tim1,tim8初始化

    ADC1_Init();//⑥ADC初始化

    USART2_Config();//⑦初始化串口2

    Direction_Init();//⑧初始化转向

    while(1)
    {
    }
}
 楼主| doit888 发表于 2018-3-8 13:34 | 显示全部楼层
比较关键 的 systick 函数:

如下:

/******************** (C) COPYRIGHT 2012 WildFire Team ***************************
* 文件名  :SysTick.c
* 描述    :SysTick 系统滴答时钟10us中断函数库,中断时间可自由配置,
*           常用的有 1us 10us 1ms 中断。

* 库版本  :ST3.5.0
*/

#include "SysTick.h"
#include "assignment1.h"
#include "assignment2.h"
#include "assignment3.h"

extern float Angle;//角度
extern float Gyro_y;//陀螺仪

extern float Accel_x;//X轴加速度值暂存
extern float Accel_y;//Y轴加速度值暂存
extern float Accel_z;//加速度计值暂存

extern float Angle_az;//加速度计算输出角度
extern float Angle_gy;//陀螺仪计算的倾角

extern float PWM;//浮点型PEM值

extern int PWM_R;//右轮PWM值计算
extern int PWM_L; //左轮PWM值计算

extern int ADC_Direction;
extern int Direction_Difference;

extern float x;
extern float y;
extern float z;

extern int int_PWM;//整形PWM值

extern float integral;//速度积分百分比

/*启动系统滴答定时器 SysTick */
void SysTick_Init(void)
{
    /* SystemFrequency / 1000    1ms中断一次
     * SystemFrequency / 100000         10us中断一次
     * SystemFrequency / 1000000 1us中断一次
     */
    SysTick_Config(SystemCoreClock /200);//200hz系统频率

}

/*定时器中断服务函数,构建系统运行周期*/
float a;
float Kp;

void SysTick_Handler()
{

    a++;
    Kp=a/40;
    if(Kp>12)
    {
        Kp=12;
    }//调试kp的参数,这个算法用于缓慢加载pid参数


    Angle_Calcu();//角度计算
    PWM_Calcu();//pwm计算输出
    Direction_Dispose();//差速算法,pwm输出
//        printf("%f\n",Kp);

}




 楼主| doit888 发表于 2018-3-8 13:35 | 显示全部楼层
void SysTick_Handler()
{

    a++;
    Kp=a/40;
    if(Kp>12)
    {
        Kp=12;
    }//调试kp的参数,这个算法用于缓慢加载pid参数


    Angle_Calcu();//角度计算
    PWM_Calcu();//pwm计算输出
    Direction_Dispose();//差速算法,pwm输出
//        printf("%f\n",Kp);

}

其中 这里的 系统中断的 算法

涉及到了 PID自动控制方面的 运算
 楼主| doit888 发表于 2018-3-8 13:41 | 显示全部楼层
a++;
    Kp=a/40;
    if(Kp>12)
    {
        Kp=12;
    }//调试kp的参数,这个算法用于缓慢加载pid参数

这个比较关键 不是 一下子就把 Kp值 赋值给一个 很突变的数据
mmuuss586 发表于 2018-3-8 14:55 | 显示全部楼层
没有源代码啊
iamaiqiyi 发表于 2018-3-8 17:14 | 显示全部楼层
来个完整的工程文件代码。
珍藏版 发表于 2018-4-2 16:58 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

173

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部