前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简易旋转倒立摆_小车倒立摆受力分析讲解

简易旋转倒立摆_小车倒立摆受力分析讲解

作者头像
全栈程序员站长
发布于 2022-08-03 00:43:27
发布于 2022-08-03 00:43:27
97500
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

旋转倒立摆调节经验

前言

近期在做2013年电赛控制类题目–简易旋转倒立摆装置,自己并不是自动化专业的学生,没有学过自动控制原理,倒立摆其实是一个十分经典的自动控制模型,我们只能是边做边学习,逐渐去了解倒立摆。 我认为倒立摆有两个难点,一个是自动起摆一个是机械结构,其中自动起摆涉及到PID算法与运动方程的求解,而机械结构主要是尽量减小转动阻尼同时避免旋转时线的缠绕。我们买了平衡小车家的机械结构套件,他们为了避免线缠绕使用了导线环,这是一个好东西,可以完美解决导线缠绕问题。我在学习平衡小车家程序与算法的过程中也是总结了一些经验,在这里分享一下。

程序框架

平衡小车家旋转倒立摆的代码符合他们家的一贯作风,所有的控制算法在定时中断中实现,可以进行确定频率的控制,使用了一个5ms中断,在中断中完成数据读取、PWM控制量计算、对电机的控制,这样的代码结构清晰、响应快,但是也有些缺点,如果你要有功能选择,在中断中的代码是比较复杂的,要么使用switch-case完全放弃代码的共用,如果有共用部分的代码那么代码逻辑要仔细考虑。 对于那些执行频率不必太高的功能,比如50ms向上位机发送数据、100ms进行LED闪烁、100ms读取电池电压,你可以用一个每次中断累加的变量来进行控制,当它取余为某一值时执行某一功能,这样就类似与一个任务调度器了。 还有一点要注意的是,在中断中那些重要的、每次都必须执行的代码要放在靠前的位置,而那些对实时性要求不太高的代码可以往后稍一稍,因为每次进入中断就清除中断标志位,下一个中断会在5ms后准时到来,如果你当前的中断没有执行完则会被打断(一般是不会发生这样的事情,除非在中断中做了耗时很长的操作),所以为了避免打断那些控制代码要放在靠前的位置。 最后,在中断中不放耗时久的操作这也是常识了,那些耗时久的以及耗时久同时有时序要求的代码都可以放在主函数中执行,比如OLED的刷新、向上位机的数据发送,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while(1)
{ 
         
	DataScope();	            //===上位机
	delay_flag=1;	            //===50ms中断精准延时标志位
	oled_show();               //===显示屏打开 
	while(delay_flag);         //===50ms中断精准延时 主要是波形显示上位机需要严格的50ms传输周期 
	if(Flash_Send==1)          //===写入PID参数到Flash,由按键控制该指令
	{ 
   
		Flash_Write();	        //===把参数写入到Flash
		Flash_Send=0;	          //===标志位清零
		Flag_OLED=1;            //===显示标志位置1 在显示屏上面显示Data Is Saved的字样
	}							
} 

这里每50ms进行一次数据发送和刷屏,使用while(delay_flag);来等待50ms标志位,时间控制的还是比较好的。

关于直立

我们的旋转倒立摆使用旋转电位器来获取摆杆的当前角度,电机使用的是带编码盘的直流电机。我们要保持的直立有两个要求,摆杆垂直与平面同时要尽量静止与原地,不会随意的转动。 所以说要有两个环来控制,首先是角度环,以旋转电位器的值与垂直点的偏差为输入,目标是把这个偏差控到零,我们使用的PD控制器,因为该系统有一定的滞后性,而且是一个不稳定的系统,我认为并没有消除静差的需求,所以没有上积分,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int balance(float Angle)
{ 
     
	float Bias;                       //倾角偏差
	static float Last_Bias,D_Bias;    //PID相关变量
	int balance;                      //PWM返回值 
	Bias=Angle-ZHONGZHI;              //求出平衡的角度中值 和机械相关
	D_Bias=Bias-Last_Bias;            //求出偏差的微分 进行微分控制
	/*===计算倾角控制的电机PWM PD控制===*/
	balance=-Balance_KP*Bias-D_Bias*Balance_KD;   
	Last_Bias=Bias;                   //保持上一次的偏差
	return balance;
}

