打印

PID算法问题:PI离散后,编程序遇到的问题,算出的误差如何与输

[复制链接]
6452|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snakeemail|  楼主 | 2008-2-1 13:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用增量法离散PI,控制pwm,实现对逆变器的控制.
u(k) = u(k-1) + Kp* (1 + Ki*Tsample*error[k]) - Kp * error[k-1]
u(k-1)就是上次的PWM输出值, 
问题是后面两项Kp* (1 + Ki*Tsample * error[k]) - Kp * error[k-1]  --Q28格式
和error有关的项如何变成和PWM对应的值呢?
后两项是Q28的值,我的pwm是16bit的,我应该如何对应呢?

相关帖子

沙发
工控秀才| | 2008-2-2 10:03 | 只看该作者

你这是PD吧

不是PI哟,乘以一个对应的系数,转换成你的16位结果,

使用特权

评论回复
板凳
snakeemail|  楼主 | 2008-2-2 10:23 | 只看该作者

这是PI呀?这是推导出的增量法,楼上的兄弟你说说哪里错了

问题2:你说的“乘以一个对应的系数,转换成你的16位结果,” , 这个对应的系数如何来呀?

使用特权

评论回复
地板
soso| | 2008-2-2 13:27 | 只看该作者

系数一般是先估算,然后试出来的

PID 应该是
PWM = Base_PWM + Kp * Error + Ki * Total_Error + Kd * Delta_Error

Base_PWM 是没有负载的时候需要输出的最小 PWM 值。系数 Kp,Ki,Kd 等可以从小到大先Kp后Ki最后Kd逐步试出来一组比较满意的结果。

使用特权

评论回复
5
xuyaqi| | 2008-2-2 13:36 | 只看该作者

因牵扯积分调节在控制开始时你得假设“pwm”在 50% 位置,16位的话在应在一半“32768”。后边你根据算出的增量,通过转换因子变为“pwm”的增量,在32768的基础上增减。

使用特权

评论回复
6
snakeemail|  楼主 | 2008-2-2 13:51 | 只看该作者

Base_PWM??

Base_PWM 是没有负载的时候需要输出的最小 PWM 值??
不是太明白。如果你是控制电机,那么就算电机不带负载,他也是需要pid调节的,靠的是误差和上一次的输出控制值,为什么还要个最小pwm值.

使用特权

评论回复
7
yewuyi| | 2008-2-2 16:24 | 只看该作者

怎么总有人问这个问题?

使用特权

评论回复
8
soso| | 2008-2-3 02:43 | 只看该作者

Base_PWM

Base_PWM 就是在空负载或者负载固定的时候,驱动负载需要输出的最小 PWM. 

这一是考虑到执行机构有死区,二是给 PID 调节提供一个出发点。

使用特权

评论回复
9
snakeemail|  楼主 | 2008-2-3 20:21 | 只看该作者

好吧,yewuyi,问个没人问过的问题

我的控制是双环控制的,一个电压外环,一个电流内环,电流内环比电压快一倍,问题:当电压外环中断时,我如何计算此时的PWM值,电压的误差经过PI补偿计算后,如何与内部的电流环接口呢?
问题2:johnxliu,我认为增量算法中是没有basePWM的,因为设置的参考值和采样值肯定会不一样,就算空载也一样,也许你是位置PI吧

使用特权

评论回复
10
snakeemail|  楼主 | 2008-2-6 23:52 | 只看该作者

如何实现PID控制UK值与PWM占空比对应

看到有不少人问到底如何让UK值与PWM占空比值对应,进而实现占空比输出和输出控制电压对应。
 
(注意,我这里讨论的前提是输出控制的是电压,不是PWM方波。PWM输出后要经过滤波整形再输出控制。)
前提条件:
输出电压控制电压范围是0-10V。
给定、反馈、输出电压采样输入电压范围是0-5V(经过运放)。
使用单片机AD为10位AD芯片。
那么10位AD芯片电压采集得到的数据范围就是0-1024。
PWM为 8位可调占空比方波,0对应输出占空比为0的方波,255对应输出占空比100%的方波,127对应输出50%的方波。
 
比如当前给定是2.5V,反馈电压是1V。(KP,KI,KD等系数略,关于PID算法的整数实现我在前文中有论述如何实现)。
 
那么经过AD采样
1、给定2.5V对应为 512
2、反馈1V对应为 205
假定经过PID计算得到的UK为400
也就意味着输出电压应当为(400*(UPWM峰值电压))/1024
 
