• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

pic单片机+MOS数控电源,加入PI算法控制,出错

用PIC单片机的PWM驱动MOS,做一BUCK的电源;想加入PI算法,可程式总是出错,现把程式其它部分删掉;图为仿真部分电路(控制A/Dpin为1.2v)请大家帮忙看看:程式哪书写错误。

#include "pic.h

"typedef unsigned char unchar;

typedef unsigned int unint;

unint PWM_period=0,PWM_duty=0;

void main()

{typedef struct pid 

{ float setvol;//设定值 

 float pcoe;//比例系数  

float icoe;//积分系数 

 int lasterror; 

 int preerror; 

 float sumerror;

}pid; 

pid volpid,*sptr=&volpid; 

//pid *sptr;

//sptr=&volpid;

void initpid(pid *sp);

void crespid(pid *sp,int testpoint);

asm("clrwdt");

initpid(pid *sptr);// 

sptr->setvol=1.2;

while(1){crespid(pid *sptr,4);}}

/*------------增量式PI ---------*/

void initpid(pid *sp)

{sp->setvol=0; 

sp->pcoe=0.4;

 sp->icoe=0.05;//

 sp->lasterror=0;}

void crespid(pid *sp,int testpoint)

{static float temerror; 

if(sp->setvol>testpoint)

temerror=sp->setvol-testpoint;

else temerror=testpoint-sp->setvol;

{PWM_duty+=(sp->pceo)*(temerror-sp->lasterror)+(sp->iceo)*temerror;}

sp->lasterror=temerror;//把PWM—duty--部分省略

}

全部回复(3)
正序查看
倒序查看
2014-04-09 11:02
hary_wu01 我帮你推下吧,看能不能给你些帮助。
0
回复
2014-04-14 16:26
我个人觉得你最好先不加入PID现实一下,如果程序的思路或是结构都OK后再加入PID控制,这样会有助于你实验或者是开发的进度,其次还有种方法,放大你的基准信号送给单片机处理,尽量不要用浮点去让51系列的单片机,单片机处理小数是很费劲的!
0
回复
mixsall
LV.3
4
2014-04-20 00:51
你这个结构体声明元素名称和void crespid这个函数用指针调用的名称不一样啊。{PWM_duty+=(sp->pceo)*(temerror-sp->lasterror)+(sp->iceo)*temerror;}   这条算占空比的语句你和结构体声明的部分对比下。还有,写这种程序没必要非得用结构体指针。你的指针命名还不规范,你自己读的不头疼吗?离散化的pi算法最好有固定的采样时间,你这个无视采样周期,直接循环,你觉得积分能准么?testpoint我猜的如果没错的话应该是ad的采样值输入吧。你怎么写固定值了。最后你的pi算法也不对。
0
回复