角度环参数的整定,首先调节KP这没什么说的,首先确定极性,然后从低往高调节到出现低频抖动(比较严重的),接下来确定KD的极性,注意KD是负反馈,偏差增大时应该控制系统往减小偏差的方向运动,这样才能帮助摆杆直立,所以确定极性后从小往大调节,KD的参数是要比较大的,因为偏差的微分每次都会是一个比较小的值,调到系统基本可以直立,并且有高频振动时就可以了,这样我们就确定了KP和KD的最大参数,将它们乘0.6就可以得到正常的PD参数。 接下来就是位置环了,在前面我们调节好直立环后,摆杆可以直立一段时间,但是它会逐渐往一个方向加速,然后直到转到全速后倒下,我们就需要位置环来让它稳在原地,同时给它更快的速度去追要倒下的杆。这里我们一开始想错了,我们错以为位置环的作用就是使摆杆停在某一个位置,即进行负反馈,但是这样调的结果是摆杆更加不能倒立了还不如只有直立环的效果好,查阅资料后发现应该使用正反馈,应该让速度更快去追倒下的摆杆,也就是如果只有位置环,你往任意方向转动悬臂,悬臂会往这个方向加速旋转直到全速。位置环的输入为编码器的值与目标点的差值,同样适用PD调节,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int Position(int Encoder)
{ 
     
   static float Position_PWM,Last_Position,Position_Bias,Position_Differential;
	 static float Position_Least;
  	Position_Least =Encoder-Position_Zero;             			//===最近位置差值
    Position_Bias *=0.8;		   
    Position_Bias += Position_Least*0.2;	             		//===一阶低通滤波器 
	Position_Differential=Position_Bias-Last_Position;
	Last_Position=Position_Bias;
	Position_PWM=Position_Bias*Position_KP+Position_Differential*Position_KD; //===速度控制 
	return Position_PWM;
}

使用低通滤波器的作用是减缓位置差值对平衡的影响,也就是上次位置差值占80% + 这次速度差占20% =此次速度差值。 调节位置换我们没有太好的办法,只能是根据经验给一些值,KP参数不要太大,否则会对直立环有较大的影响,KD参数要大一些,使得在最短时间内达到最大速度。这里建议不要单独调位置环,最好把直立环和位置环一起调节,边看效果边看数据曲线边调。 如果要实现在保持平衡的时候 最后的效果我们基本可以实现平衡小车家视频中的效果,可以较好的实现直立。

关于自动起摆

