资讯详情

做一辆超mini平衡自行车,全开源!

大家好,我是张巧龙。今天,我给你带来了一辆平衡自行车。我的实验室是一名19级本科生。他今年还获得了全国电子竞技二等奖(F问题)成绩。

人,一个很帅的小伙子。B站ID:,欢迎大家观看!

好了,废话不多说,直接打开!先看视频,相关方案在后面。

程序、电路、3D打印文件。

eaa09e43758bd00c6ce2f23a96b03ff0.png

使用教程链接:https://blog.csdn.net/weixin_44325419/article/details/110727911

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

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

电机接线图如上图所示,实际车内线的颜色可能与上图不一致。我们应该根据位置来判断,而不是线的颜色。

1.信号A相和信号B相是编码器脉冲输出端;

2.我们直接使用单片机的引脚3.3V电平控制完全没有问题;

3.编码器供电3.3V;

4.PWM接单片机的PWM输出,启动我们的接单片机IO当电机初始化时,口为高电平;

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

用在项目上,有点贵,可以买便宜的。

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

由于汽车后轮由皮带驱动,为了减少摩擦,使后轮旋转更光滑,需要在后轮安装微轴承。(根据轴的大小购买轴承)

将上述功能模块集成在一起PCB电路板上(6.5x7.8cm),为方便焊接,电容电阻及三极管均为直插式元件。

#include"sys.h" floatAdcValue;//电池电压数字量 floatPitch,Roll,Yaw;//角度 short aacx,aacy,aacz;                 ///加速度传感器原始数据 shortgyrox,gyroy,gyroz;//陀螺仪原始数据 int PWM1; int PWM_MAX=6500,PWM_MIN=-6500;  //PWM限幅变量 intEncoder_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)PWM 10KHZ,用于驱动动量轮电机      PWM_Init_TIM2(9999, 143)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=一般情况下,对应电压为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);          } }

学习视频:

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

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

这里推荐一篇知乎文章:https://zhuanlan.zhihu.com/p/39573490

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

#ifndef __SYS_H #define __SYS_H #include "stm3f10x.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 <math.h>
#include <stdlib.h>

STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通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引脚)

加入星球的同学,可以直接到星球内下载。

未加入星球的的同学,可以添加微信:great_xiaolong,加好友记得备注:自行车。

对了,借此推荐下知识星球,星球现在已有120+人加入,有兴趣加入的朋友可以添加上方微信咨询,现在加入有一定优惠。

一个亿的融资在一家芯片初创公司可以烧多久?

STM32为何在诸多的单片机中脱颖而出?

搞硬件,别吹牛了,好好做个规划!

一名教电子的大学老师,欢迎关注!

标签: 18种直插三极管包直插三极管h669hc

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台