位置PID与速度PID怎么叠加
傻孩子师兄,你好!我是西科大08级的。我想问一个问题,就是关于PID的,我现在调试了位置PID,速度PID,但是我就是不知道该怎么将两个结合到一起来,
也就是说,我现在实现了怎么让电机以固定的速度转,怎么让电机转固定的圈速(位移),但是我不知道该如何实现让电机以指定的速度转指定的圈速(位移)?
其中PID的核心算法是这样的:
float PID_calculate(struct PID *Control,float CurrentValue )//位置PID计算
{
float Value_Kp;//比例分量
float Value_Ki;//积分分量
float Value_Kd;//微分分量
Control->error_1 = Control->error_0;//保存一次谐波
Control->error_0 = Control->OwenValue-CurrentValue ;//基波分量
Value_Kp = Control->Kp * Control->error_0 ;
Control->Sum_error+= Control->error_0;
Value_Ki = Control->Ki*Control->Sum_error;
Value_Kd = Control->Kd*(Control->error_0 - Control->error_1 );
Control->OutputValue += Value_Kp+ Value_Ki + Value_Kd;//输出值计算,注意加减
if(Control->OutputValue >= 0)
{
Turn_Forword();
if( Control->OutputValue>MaxValue)//限幅
Control->OutputValue=MaxValue;
return (Control->OutputValue) ;
}
else
{
Turn_Backword();
if (Control->OutputValue<MinValue)
Control->OutputValue= MinValue;
return (-Control->OutputValue);
}
}
期待师兄的解答……非常感谢。 “调试了位置PID,速度PID”,位置PID你是怎么调试的?
一般 先调好电流环->在调速度环,最后再调试位置环。
simulink下可以仿真的,3环系统有现成的模型(别人做的
) 我是直接在硬件电路上调试的呀!我用STM32产生PWM,经过驱动模块(英飞凌的BTS7960),然后接直流电机(带AB相)。位置PID,只是PID的反馈输入量是位置,设定量也是位置就可以了呀。 位置环的输出作为速度环的输入即可,主意换算关系! 没办法做到既指定速度,又指定圈数。也没必要这样做。如果是位置单闭环(2楼描述的估计是这种),只能指定圈数。如果是位置速度双闭环,要指定圈数,再指定速度最大限值,但实际速度一定是动态变化。 先做位置环,在位置环上叠加速度环。这样可以同时控制位置和速度。
具体技术和源代码,看这个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page_no=1&search_mode=3&search_text=Gorgon 回复【3楼】luozhongchao
-----------------------------------------------------------------------
能提供一个参考程序不呢?感觉自己对这个还是不熟悉的! 回复【5楼】Gorgon Meducer 傻孩子
---------------------------------------------------------------------
我现在的问题就是不知道该怎么叠加,而你提供的源代码中,没有注释,我没有理解呢!
希望师兄能讲解的清楚点,我是很菜鸟的。非常感谢。 回复【4楼】xizi 喜子
-----------------------------------------------------------------------
关键是现在老板的任务就是这样的呀!必须既指定圈数又指定速度。
还是非常感谢你。 现在问题已经解决啦!还是自己的原理不是很对的哈。其实还是有点S曲线加速的原理。
现在我的解决办法是先速度PID,再位置PID。关键点就在找到开始位置PID的位置。
关键代码:
while(1)
{
//Control_left.OwenValue =USART1_GetSpeed(Get_Data);
Current_Position= Get_Current_Position();
if(Current_Position == Control_P.OwenValue - Position_S0 )
{
Flag_S = 0; //速度PID标志
Flag_P = 1; //位置PID标志
}
if(Flag_5Ms & Flag_S) //速度PID
{
Current_Counter= Get_Counter();
if(Get_Counter() == Control_S.OwenValue)
{
Position_S0 = Get_Current_Position(); //获取速度到达设定值时的位置(位移)
}
TIM2->CCR2 = PID_calculate(&Control_S,Current_Counter/2);
Flag_5Ms = 0;
}
if(Flag_10Ms & Flag_P) //位置PID
{
Control_P.OwenValue = Control_P.OwenValue - Position_S0; //设置位置PID位置(位移)
Current_Position= Get_Current_Position();
TIM2->CCR2 = PID_calculate(&Control_P,Current_Position);
Flag_10Ms = 0;
}
}
谢谢各位的关心啦! to 【9楼】 ARMUCOS 潜行新手
解决就好。只是不知道处理出来的电机特性硬不硬。比如用手握住电机,速度是否会显著变化。 现在电机特性还是比较硬的,其实我是在吴建老师的指导下,才完成的。后来我又看了下,确实与LM629的原理类似。
非常感谢师兄的关心。 to 【11楼】 ARMUCOS 潜行新手
原来是师弟哈。代我向吴老板和胡总问好。这个算法最初是胡总在2005年想出来的。 关注位置PID和速度PID,以及它们的叠加。 好啊。楼主,我也再做电流有刷电机的位置PID 和速度PID。能不能告诉我位置PID的输出怎么和速度PID的结合起来?
位置PID的给定值怎么设置的?谢谢 楼主还在不?求位置PID和速度PID结合时,位置PID位置给定值怎么确定? 求楼主答案 mark{:biggrin:} 了解了,多谢 Gorgon_Meducer 发表于 2012-2-17 15:00 static/image/common/back.gif
先做位置环,在位置环上叠加速度环。这样可以同时控制位置和速度。
具体技术和源代码,看这个帖子
http://w ...
傻孩子老大.. 你发的论坛地址改版后不在了厄.... {:smile:} 你好,我也在学习PID,我在网上看到的c语言的实现代码,有的采样时间是固定的,是必须这样吗?
可以放在主函数里面让它一遍一遍的扫描吗? 没人回帖啦 ? 最近也在研究 位置PID与速度PID
页:
[1]