倒立摆入门详解+pid调参

倒立摆制作全过程

最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。
首先给你们看看我的成果
在这里插入图片描述
注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。

材料准备

1.机械部分

机械部分
如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。

2.主控部分

控制部分
这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件也可以代焊。

3.代码编写以及调参

上面的话都是硬件部分,需要自己动手去制作的,接下来我教大家怎么给倒立摆调参。代码的话我已经把源码上传到我的资料那里了,里面都有详细解说的,大家可以直接去下载来看,可以理解的。

下面展示 main函数部分

int main(void)
{ 
	Stm32_Clock_Init(9);          
	delay_init(72);                 
	JTAG_Set(JTAG_SWD_DISABLE);    
	JTAG_Set(SWD_ENABLE);         
	delay_ms(1000);                
	delay_ms(1000);             
	LED_Init();               
	EXTI_Init();                 
	OLED_Init();                   
	uart_init(72,128000);           
  MiniBalance_PWM_Init(7199,0); 
	Encoder_Init_TIM4();            
	Angle_Adc_Init();            
	//Baterry_Adc_Init();           
	Timer1_Init(49,7199);      
	while(1)
		{      
				//DataScope();	          
				delay_flag=1;	        
				oled_show();             
				while(delay_flag);       							
		} 
}

学过32的基本都懂,就是需要用到的模块都初始化,然后启动定时器函数进入pid控制的中断进行偏差控制。

pid控制代码

int TIM1_UP_IRQHandler(void)  
{    
	if(TIM1->SR&0X0001
	{   
		  TIM1->SR&=~(1<<0);                                       	                     
	     if(delay_flag==1)
			 {
				 if(++delay_50==10)	 delay_50=0,delay_flag=0;          
			 }		
    	Encoder=Read_Encoder(4);             	                   
      Angle_Balance=Get_Adc_Average(3,15);                     
     	Balance_Pwm =balance(Angle_Balance);                                          
	    if(++Position_Target>4)	Position_Pwm=Position(Encoder),Position_Target=0;     
      Moto=Balance_Pwm-Position_Pwm;        
		  if(Angle_Balance<1600 || Angle_Balance>2660) Moto = 0;
		  Xianfu_Pwm();                 
		 // if(Turn_Off(Voltage)==0)          
			Set_Pwm(Moto);                    
	  	Led_Flash(100);                      
	   // Voltage=Get_battery_volt();       	      
			Key();                  
	}       	
	 return 0;	  
} 


int balance(float Angle)
{  
   float Bias;                       
	 static float Last_Bias,D_Bias;   
	 int balance;                   
	 Bias=Angle-ZHONGZHI;          
	 D_Bias=Bias-Last_Bias;            
	 balance=-Balance_KP*Bias-D_Bias*Balance_KD;   
   Last_Bias=Bias;                  
	 return balance;
}


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;
}

接下来就是重头戏了,调参部分
倒立摆要保持平衡,就需要有两个环,一个是角度环,保证摆杆能够不倒下来,再有一个是位置环,确保水平杆不会乱转。

角度环5ms采集一下 位置环25ms采集一次,电机控制是5ms控制一次。
这里位置环25ms是这样的出来的:首先尝试5ms,但是不论参数怎么调试都是反应剧烈,所以逐渐加大延长编码器采集时间,到了30ms的时候根据相同参数比较反应滞后,座椅最后确定25ms。

角度环:p :加参数加到放手可以直立一会 但是一碰就抖动很厉害
加上d后:加参数加到可以直立不倒 向两边或一边加速,碰一下不抖

位置环:p:因为电机总得脉冲是7200,然后倒立摆转一圈编码器根据正交解码测得是1024个脉冲,在25ms中断中大部分时候达到的最大脉冲差值是100左右,所以我们P参数确定的范围暂且是1~50.
因为有位置环p的存在,所以倒立摆在偏了一小段的时候会有恢复力,但这个恢复力超调太大了,导致倒立摆剧烈来回摆动,所以此时加微分参数D,来减小超调。
微分参数大小的判断是因为它乘的是这次位置差-上次位置差,这个差值在25ms中断中最大位十左右,所以我们暂定微分参数是0~300。

具体请参考文章:参数整定

  • 44
    点赞
  • 290
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
双闭环PID控制的一阶倒立摆调参思路如下: 1. 设计外环控制器 在设计外环控制器时,需要选择一个合适的控制器类型和参数,使得系统能够快速响应外部参考信号,并具有良好的稳定性。可以考虑使用PI或PID控制器,利用系统的位置误差和速度误差进行控制。在选择参数时,可以采用试错法或者模拟仿真方法进行调整,使得系统具有合适的响应速度和稳定性。 2. 设计内环控制器 在设计内环控制器时,需要选择一个合适的控制器类型和参数,使得系统能够快速响应外部参考信号,并具有良好的稳定性。可以考虑使用PI或PID控制器,利用系统的角度误差和角速度误差进行控制。在选择参数时,可以采用试错法或者模拟仿真方法进行调整,使得系统具有合适的响应速度和稳定性。 3. 联合调整控制器参数 在调整控制器参数时,需要考虑外环控制器和内环控制器的影响。可以先调整外环控制器的参数,使得系统具有合适的响应速度和稳定性,然后再调整内环控制器的参数,使得系统的稳态误差和控制精度达到要求。在调整参数的过程中,需要注意避免参数调整过度,导致系统不稳定或者震荡。 4. 验证控制效果 在完成控制器参数的调整后,需要对系统进行验证,验证控制器是否能够满足要求。可以采用模拟仿真或者实际测试的方法进行验证,评估系统的控制精度、鲁棒性和鲁棒性等性能指标,以及系统对外部扰动和干扰的响应能力。如果控制效果不理想,需要重新调整控制器参数,直到满足要求为止。 以上就是双闭环PID控制的一阶倒立摆调参的思路,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值