打印

PID控制电机

[复制链接]
7173|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gjj248|  楼主 | 2013-4-20 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PID控制电机,有以下几个问题:
1.PID子程序出来的结果是什么?
2.是不是通过PID子程序出来的结果和占空比建立关系,从而来控制电机速度。如果是这样的话,请问PID子程序出来的结果是如何和占空比建立关系的?
沙发
airwill| | 2013-4-20 18:24 | 只看该作者
PID子程序出来的结果就是占空比

使用特权

评论回复
板凳
hawksabre| | 2013-4-20 20:04 | 只看该作者
补充一点知识点    PID(比例-积分-微分)控制器作为最早实用化的控制器已有70多年历史,现在仍然是应用最广泛的工业控制器。PID控制器简单易懂,使用中不需精确的系统模型等先决条件,因而成为应用最为广泛的控制器。
PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)与输出u (t)的关系为
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt] 式中积分的上下限分别是0和t
因此它的传递函数为:G(s)=U(s)/E(s)=kp[1+1/(TI*s)+TD*s]
其中kp为比例系数; TI为积分时间常数; TD为微分时间常数

使用特权

评论回复
地板
hawksabre| | 2013-4-20 20:19 | 只看该作者
PID的控制   比较经典的算法   http://baike.baidu.com/view/262316.htm  这是我找到的讲解比较详细的教程

使用特权

评论回复
5
hawksabre| | 2013-4-20 20:21 | 只看该作者
PID的控制   比较经典的算法   http://baike.baidu.com/view/262316.htm  这是我找到的讲解比较详细的教程

使用特权

评论回复
6
gjj248|  楼主 | 2013-4-20 22:21 | 只看该作者
airwill 发表于 2013-4-20 18:24
PID子程序出来的结果就是占空比

PID控制电机,可是程序运行后电机转速实际值基本是一个定值,没有随时间趋近与转速设定值,请问是PID子程序的问题吗,还是其他问题?
这是我的PID子程序
unsigned int PID_Cal(unsigned int CurrentPoint)
{  
    SetPoint=Speed_Set;
    Error = SetPoint -  CurrentPoint;                  // 偏差     
    SumError += Error;                                // 积分     
    out=Proportion * Error                     // 比例项     
    + Integral * SumError                    // 积分项  
    return out;                          
}   

out相当于占空比
TIM1->CCR1=out;   
TIM1->CCR2=out;
TIM1->CCR3=out;

TIM_OCInitStructure.TIM_Pulse = out;

使用特权

评论回复
7
airwill| | 2013-4-20 23:01 | 只看该作者
加大 Proportion 试试, 先加得大一点, 别怕超调

使用特权

评论回复
8
airwill| | 2013-4-20 23:01 | 只看该作者
本帖最后由 airwill 于 2013-4-21 21:28 编辑

加大 Proportion 试试, 先加得大一点, 别怕超调, 另外验证一下算法, 有没有溢出的问题. 必须要避免

使用特权

评论回复
9
gjj248|  楼主 | 2013-4-21 21:20 | 只看该作者
airwill 发表于 2013-4-20 23:01
加大 Proportion 试试, 先加得大一点, 别怕超调

应该不是成熟的问题。把PID子程序改成了增量式,占空比PWMOUT还是没有变化,由于Period = 749,所以PWMOUT的范围应该是0到749吧,请问是什么原因?
unsigned int IncPID_Cal(unsigned int CurrentPoint)
{  
    SetPoint=Speed_Set;
    Error = SetPoint - CurrentPoint;                     
    out=Proportion * Error                        
    - Integral * LastError                  
    + Derivative * PrevError;
     PrevError = LastError;     
     LastError = Error;                                           
     return out;
}
/*计算占空比*/
PWMOUT += IncPID_Cal(Actual_Speed);
if(PWMOUT>749)
{
  PWMOUT=749;
}
else if(PWMOUT<0)
{
PWMOUT=0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

27

帖子

0

粉丝