自动起摆的程序我们研究的也不是特别的透彻,尤其是涉及运动方程的部分,还没有自己去推公式,我们的自动起摆程序大致分为两步,第一步是让摆的摆幅逐渐增大,直到接近于水平,这里增大摆幅的同时还有略微减小周期,这可以通过运动公式来计算出来,当摆幅达到要求且正在下落时悬臂会迅速的往下落的方向旋转大约半圈,然后它由于过冲会有一个回摆,通过这个回摆就会把摆杆摆起来,这时开启直立环,因为位置环会削弱直立环的作用,所以在刚刚立起摆杆不够稳定的情况下先不开启位置环,过300ms后开启位置环,这时自动起摆的过程就完成了。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Run(u8 Way)
{ 
    		   
	  static float Count_FZ,Count_Next,Target_Position=10380;
	  static u8 Flag_Back;
  	static float Count_Big_Angle=0.046542;
	  static int Position_Max;
	if(Way==1)                                 //进入自动起摆程序 按键触发
	{ 
   
	if(Flag_qb==1)  //第1步,摆杆自由摆动,振幅越来越大
	{ 
   
		Ratio=1; //正常的PID参数
		Count_qb+=Count_Big_Angle;   //自变量
		Count_Big_Angle-=0.0000027;      //振幅越大,摆动周期略微减小
		Count_FZ+=0.025;   //振幅越来越大
		Target_Position=0.6*Count_FZ*sin(Count_qb)+10000;  //运动公式 
		Encoder=Read_Encoder(2);             	       //===更新编码器位置信息
		Moto_qb=Position_PID(Encoder,Target_Position);  //位置闭环控制
		if(Moto_qb>7200)Moto_qb=7200;//控制位置闭环控制过程的速度
		if(Moto_qb<-7200)Moto_qb=-7200;//控制位置闭环控制过程的速度
		//2100
		if(Angle_Balance>(Angle_Max+850)&&Angle_Balance<2320&&D_Angle_Balance<=-1)   //振幅大于阈值时,进入下一步 
		{ 
   
			Flag_qb++;
			Count_qb=0;
			TIM2->CNT=10000;        //复位一下计数寄存器
			Count_FZ=0;
		}
	Set_Pwm(Moto_qb); //赋值给PWM寄存器 
	}
	 if(Flag_qb==2)            //第3步,通过位置控制,利用惯性,自动起摆
	 { 
   	 
		 Target_Position=10600;                        //设定目标值
		 Encoder=Read_Encoder(2);             	       //===更新编码器位置信息
	 Moto_qb=Position_PID(Encoder,Target_Position);//===位置PID控制器
		 if(Moto_qb>7200) Moto_qb=7200;
		 if(Moto_qb<-7200)Moto_qb=-7200;
	 Set_Pwm(Moto_qb);  //赋值给PWM寄存器
		if(Angle_Balance<(ZHONGZHI+200)&&Angle_Balance>(ZHONGZHI-200))  //到底接近平衡位置 即可开启平衡系统
		{ 
   	
			State=1;   //倒立状态置1
			Way_Turn=0;//自动起摆标志位清零
			Flag_qb=0; //自动起摆步骤清零
			Angle_Max=0;
			Balance_KP += 30;
			Balance_KD += 200;
		}
	 }
	 if(Flag_qb==3)            //停
	 { 
   
		AIN1 = 1;AIN2 = 1;
	 }
	}
	if(Way==2) //手动起摆程序
	{ 
   
	if(Angle_Balance<(ZHONGZHI+200)&&Angle_Balance>(ZHONGZHI-200))  //到底接近平衡位置 即可开启平衡系统
		{ 
   	
			State=1;   //倒立状态置1
			Way_Turn=0;//起摆标志位清零
		}
	}
}
int Position_PID (int Encoder,int Target)
{ 
    	
	 static float Bias,Pwm,Integral_bias,Last_Bias;
	 Bias=Encoder-Target;                                   //计算偏差
	 Integral_bias+=Bias;	                                  //求出偏差的积分
 // Pwm=70*Bias*Ratio+0.00*Integral_bias*Ratio+200*(Bias-Last_Bias)*Ratio; //位置式PID控制器
  Pwm=90*Bias*Ratio+0.00*Integral_bias*Ratio+250*(Bias-Last_Bias)*Ratio;   //位置式PID控制器
	 Last_Bias=Bias;                                        //保存上一次偏差 
	 return Pwm;                                            //增量输出
}

