ARMUCOS 发表于 2012-2-16 20:25:18

位置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);
        }

}
期待师兄的解答……非常感谢。

823032003 发表于 2012-2-16 20:44:34

“调试了位置PID,速度PID”,位置PID你是怎么调试的?

一般 先调好电流环->在调速度环,最后再调试位置环。

simulink下可以仿真的,3环系统有现成的模型(别人做的

ARMUCOS 发表于 2012-2-16 20:51:25

我是直接在硬件电路上调试的呀!我用STM32产生PWM,经过驱动模块(英飞凌的BTS7960),然后接直流电机(带AB相)。位置PID,只是PID的反馈输入量是位置,设定量也是位置就可以了呀。

luozhongchao 发表于 2012-2-16 21:36:36

位置环的输出作为速度环的输入即可,主意换算关系!

xizi 发表于 2012-2-16 21:59:48

没办法做到既指定速度,又指定圈数。也没必要这样做。如果是位置单闭环(2楼描述的估计是这种),只能指定圈数。如果是位置速度双闭环,要指定圈数,再指定速度最大限值,但实际速度一定是动态变化。

Gorgon_Meducer 发表于 2012-2-17 15:00:48

先做位置环,在位置环上叠加速度环。这样可以同时控制位置和速度。
具体技术和源代码,看这个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page_no=1&search_mode=3&search_text=Gorgon

ARMUCOS 发表于 2012-2-17 16:08:09

回复【3楼】luozhongchao
-----------------------------------------------------------------------

能提供一个参考程序不呢?感觉自己对这个还是不熟悉的!

ARMUCOS 发表于 2012-2-17 16:17:58

回复【5楼】Gorgon Meducer 傻孩子
---------------------------------------------------------------------
我现在的问题就是不知道该怎么叠加,而你提供的源代码中,没有注释,我没有理解呢!
希望师兄能讲解的清楚点,我是很菜鸟的。非常感谢。

ARMUCOS 发表于 2012-2-17 16:20:15

回复【4楼】xizi 喜子
-----------------------------------------------------------------------

关键是现在老板的任务就是这样的呀!必须既指定圈数又指定速度。
还是非常感谢你。

ARMUCOS 发表于 2012-2-17 17:33:20

现在问题已经解决啦!还是自己的原理不是很对的哈。其实还是有点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;
        }       
}
谢谢各位的关心啦!

Gorgon_Meducer 发表于 2012-2-17 22:13:53

to 【9楼】 ARMUCOS 潜行新手
    解决就好。只是不知道处理出来的电机特性硬不硬。比如用手握住电机,速度是否会显著变化。

ARMUCOS 发表于 2012-2-18 10:22:47

现在电机特性还是比较硬的,其实我是在吴建老师的指导下,才完成的。后来我又看了下,确实与LM629的原理类似。
非常感谢师兄的关心。

Gorgon_Meducer 发表于 2012-2-20 14:53:10

to 【11楼】 ARMUCOS 潜行新手
    原来是师弟哈。代我向吴老板和胡总问好。这个算法最初是胡总在2005年想出来的。

bsz84 发表于 2012-3-6 18:56:47

关注位置PID和速度PID,以及它们的叠加。

sanmohuang 发表于 2012-6-13 15:31:44

好啊。楼主,我也再做电流有刷电机的位置PID 和速度PID。能不能告诉我位置PID的输出怎么和速度PID的结合起来?
位置PID的给定值怎么设置的?谢谢

sanmohuang 发表于 2012-6-13 16:42:55

楼主还在不?求位置PID和速度PID结合时,位置PID位置给定值怎么确定?

sanmohuang 发表于 2012-6-14 14:18:01

求楼主答案

jayzah 发表于 2013-6-6 22:54:38

   mark{:biggrin:}

song77 发表于 2013-7-26 07:50:25

了解了,多谢

mummy108 发表于 2013-8-11 22:22:58

Gorgon_Meducer 发表于 2012-2-17 15:00 static/image/common/back.gif
先做位置环,在位置环上叠加速度环。这样可以同时控制位置和速度。
具体技术和源代码,看这个帖子
http://w ...

傻孩子老大.. 你发的论坛地址改版后不在了厄....

wei_ke_hui 发表于 2013-10-3 18:33:15

{:smile:}

wei_ke_hui 发表于 2013-10-3 18:34:56

你好,我也在学习PID,我在网上看到的c语言的实现代码,有的采样时间是固定的,是必须这样吗?

wei_ke_hui 发表于 2013-10-3 18:57:33

可以放在主函数里面让它一遍一遍的扫描吗?

qs6361036 发表于 2014-9-27 00:10:36

没人回帖啦 ? 最近也在研究 位置PID与速度PID
页: [1]
查看完整版本: 位置PID与速度PID怎么叠加