一个平衡自行车,我实验室一个19级的本科生做的

大家好,我是张桥龙。今天给大家带来一辆平衡车,是我实验室一名19级本科生制作的。他还获得了今年全国电竞赛事(F题)二等奖。

男人,一个非常英俊的年轻人。B站ID:_旺仔小菠萝,欢迎大家观看!

好吧,事不宜迟,让我们直接开始吧!先观看演示视频,相关方案如下。

文末所有文件(已经我授权)、程序、电路、3D打印文件都是开源的。

01

硬件篇

1.1STM32F103C8T6最小系统(小蓝板)

1.2 MPU6050姿态传感器(3.3V供电)

1.3 0.96寸OLED显示屏(四针,IIC通讯汽车电路图识读入门到精通 pdf,3.3V供电)

1.4 HC-05蓝牙模块(串口通讯,用于接收小车运动指令)

使用教程链接:

1.5 超声波测距模块

1.6 N20电机及驱动器(电机型号:DC 12V A12型)

1.7 无刷电机动量轮模块

电机自带驱动器和光电编码器。

这款平衡车采用万宝至无刷伺服电机,内置驱动,支持正反转,PWM调速,带100线编码器AB相双通道信号输出。

电机接线图如上图所示。实车中的线材颜色可能与上图不符。你应该根据位置而不是电线的颜色来判断它。

1.信号A相、B相为编码器脉冲输出端子;

2.对于正反向切换的线路汽车电路图识读入门到精通 pdf,我们直接用单片机的引脚3.3V电平来控制,完全没有问题;

3.编码器电源接3.3V;

4.PWM接单片机的PWM输出,我们接单片机IO口开始运行,电机初始化时置高电平;

5.电源负极接GND,电源正极接12V。

1.8 伺服

项目中使用的,有点贵,可以买便宜的。

1.9 3S航模电池(注意电池大小)

1.10 稳压模块和开关

将航模电池的电压降到5V,为单片机、舵机、蓝牙、超声波、电机编码器供电。

1.11 车轮和轴承

由于手推车的后轮是由皮带驱动的,为了减少摩擦,使后轮转动更平稳,需要在后轮上安装一个微型轴承。(轴承是根据轴尺寸购买的)

1.12 车架及转向结构(3D打印)

13.电路PCB

以上功能模块都集成在一块PCB电路板上(6.5×7.8cm),为了方便焊接,电容、电阻、三极管都是直插式元器件。

02

软件篇

2.1main.c

#include "sys.h" float AdcValue;                       //电池电压数字量float Pitch,Roll,Yaw;                 //角度short aacx,aacy,aacz;                 //加速度传感器原始数据short gyrox,gyroy,gyroz;              //陀螺仪原始数据int PWM1;int PWM_MAX=6500,PWM_MIN=-6500;  //PWM限幅变量int Encoder_Motor;  //编码器数据(速度) int main(void){    NVIC_Config();     delay_init();    Led_Init();    Beep_Init();    Wave_SRD_Init();     uart3_init(9600);    OLED_Init();      //初始化OLED      OLED_Clear();    adc_Init();    MOTOR_1_Init();    MOTOR_2_Init();    PWM_Init_TIM3(7199,0);//定时器3初始化PWM 10KHZ,用于驱动动量轮电机     PWM_Init_TIM2(9999, 143);//定时器2初始化PWM 50HZ,用于驱动舵机    TIM_SetCompare1(TIM2, 790);//舵机复位    Init_TIM1(9998,7199);    Encoder_Init_TIM4(65535,0);    OLED_ShowString(25,4,"MPU6050...",16);    MPU_Init();            //MPU6050初始化  while(mpu_dmp_init())    {    OLED_ShowString(25,4,"MPU6050 Error",16);    }      OLED_ShowString(25,4,"MPU6050 OK!",16);     Beep=1;    delay_ms(400);    Beep=0;    MPU6050_EXTI_Init();    OLED_Clear();    OLED_ShowString(0,0,"Roll :         C",16);    OLED_ShowString(0,3,"Speed:         R ",16);    OLED_ShowString(0,6,"Power:        V ",16);        while(1)    {                  Wave_SRD_Strat();                AdcValue=11.09*(3.3*Get_adc_Average(ADC_Channel_4,10)/0x0fff); //ADC值范围为从0-2^12=4095(111111111111)一般情况下对应电压为0-3.3V        OLED_Showdecimal(55,0,Roll,9,16);          OLED_Showdecimal(55,3,Encoder_Motor*0.25,9,16);                 OLED_Showdecimal(50,6,AdcValue,9,16);         }}

2.2PID控制算法

学习视频:

汽车需要使用两个闭环控制来实现立式平衡,即立式环(PD控制,负反馈),速度环(PI控制,正反馈)。代码原理和调试过程与两轮平衡车的调试过程基本相同。

关于PID控制算法的学习,内容较多,不便于详细展开。网上资源丰富,大家可以自学。

这是一篇推荐的文章:

2.3 读码注意事项

所有头文件都包含在 sys.h 中,每个 .h 文件都包含 sys.h 以方便函数调用。

#ifndef __SYS_H#define __SYS_H#include "stm32f10x.h"#include "adc.h"#include "oled.h"#include "led.h" #include "beep.h"#include "wave.h"#include "control.h" #include "exti.h" #include "mpu6050.h"#include "inv_mpu.h"#include "inv_mpu_dmp_motion_driver.h" #include "motor.h"#include "pwm.h"#include "encoder.h"#include "usart.h"   #include "delay.h"#include #include 

STM32F10x系列MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们将这些端口设置为普通 I/O 端口,以充分利用 MCU I/O 端口的资源。

使用JLINK烧写STM32时,需要用到6个芯片引脚(以STM32F103C8T6为例),即PB4/JNTRST、PB3/JTDO、PA13/JTMS、PA14/JTCK、PA15/JTDI、NRST。

当芯片的IO口资源比较紧张时,可以选择SW模式烧录程序。

SWD只需要使用PA13/JTMS、PA14/JTCK两条线,NREST可以接也可以不接,剩下的PB4/JNTRST、PB3/JTDO和PA15/JTDI都可以做普通IO,不过这三个口当然是正常的使用IO时,需要先配置如下。(这里MPU6050模块使用PB3和PB4引脚)

03

最后

3.1张作品照片

3.2 如何获得

加入星球的同学可以直接从星球下载。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论