有几个注意的点。这里运动方程我并不知道该如何调,这个是根据你摆杆重心、电机特性、当地重力加速度等算出来的,这个还是得试着推一下;还有一个点是刚刚立起来时直立环参数应该调大一点,我们就设置成了直立环的最大参数,300ms后在用正常的参数加上位置换来控制,因为我们在调节时发现起摆后的一瞬间经常没能直立,摆的抗干扰性不够强,所以加大了直立环参数,用这样的方法起摆的成功率大大增加。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125136.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
钢铁行业B2B电商数字化改革:赋能产业链,打破模式发展瓶颈
钢铁电商作为产业电商的先行军团,近几年行业发展迅猛,网经社发布的《2020年度中国产业电商市场数据报告》显示,2020年中国钢铁电商市场规模4500亿元,较2019年的3500亿元同比增长28.57%。
数商云网络科技
2022/08/24
7220
钢铁行业B2B电商数字化改革:赋能产业链,打破模式发展瓶颈
三个驱动力,助推b2b 电商平台发展
靠烧钱做出来的B2B平台公司,成长快,但堡垒低,资金一旦跟不上,整个链条就塌方了,大部分B2B公司,还是稳一点,不要一上来就收割流量,鱼都不养的,直接捞一波,也没捞到多少,鱼塘搞死了。精准流量把控好,数据分析透,供应链服务做扎实,打造好B2B电商平台驱动战略更加靠谱。
数商云
2019/04/22
7590
三个驱动力,助推b2b 电商平台发展
工业品赛至中场:企业如何以B2B平台突围,用供应链服务制胜?
作为近年来的热门词汇之一,工业品B2B是指企业之间通过互联网进行的工业品行业的产品交易和信息传递,以及围绕工业品供应链进行的其他数字业务与活动。
数商云
2022/08/24
4350
工业品赛至中场:企业如何以B2B平台突围,用供应链服务制胜?
响铃:迎风而起的布料B2B平台,谁才是决定生死的命脉?
近日,嘉御基金创始人、前阿里巴巴CEO卫哲一句“B2B的春天来了,且快入进去夏天”恰好折射出布料行业的现状。与服装价格节节攀升相比,服装纺织行业算不上欣欣向荣,而作为服装产业链上的重要一环,面料行业的一举一动却是产业链中的关键。其中原因之一便是高毛利,布料从厂家到终端服装公司的流通环节毛利15%~50%不等,其中常规布(偏标品的部分)的毛利达15%~30%,这相比其他产业的B2B公司的利润空间更大。随着互联网+的入侵,纺织面料也发展成为垂直B2B中仅次于生鲜和钢铁电商的热门创业品类,并崛起了一批面料B2B电商平台,如“搜布”、“百布”、“优料宝”、“链尚网”、“搜芽”等等,就连明星衣橱也在内部孵化出布料B2B平台“衣布到位”。这似乎一改过去冷清的局面,那偏冷门的布料行业真的能热起来吗?
曾响铃
2018/08/20
7940
响铃:迎风而起的布料B2B平台,谁才是决定生死的命脉?
简述B2B2B系统与B2B平台转化条件和区别
B2B模式的厂家需要借助各种2B平台,实现用B2B模式对市场更有效率的覆盖,并且实现对终端的更有效率的营销。需要借助各种2C平台实现与消费者的链接,特别是要重点挖掘直接面对消费者的营销价值。需要借助各种020平台实现链接消费者,并实现到家模式的快速覆盖。
数商云
2020/08/07
1.5K0
简述B2B2B系统与B2B平台转化条件和区别
数字化赋能塑化产业,打造B2B塑化电商新模式
对于中国的塑化行业来说,今年的塑化企业有点难。首先,受贸易政策因素影响,行情涨少跌多,呈现持续低迷的现象。其次,下游需求跟进有限,库存去化相对缓慢。最后,还有很多大环境无法控制的因素在左右着塑化人的生意,比如不定期反弹的国内疫情、国际化形式对行业的影响等。
数商云
2022/01/05
3210
数字化赋能塑化产业,打造B2B塑化电商新模式
电子元器件行业B2B电商市场模式、交易能力数字化趋势分析
随着工业化与信息化的高度融合,电子元器件的应用已渗透到整个工业领域中,是支撑整个工业创新发展的基础和关键。作为现代工业的核心和基础,新型电子元器件产业是各地争相发展的战略性新兴产业,也是我国工业发展的不可或缺的产业。
数商云网络科技
2022/06/24
1.2K0
电子元器件行业B2B电商市场模式、交易能力数字化趋势分析
工业制造行业B2B电商平台整体解决方案
数据显示,自从进入2017年,我国工业增加值与增速出现了几次不同程度的上涨,一改往常持续下降的局面。国内整个工业制造业正在逐渐复苏,同时随着国家在政策层面持续加码促进大型工业制造业拥抱电商,资本市场也在不断发力,鼓励金融业脱虚向实,回归实体的指导方针不断落地,我国工业制造业将面临政策导向与扶持的友好环境。
数商云市场营销总监
2021/01/29
7320
工业制造行业B2B电商平台解决方案
数据显示,自从进入2017年,我国工业增加值与增速出现了几次不同程度的上涨,一改往常持续下降的局面。国内整个工业制造业正在逐渐复苏,同时随着国家在政策层面持续加码促进大型工业制造业拥抱电商,资本市场也在不断发力,鼓励金融业脱虚向实,回归实体的指导方针不断落地,我国工业制造业将面临政策导向与扶持的友好环境。
数商云市场营销总监
2019/03/25
1.2K0
B2B电商赋能化工行业,实现资源高效整合快速获客
自2014年伊始,一批着眼于化工类的垂直B2B电商开始兴起,目的是用互联网方式降低行业信息不对称,提高流通分销效率,降低产业链运营成本。然而,在经过几年的“野蛮生长”后,化工类B2B电商平台似乎进入了一段冷却期,增速逐渐递减,除了化工行业自身发展影响外,什么是化工产业链真正需要的服务更是成为困扰企业的核心问题。
数商云
2021/03/09
9.4K0
B2B平台部署区块链技术,这三个方向不可错过
从2018年下半年开始,比特币一众虚拟货币一直走下坡路,11月因为BCH分叉事件,让比特神话在2018年年底又上演了一次断崖式下跌。币圈哀嚎一片,多少人指望着在农历新年前能小赚一笔,再不济也能全身而退,结果却大跌眼镜。币圈和链圈本是唇亡齿寒的关系,那面的日子过得不好,链圈也难以独善其身。
数商云市场营销总监
2021/10/22
6060
生鲜行业B2B电商平台解决方案
“生鲜B2B元年”,这是2014年美菜网进入万亿规模的生鲜B2B市场时,我国业内对生鲜电商开启B2B模式的说法。如今7年已过去,中国的生鲜B2B电商平台目前的发展状况如何?在愈加激烈的生鲜电商赛道上,生鲜B2B企业应如何面对行业革新、机遇与挑战?
数商云市场营销总监
2022/02/21
1.2K0
B2B供应链电商系统平台解决方案,如何实现全网整合
优秀的B2B电商商城平台开发公司除了提供搭建电商系统的服务之外,更应该为客户制定一套合理的电商系统平台整合解决方案。B2B供应链电商开发公司【数商云】表示如果B2B商城网站建设价格过低,很明显在功能和体验都会存在缺陷,所以我们在定制一个供应链电商解决方案时应该做到整合供应链资源,撮合上下游供应采购对接,实现采购、生产、库存、销售、售后的协同。
数商云市场营销总监
2019/03/21
2.9K0
B2B电商如何颠覆化工,实现产业总体能效优化?
根据有关数据显示,去年中国整个化工的表观消费量是15万亿人民币,如果按照交易量来计算,生产商给分销商,分销商给客户,中间平均交易3次,就有45万亿的交易量市场。中国的化工市场最大,占全球市场的30%,从体量上来讲是世界第一,市场机会自然也最大。但因行业面临产能过剩、宏观经济转型,让传统卖方市场逐步转为了买方市场。这种情况下,B2B交易型电商平台应运而生,平台的价值在于提升效率整合资源,解决产能过剩下的供需失衡。
数商云
2021/06/16
3680
B2B电商如何颠覆化工,实现产业总体能效优化?
重金属行业B2B电商网站平台打破数据孤立状态,提升行业效益
重金属原义是指比重大于5,相对密度在4.5g/cm³以上的金属,称作重金属的金属,包括金、银、铜、铁、铅等。近年来面临一些比较大的困境,包括:
数商云市场营销总监
2022/02/23
4880
钢铁企业以撮合模式切入B2B平台,汇聚势能实现价值最大化
加上“互联网+”与“供给侧改革”的碰撞,经济与产业的转型推动了B2B的发展。目前,钢铁行业面临着产能过剩和供需失衡的问题,供给侧改革的重要内容就是去产能、去库存、降成本,而B2B电商正可以充分发挥互联网高效连接的特点,实现上下游供需的高效对接,帮助化解产能过剩、流通成本高等问题,成为助力钢铁行业转型升级的利器。
数商云
2020/06/24
4660
钢铁企业以撮合模式切入B2B平台,汇聚势能实现价值最大化
B2B行业丨立足贸易关系,寻找切入点,确立自身定位
众所周知,B2B指的是面向与企业与企业间提供服务,帮助企业相互进行数据信息的交换、传递展开交易活动的商业模式(摘自百度)。企业与企业之间的基础是商业贸易,贸易构成了链接企业与企业之间的链条;贸易同样构建了企业人与企业人之间的关系链条:多个企业与企业间的贸易网络构成了贸易圈,垂直产业中上游和下游的多个企业与企业之间的贸易衔接组成了产业链。
Dorothy
2019/04/02
5100
B2B行业丨立足贸易关系,寻找切入点,确立自身定位
厨卫电器行业B2B交易管理系统优化库存结构,加速产业数字化生态建设
后疫情时代,我国厨卫电器行业除集成灶、洗碗机等部分新兴产品外,市场整体呈现低迷状态。这样的状态一方面是由于疫情影响造成的市场扰动,但最根本的还是厨卫电器行业进入到了存量市场,市场竞争愈加激烈,企业稍有不慎就有可能淘汰出局。
数商云
2022/05/09
2810
厨卫电器行业B2B交易管理系统优化库存结构,加速产业数字化生态建设
交易管理|化工行业B2B电商数字化询报价精确对接供求
伴随着绿色低碳发展理念日益深入,化工行业转型升级已成必然发展趋势,但在行业转型过程中,仍存在一些管理痛点。例如,由于科研资金投入少,核心技术工艺落后,使得能源利用率低,造成生产成本的大幅增加;部分化工厂过度追求规模化生产而导致的产能过剩问题;以及化工行业能源结构不合理,制约了化工行业低碳化进程,产业亟待升级优化。
数商云网络科技
2022/09/29
5790
交易管理|化工行业B2B电商数字化询报价精确对接供求
B2B跨境电子商务平台综合服务解决方案
外贸跨境电商平台是在国家政策支持下由政府与跨境企业或者进出口电商企业与企业之间进行的建设和运营,在跨境电商网站运营过程中,政府部门在海关、检验检疫、税务、外汇等方面对出口跨境电商平台实施监管政务的服务作用。跨境电商平台也由此区分为跨境电商通关服务平台、公共服务平台、综合服务平台三大层面,跨境综合服务平台主要针对的发展对象就是企业。由此可见,外贸跨境出口电商发展蓬勃,离不开国家政策的支持,而国内经济水平经过改革开发40年的变化,整体从投资、进出口贸易为核心的增长向消费为主导转变。
数商云市场营销总监
2019/04/10
2.2K0
推荐阅读
相关推荐
钢铁行业B2B电商数字化改革:赋能产业链,打破模式发展瓶颈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验