前言
本项目是对b站up主的开源项目进行了复刻,平衡车也特别适合作为入门单片机了解控制原理的一个小项目,这里主要记录复刻的过程与心得。
一、硬件搭建
所需工具:焊烙铁、热风枪
首先焊单片机最小系统,包括原理图中的最小系统、电源以及串口通信部分。
首先对电源部分打电表,确定5V、3V3和GND没有短接。
电脑提前安装好CH340驱动,连接串口是否能正常识别,正常识别后才可以进行下面的操作,我刚开始将Type-C口两侧的端口GND、A4B9焊在了一起,导致串口无法识别,排除了很久。
由于MPU6050是QFN封装,还是用热风枪比较方便,提前准备好锡膏和助焊剂,锡膏熔点低一点,参考的是这个视频。其他要注意的就是LED选择5730 0.5W贴片灯珠。刚下载程序发现OLED不亮,排除下来是OLED引脚虚焊。
二、调试组装
焊好所有模块,首先测试板子功能是否正常。对keil5工程Balance_Car进行编译,编译中发现core_cm3.h总是报错,缺少初始化文件,对相关文件进行搜索下载,放在CORE文件夹下。
将编译好的工程下载到主控板中,电脑连接串口,打开主控板电源开关,打开串口调试助手,按下reset键,查看接收到的信息,这个时候板子需要静置,否则会出现Initialization failed!当出现以下内容时,证明主控板功能完好。
接下来就是组装了,包括制作转接线等,可以变组装边对各个模块(电池盒、电机驱动)进行测试,不作详述。
三、调试PID
其实代码不作修改平衡小车也能运行,连接上微信小程序就可以遥控了,我这里为了单独了解平衡小车控制原理,对PID的参数进行了调试,网上教程很多。
1.确定机械中值
首先平衡小车的机械中值不一定在0°的位置,我的平衡小车机械中值测下来是-2.2°,这个受平衡小车机械结构的影响,首先需要确定好机械中值,才可以进行下面参数的调试,不然小车很难静止下来。
2.直立环PID参数
直立环只需要确定Kp和Kd,在确定Kp前,需要将其他PID的参数置为0,逐渐调大Kp,当小车出现低频振荡且可以保持振荡一定时间说明Kp值已经差不多了。接下来调试Kd,逐渐增大Kd,当小车已经可以保持直立,并且推动小车出现高频的抖动时,Kd值就可以确定了。根据工程经验,要将定下来的Kp,Kd都乘以0.6。
3.速度环PID参数
如果只有直立环,小车只能保证不会倒地,但会往一个方向跑,并不能保持静止,这个时候需要加入速度环。速度环只需要确定Kp和Ki,Ki=(1/200)*Kp,只需要调Kp即可,当小车初始化成功松手之后,小车移动不大并能很快静止说明参数合适。
/*******************************************************************************
* Function Name : Vertical
* Description : 控制小车角度平衡
* Input : Angle: 小车当前的pitch值
Mechanical_balance: 小车平衡点,0°
Gyro: 小车当前的gyroy值
* Output : None
* Return : 角度差产生的PWM值
*******************************************************************************/
int Vertical(float Angle,float Mechanical_balance,float Gyro)
{
float balance_UP_KP=600*0.6; //500*0.6
float balance_UP_KD=-1.8*0.6;//-1.5*0.6;
float Bias;
int balance;
Bias=Angle-Mechanical_balance;
balance=balance_UP_KP*Bias+balance_UP_KD*Gyro;
return balance;
}
/*******************************************************************************
* Function Name : velocity
* Description : 控制小车速度平衡
* Input : Targrt: 目标速度值,用于遥控控制
encoder_left: 左编码器数值
encoder_right: 右编码器数值
RC: 用于遥控控制 0 or 1
* Output : None
* Return : 编码器产生的PWM值
*******************************************************************************/
int velocity(int Targrt,int encoder_left,int encoder_right,int RC)
{
static float Velocity,Encoder_Least,Encoder;
static float Encoder_Integral;
float velocity_KP=-720;//-300;
float velocity_KI=-3.6;//-0.5;
Encoder_Least =(encoder_left+encoder_right)-Targrt; //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零)
Encoder *= 0.7; //===一阶低通滤波器
Encoder += Encoder_Least*0.3; //===一阶低通滤波器
Encoder_Integral +=Encoder; //===积分出位移 积分时间:10ms
if(Encoder_Integral>Restrict) Encoder_Integral=Restrict; //===积分限幅
if(Encoder_Integral<-Restrict) Encoder_Integral=-Restrict; //===积分限幅
Velocity=Encoder*velocity_KP+Encoder_Integral*velocity_KI*RC; //===速度控制
if(angle[0]<-70 || angle[0]>70 || STA_ECB02 || encoder_left>70 || encoder_left<-70)
Encoder_Integral=0;
return Velocity;
}
最后附上完整图,希望大家复刻成功!文章来源:https://www.toymoban.com/news/detail-414195.html
文章来源地址https://www.toymoban.com/news/detail-414195.html
到了这里,关于从零复刻平衡小车(基于STM32F1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!