那么UK对应的PWM占空比是多少呢?
我们知道,UK=1024对应占空比为100,也就是PWM的占空比系数为255。可知,PWM系数 = UK/4;
那么400就应当对应系数 400/4=100。
也就是输出电压=400*10/1024=3.9V
 
同时,由于采样精度以及PWM输出占空比精度控制的问题,将导致输出电压和期望值不是那么线性,所以,我在项目内加入了输出电压采样的控制。
 
采样AD输入为0-5V,所以,对于输出0-10V有一个缩小的比例。
输出10V则采样值对应为255
输出5V则采样之对应127
可知,3.9V对应AD结果为97
采样输出电压值,可以针对性的调整一下占空比输出,从而得到误差允许范围内的一个控制输出电压。
 
同时,经过一些加速控制的手段。可以比较迅速的达到控制的目的。
下文中的UK控制方法是针对增量式PID控制而来做的。
/****************************************************/
void    PWMProcess(void)
{
    uint16 idata temp;
    uint16 idata UKTemp;
 temp = 0;
    UKTemp = 0;
    
    if( Pwm.ChangeFlag_Uint8 != 0 )   //判断是否需要改变占空比
 {                  //是否需要改变占空比和你的被控系统特性有关
     Pwm.ChangeFlag_Uint8 = 0;
        
  UKTemp = PID.Uk_Uint16 + SwIn.AddValue_Uint16;   
 //计算UK控制量
 //控制量和计算值以及一个开关量有关,我这里的开关量是系统需要的时候叠加在控制量上的一个变量。
  if(UKTemp>999)
  {
            UKTemp = 999;
  }
//这里只所以是999封顶而不是1024是因为我的系统PWM的峰值电压是12V导致。
        while(1)                        //如果输出电压和期望电压相差 Delta,则继续调整占空比,直到在误差以内
        {
      ADChPro(UPWMADCH);          //测量输出电压
   if( ADPool.Value_Uint16[UPWMADCH] == UKTemp)
   {
                return;
   }
   if( ADPool.Value_Uint16[UPWMADCH] > UKTemp)   //如果当前电压大于输出电压,减小占空比
   {
       if( ( ADPool.Value_Uint16[UPWMADCH] - UKTemp ) > UDELTA )
    {
        temp = ADPool.Value_Uint16[UPWMADCH] - UKTemp;  //
     temp = temp / 2;       //下降可以加速下降,所以下降参数加倍
     if( Pwm.DutyCycle_Uint8 > temp )
     {
                        Pwm.DutyCycle_Uint8 = Pwm.DutyCycle_Uint8 - temp;
     }
     else
     {
                        Pwm.DutyCycle_Uint8 = 0;
     }
    }
    else
    {
                    return;
    }
   }
   else           //如果当前电压小于输出电压
   {
       if( ( UKTemp - ADPool.Value_Uint16[UPWMADCH] ) > UDELTA )
    {
        temp = UKTemp - ADPool.Value_Uint16[UPWMADCH];
     temp = temp / 4;  //上升处理不要超调,所以每次只+一半
     if( (255-Pwm.DutyCycle_Uint8) > temp )
     {
                        Pwm.DutyCycle_Uint8 += (temp/2);
     }
     else
     {
                        Pwm.DutyCycle_Uint8 = 255;
     }
    }
    else
    {
                    return;
    }
   }
            DisPlayVoltage();
            PWMChangeDuty(Pwm.DutyCycle_Uint8);  //改变占空比
   Delay(10,10);

        }
 }
}

使用特权

评论回复
11
xinjie1023| | 2010-9-26 21:08 | 只看该作者
细细学习

使用特权

评论回复
12
highgear| | 2010-9-26 21:22 | 只看该作者
又见灯丝挥动洛阳铲。

我不建议用pid 增量式算法。因为 1 + Ki*Tsample*error[k] 不适合做定点运算(Tsample 太小), 另一方面也没有简化运算, 甚至还多一些。

使用特权

评论回复
13
vifuture| | 2010-9-26 21:41 | 只看该作者
收藏了。。

使用特权

评论回复
14
cabbageybc| | 2010-10-4 10:06 | 只看该作者
:)讲的太好了 snakeemail 学习了

使用特权

评论回复
15
cainiao09| | 2010-10-5 11:23 | 只看该作者
学习了

使用特权

评论回复
16
yiqifei| | 2015-4-28 12:51 | 只看该作者
学习了

使用特权

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

本版积分规则

547

主题

1910

帖子

8

粉丝