if (fabs( val: PID->error) > PID->excepted) { 9 98 idx = 0; } else { idx = 1; PID->integral += PID->error;
时间: 2023-07-15 21:11:53 浏览: 86
这段代码是一个简单的PID控制器的实现。它包括一个误差(error)、积分(integral)和期望值(expected)。首先,它判断误差是否大于期望值的绝对值,如果是,则将idx赋值为0,否则赋值为1。然后,无论idx的值是0还是1,都会将误差累加到积分中。这个控制器的逻辑是:如果误差太大,就停止控制,否则继续调整控制器的输出。
相关问题
具体注释以下代码void PID_init(PID * pp) { memset(pp, 0, sizeof(PID));//memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 } float PID_realize(PID *pp, float NextPoint,float SetPoint) { float index; pp->Set = SetPoint; pp->Actual = NextPoint; pp->err = pp->Set - NextPoint; if(fabs(pp->err)>1000) //8.00 变积分过程 { index=0.0; }else if(fabs(pp->err)<200){ //2.00 index=1.0; pp->integral+=pp->err; }else{ index=(1000-fabs(pp->err))/800; pp->integral+=pp->err; } pp->out = pp->Kp*pp->err + index*pp->Ki*pp->integral + pp->Kd*(pp->err-pp->err_last); pp->err_LastLastlast = pp->err_Lastlast; pp->err_Lastlast = pp->err_last; pp->err_last = pp->err; return pp->out; } float LowTemPID_realize(PID *pp, float NextPoint,float SetPoint) { float index; pp->Set = SetPoint; pp->Actual = NextPoint; pp->err = pp->Set - NextPoint; if(fabs(pp->err)>200) //1.00 变积分过程 { index=0.0; pp->integral = 0; }else if(fabs(pp->err)<50){ index=1.0; pp->integral+=pp->err; }else{ index=(200-fabs(pp->err))/150; pp->integral+=pp->err; } pp->out = pp->Kp*pp->err + index*pp->Ki*pp->integral + pp->Kd*(pp->err-pp->err_last); pp->err_LastLastlast = pp->err_Lastlast; pp->err_Lastlast = pp->err_last; pp->err_last = pp->err; return pp->out; }
这段代码实现了一个PID控制器。PID控制器是一种常用的控制器,其全称为比例-积分-微分控制器。它根据被控对象的反馈信号与给定值之间的误差,通过比例、积分和微分三个部分的组合来调节被控对象的输出,最终达到控制目标的效果。
在这段代码中,PID_init函数是用于初始化PID结构体的函数,使用了memset函数将其全部置为0。PID_realize和LowTemPID_realize函数则分别实现了PID控制器的两个不同模式的控制,分别是普通模式和低温模式。两个函数的参数包括PID结构体指针、当前值和设定值。其中,变量index用于根据误差的大小来动态调整积分项的系数,即变积分过程。最后,函数返回PID控制器的输出值pp->out。
Polylist AddPolylist() { Polylist A=NULL, B=NULL, C=NULL, p=NULL, q=NULL, r=NULL; A=CreatePolylist(); B=CreatePolylist(); InitPolylist(&C); p=A; q=B; while(p!=NULL && q!=NULL) { if(p->exp<q->exp) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=q->coef; r->exp=q->exp; r->next=C; C=r; q=q->next; } else { if(p->exp==q->exp) { if(fabs(p->coef + q->coef)>1e-6) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef+q->coef; r->exp=p->exp; r->next=C; C=r; } p=p->next; q=q->next; } else { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef; r->exp=p->exp; r->next=C; C=r; p=p->next; } } } while(p!=NULL) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=p->coef; r->exp=p->exp; r->next=C; C=r; p=p->next; } while(q!=NULL) { r=(Polylist)malloc(sizeof(Polynode)); r->coef=q->coef; r->exp=q->exp; r->next=C; C=r; q=q->next; } return C; }
这段代码实现了两个多项式相加的操作,其中Polylist是一个链表结构,每个节点包含一个系数和指数。代码首先调用CreatePolylist函数分别创建了两个多项式链表A和B,然后初始化结果链表C为空。接下来使用p和q指向A和B的头节点,依次遍历两个链表的每个节点,根据节点的指数大小关系进行不同的操作。
如果A的当前节点的指数小于B的当前节点的指数,则将B的当前节点的系数与指数插入到结果链表C的头部,并将q指向下一个节点。
如果A的当前节点的指数等于B的当前节点的指数,则将A和B的当前节点的系数相加,判断和是否不为0,如果不为0,则将和与指数插入到结果链表C的头部,并将p和q指向下一个节点。
如果A的当前节点的指数大于B的当前节点的指数,则将A的当前节点的系数与指数插入到结果链表C的头部,并将p指向下一个节点。
当其中一个链表遍历完毕后,将另一个链表中剩余的节点插入到结果链表C的头部。
最后返回结果链表C。
阅读全文