查看: 13622
回复: 9
参赛作品《stm32平衡小车》

主题

回复
发表于2017-06-23 10:45:49 | 显示全部楼层
1# 电梯直达

【报名阶段需要填写的内容】


1. 参赛者姓名(必填项):王斐


2. 单位或学校名称(必填项):机械科创电子工作室


3. 当前职务或职称(必填项):pcb设计


4. 参赛作品的名字(必填项):stm32平衡小车


5. 简要陈述您的idea和作品(必填项):基于stm32控制的的全mos桥驱动的平衡小车


6. 拟用到的立创商城在售物料(必填项):stm32


7. 拟用到的非立创商城物料或其它补充(必填项):小车底盘


【作品正式发表(报名成功后进入设计阶段)需要填写的内容】


一、作品简介

例如,可以包括但不局限于以下内容:

1.作品图片:

 点击查看大图

 点击查看大图

 点击查看大图

 点击查看大图

2.作品的研究背景、目的和功能、市场应用前景;

研究背景:平衡小车的制作过程中涉及到多方面的知识,机械知识,PID控制,姿态解算等。

目的和功能:通过平衡小车的制作,学习工业控制中常用的PID控制,姿态解算的算法等知识,通过实践可以对这些知识有更深的认识,活学活用。现在非常火热的无人机,人形机器人的控制算法,最基础的也是这些,所以学习这些知识非常有用。

市场应用前景:平衡小车有趣、科技感强、可玩性高、参与度高。所以平衡小车在科技玩具,智能机器人教育市场有非常大的前景。现在家长对孩子的课外教育逐渐从普通音体教育转变成科技创新教育,所以市场上需要科技玩具,机器人教具。平衡小车有趣、科技感强、可玩性高、参与度高的特性就非常适合。而且小车通过加装搭载平台,就可以实现安装摄像头,搭建喜欢的积木,让小车更有趣。大家熟悉的小米公司已经向市场推出了米兔机器人,米兔本质上就是平衡小车,只不过是在平衡小车的基础上增加了乐高积木,让它的可玩性更高,同时这也间接证明小车的市场需求。相比米兔,这款平衡车开放性更高,完全可以通过自己的创新,实现米兔的功能,而且也可以实现米兔没有的功能。

3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现?

这款平衡小车没有采用大家常用的lm298n等集成电机驱动,而是采用了mos管搭建的全桥mos电路,采用mos的驱动电路用在这个小车上非常大材小用,但是采用mos搭建的好处也是显而易见的,由于mos的持续放电电流可达80A,所以这块主控除了用在这个小车上也可以用在其他很多地方,比如可以直接用这块主控做一个载人平衡车,也可以自制一台遥控车。通过板载了24l01模块,所以小车不止可以用手机遥控,还可以用2.4g遥控器遥控,这样遥控距离会大幅增加,可玩性也大大增加。在控制算法方面,加入的串级PID调节,是姿态控制更稳定,使小车更安全。



二、系统构架图

 


三、硬件部分的描述

 点击查看大图

 点击查看大图

 点击查看大图

原理图.pdf 


2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。

平衡车其运作原理主要是建立在一种被称为“动态稳定”的基本原理上。平衡控制简单讲就是小车往哪个方向倾倒,就往那个方向加速。单片机通过采集陀螺仪,加速度计的数据进行姿态解算,得到小车的实时姿态数据,通过PID控制计算出小车电机的输出方向和大小,以达到小车平衡控制。

四、材料清单(BOM列表)

器件 商品编号 购买链接
stm32f103cbt6 C8304
http://www.szlcsc.com/product/details_8796.html
mpu6050 C24112
http://www.szlcsc.com/product/details_24852.html
NRF24L01 C83616
http://www.szlcsc.com/product/details_84781.html
CP2102 C6568
http://www.szlcsc.com/product/details_7033.html


五、软件部分的描述(选填)

 


/***************************************************/
/*              ???ú×???????????????               */
/***************************************************/
 void GetMotorPulse(void) 
{   
	
	cesu_L = TIM_GetCounter(TIM4);
	TIM4->CNT = 0; 
	cesu_R = TIM_GetCounter(TIM1);
	TIM1->CNT = 0;

}

/***************************************************/
/*              ???ú×???????????????               */
/***************************************************/

void Velocity_Control(void)
{
	
	Speed_R_L = (cesu_L + cesu_R);   
	
	Speed = Speed * 0.8 + Speed_R_L * 0.2;	//???????????¨
	
	position += Speed;	                  //??·?????????
	position += -(RC_Data.PITCH * 10);     //????????  ?????°?ó
	
	Velocity_brake();                      //????
	
	if(position<-15000) position = -15000;
	if(position> 15000) position =  15000;   //??????·?????
	
	Velocity_Pwm = Speed*Velocity_Kp + position*Velocity_Ki;
	
}


/***************************************************/
/*                 ????????????                    */
/***************************************************/
u8 Position_flag=0;

void Velocity_brake(void)
{
		if(RC_Data.PITCH>=10 || RC_Data.PITCH<=-10)      
		{
			Position_flag=1;
		}
		if(RC_Data.PITCH==0 && Position_flag==1)
		{
			if(position<0)
			{
				position+=300;         //???????????? ·?????????
				
				if(position>=-500)
				{
					Position_flag=0;     //?ú×???????????
					return; 
				}
			}
			if(position>0)
			{
				position-=300;         //???????????? ·?????????
				
				if(position<=500)
				{
					Position_flag=0;
					return;
				}
			}
		}
}
/*====================================================================================================*/
/*====================================================================================================*
**???? : Motor_Conter(void)
**???? : ???ú????
**???? : None
**?”?? : None
**±?×? : None
**====================================================================================================*/
/*====================================================================================================*/



void Motor_Conter(void)
{
		
	ctrl.pitch.core.pid_out = ctrl.pitch.core.pid_out - Velocity_Pwm;      //PID????????????;
	
	motor_L = ctrl.pitch.core.pid_out - RC_Data.ROLL*50;     //??????×ó??????
	motor_R	= ctrl.pitch.core.pid_out + RC_Data.ROLL*50;

	pwm_control((int16_t)(motor_L*L_make),(int16_t)(motor_R*R_make));
	
	if(AngE.Pitch<-60 || AngE.Pitch>60)         //?ó???è?????????ú±??¤
	{
		moto_STOP();
	}
	//pwm_control(0,0);
	
}



六、作品演示

请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得5分,具体详见活动规则。

https://v.qq.com/x/page/p0523vb2kxk.html

七、总结

平衡小车看似简单,实际包含的东西还是很多的,电机控制,姿态算法,PID算法,无线通讯等。通过平衡小车的制作,对姿态算法,PID控制等都有了更具体的理解。


主题

回复
发表于2017-07-15 11:58:37   |  显示全部楼层
4#
这个小车不错,话说这么小,准备是用在什么地方的呢?

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部