关于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算法只是加快当前值稳定到设定值的时间而已,计算得到的值肯定是发送给控制部分的,如果你的温度是与某个电流值有关,其实你结算到的就是这个电流的调整量,通过硬件电路使电流收敛于所需的数值上
[解决办法]
同求怎么用!!