首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于PID的有关问题

2012-12-14 
关于PID的问题!#include REG51.H#include ABSACC.H#include STRING.H#include STDIO.H#includeMA

关于PID的问题!
#include <REG51.H>    
#include <ABSACC.H>    
#include <STRING.H>    
#include <STDIO.H>    
#include<MATH.H>    
   
sbit ADC_INT = P3^2;   
code unsigned char Tab[10] ={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90};   
typedef struct   {   
                   
                        double  SetPoint;           /*  设定目标 Desired Value */   
                   
                        double  Proportion;         /*  比例常数 Proportional Const */   
                        double  Integral;           /*  积分常数 Integral Const */   
                        double  Derivative;         /*  微分常数 Derivative Const */   
                   
                        double  LastError;          /*  前一项误差 */    
                        double  PrevError;          /*  前第二项误差 */   
                        double  SumError;           /*  总误差 */   
                       
                    } PID;   
unsigned char sensor () ;                            /*  传感器返回信号数据 **/   
void actuator(unsigned char rDelta);                 /*  执行机构函数 */   
void Delay(unsigned char t);   
void display(unsigned char rIn);   
   
/****************************************************************************  
   PID计算部分  


****************************************************************************/   
   
double PIDCalc( PID *pp, double NextPoint )   
{   
    double  dError,Error;   
   
        Error = pp->SetPoint -  NextPoint;          /* 计算当前偏差 */   
        pp->SumError += Error;                      /* 积分《总偏差》*/   
        dError = pp->LastError - pp->PrevError;     /* 当前微分 */   
        pp->PrevError = pp->LastError;   
        pp->LastError = Error;                       /*  三个误差值移位 */    
        return(NextPoint+pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError  );                                         /*《返回总的误差值》*/   
}   
   
/*******************************************************************************  
   主函数部分  
********************************************************************************/   
void main(void)   
{   
    PID                 sPID;                       /*  定义PID结构体变量 */   
    double              rOut;                       /*  PID 响应输出 */   
    unsigned char       rIn;                        /*  PID 反馈 (Input) */   
    double              x;   
    sPID.Proportion = 0.74;                         /*  设置 PID 比例系数 */   
    sPID.Integral   = 0.70;                         /*  设置PID积分系数 */   
    sPID.Derivative = 0.0;                          /*  设置PID微分系数 */   


    sPID.SetPoint   = 2.0;                          /*  设置 PID 输出值 */   
   
   
    for (;;)    
    {          
        unsigned char      sumout;   
                                            /*  PID进入循环检测状态中 */   
        unsigned char i;   
        rIn = sensor ();                            /*  读传感器输出 */   
        for(i=0;i<50;i++)   
        display(rIn);    
        x = 5.0 * (double)rIn / 256.0;     
        rOut = PIDCalc ( &sPID,x );                 /*  计算PID 输出 */   
        sumout=rOut*256/5;   
        actuator ( sumout );                            /*  将要反馈的数据输出 */   
    }   
}   
   
   
/*******************************************************************************  
程序名称:8位并行D/A芯片DAC0832  
*********************************************************************************/     
void actuator(unsigned char rDelta)   
{   
       
    XBYTE[0xA000] = rDelta;   
    Delay(10);   
}   
   
    
/*******************************************************************************  
函数:Delay()  
功能:延时0.01s~2.56s  
参数:t>0时,延时(t*0.01)s  
      t=0时,延时2.56s  
说明:定时10ms的定时器初值=65536-0.01/(1/(f/12)),其中f为晶振频率  
*******************************************************************************/   
void Delay(unsigned char t)   
{      
    TMOD &= 0xF0;   
    TMOD |= 0x01;   
    EA=1;   
    EX0=1;   
    do   
    {   
        TH0 = 0xee;                             /* 设置定时器初值(定时5ms)*/   


        TL0 = 0x00;   
        TR0 = 1;                                /* 启动定时器 */   
        while ( !TF0 );                         /* 等待定时器溢出 */   
        TR0 = 0;                                /* 停止定时器 */    
        TF0 = 0;                                /* 清除溢出标志 */   
    } while ( --t != 0 );                       /* 循环t次 */   
}   
   
   
unsigned char sensor (void)    
{   
    unsigned char v;   
    Delay(30);   
    XBYTE[0xB000] = 0xFF;                       /* 启动A/D转换 */   
    Delay(1);   
    while ( ADC_INT );                          /* 等待A/D转换完毕 */   
    v = XBYTE[0xB000];                          /* 读取A/D转换结果 */   
    return (v);   
}   
   
void display(unsigned char rIn)   
{   
    float num;   
    int N;   
    num=5.0*rIn/256;   
    N=(int)(num*1000.0);   
    XBYTE[0x8000]=0x08;   
    XBYTE[0x9000]=Tab[N/1000]&0x7f;   
    Delay(1);   
    XBYTE[0x8000]=0x04;   
    XBYTE[0x9000]=Tab[N%1000/100];   
    Delay(1);   
    XBYTE[0x8000]=0x02;   
    XBYTE[0x9000]=Tab[N%100/10];   
    Delay(1);   
    XBYTE[0x8000]=0x01;   
    XBYTE[0x9000]=Tab[N%10];   
    Delay(1);}

我算出的PID是干嘛用的啊,输出给谁呢??不明白PID到底是怎么用的?如果我设定温度需要100度,当前读到的是99度,我计算PID如果是102度,我应该怎么做呢??
------解决方案--------------------


有三个相关参数,
1 给定值
2 过程变量值
3 输出值

PID算出的是输出值,输出到影响过程变量值变化的因素上
[解决办法]
楼上的兄弟,我不是很理解你的意思?输出到影响过程变量值变化的因素上-----这句话的意思是如果我用继电器控制加热电源的开关,如果我读到了102度的话,表示需要关闭电源了?是这个意思吗???
[解决办法]
有点像,如一个水池,你输出值给电机,PV值是你收到的液位值,当你的设定液位值与PV值有差异时,你PID算出的值给电机抽水,液位差得越多,PID算出越大电流给电机加快抽水,当达到设定液位时,这时可能PID算出的电流值就很小了.
[解决办法]
PID是控制输出的,

比如 设定目标温度为 Tx, 
当前  输出功率为 Pi , 实测温度为 Ti,
      那么偏差  Ei = Tx-Ti
               PID = ...
下一刻输出功率为   Pi+1 = Pi + PID  //就是干这个用的

这样,你就可以用PID方法将实际温度控制在 Tx 附近.
[解决办法]
学习了
[解决办法]
楼主应该去看下自动控制哦
[解决办法]
自动控制理论,讲的很明白了。
[解决办法]
学习了,我也要去看看控制理论了
[解决办法]
不是这个意思!输入(温度信号)-期望--->PID运算---->输出(电机、阀门...)
PID就是来计算多大的误差应该给出多大的输出!
[解决办法]
你采用PID算法是为了尽快将现有值收敛于设定值上
你现在检测的温度值,MCU将计算后的调整数据发送给控制温度的那个电路模块,迅速做出调整

控温电路,一般都是一个数字反馈环,PID算法只是加快当前值稳定到设定值的时间而已,计算得到的值肯定是发送给控制部分的,如果你的温度是与某个电流值有关,其实你结算到的就是这个电流的调整量,通过硬件电路使电流收敛于所需的数值上

[解决办法]
同求怎么用!!

热点排行