从零复刻平衡小车(基于STM32F1)

前言

本项目是对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;
}

最后附上完整图,希望大家复刻成功!

物联沃分享整理
物联沃-IOTWORD物联网 » 从零复刻平衡小车(基于STM32F1)

发表评论