C语言描述PID算法程序_第1页
C语言描述PID算法程序_第2页
C语言描述PID算法程序_第3页
C语言描述PID算法程序_第4页
C语言描述PID算法程序_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#in clude #in clude #in clude /void PIDI nit(PID *PP);/*定义结构体和公用体*/#defi ne N 8typedef struct PIDun sig ned int setpo int;/*设定值*/un sig ned int proporti on;/*比例系数*/un sig ned int in tegral;/*积分系数*/un sig ned int derivative;/*微分系数*/un sig ned in t lasterror;/*前一拍误差*/un sig ned int preerror;/*前两拍误差*/P

2、ID;union stuun sig nedint value;un sig ned char nu m2;laser;union datun sig ned char dd2;un sig ned int nu mber;collect;/*函数声明部分*/un sig ned int PIDcal(PID *pp,i nt thiserror);void PIDI nit(PID *PP);void Port In it(void);un sig ned int get_ad(void);un sig ned int filter_valve(void);void Delayms(void

3、);/*主函数部分*/void mai n(void)PID vPID;/*定义结构体变量名*/un sig nedint verror;un sig nedint Error;un sig nedint tempi;unsignedchar LASERH,LASERL; /* 误差的高低字节变量 */WDTCN=Oxde;WDTCN=Oxad;/port in it();PIDI nit(&vPID);vPID.proportion=10;/* 设置 PID 比例系数为 10*/vPID.integral=10;/*设定 PID 积分系数 为 10*/vPID.derivative=10;

4、/* 设定 PID 微分系数为 10*/ vPID.setpoi nt=50;/*根据实际情况设定*/IE= 0x80;while(1)verror=filter_valve(); /* 得到 AD 的滤波输出值 */Error=vPID.setpoint-verror; /* 得到误差值 */ tempi=PIDcal(&vPID,Error); /* 调用PID算法函数得到误差增量*/ laser.value+=tempi;LASERH=laser.num0; /*value 与 num2为共同体,变量名为laser*/LASERL=laser.num1; /* 存放高低字节 */*PID

5、算法函数,返回误差增量*/un sig ned int PIDcal(PID *pp, int thisError)un sig ned int pError,dError,iError;un sig ned int templ;pError=thisError-pp-lasterror;iError=thisError;/*增量计算*/dError=thisError-2*(pp-lasterror)+pp-preerror;templ=pp-proporti on *pError+pp-in tegral*iError+pp-derivative*dError; pp-preerror=p

6、p-lasterror;/* 存放误差用于下次运算 */pp-lasterror=thisError;return (i nt)(templ8);/*测量值*/*float measure(void)/* COSA=1/7/*long float value;已知A B角为锐角SIN(A+B)=14分之5倍根号3 */* 求 COSB*/ /*float A,B;A=acos(1/7);B=asi n( (5/14)*sqrt(3)-A;if(0Api/2)&(0Bpi/2) return cos(B); */*得到ADC转换值*/un sig ned int get_ad(void)whil

7、e(AD0INT=0);AD0INT=0;collect.dd1=ADC0H;collect.dd0=ADC0L;return (collect .nu mber);void Timer3_ISR(void) in terrupt 14TMR3CN=0x7f;AMUX0SL=0x00;AD0BUSY=1;void Timer3_ In it( un sig ned char Highco un ts, un sig ned char Lowco un ts)TMR3CN=0x01;/*禁止定时器3;清TF3,采用SYSCLK为时基*/TMR3RLH=-Highcounts; /* 初始化重装载

8、值 */TMR3RLL=-Lowcou nts;TMR3L=0xff; /*设置为立即重装在*/TMR3H=0xff;EIE2|= 0x01;/*允许定时3中断*/TMR3CN|=0x06;/* 启动定时器 3*/void ADCI ni t(void)ADC0CF=0x00;/*选择ADC0的转换始终为系统时钟,增益为 1*/ADC0CN=0xc0; /*允许ADC0准备转换,定义低功耗跟踪方式,置AD0BUSY 位为1启动ADC,寄存器数据右对齐*/AMX0CF=0x01;/*选择AIN0和AIN!为通道0差分输入的正负端*/*PID初始化*/void PIDI nit(PID *PP)m

9、emset(PP,0,sizeof(PID);/*数字算术滤波子程序*/un sig ned int filter_valve(void)un sig ned char i,j,temp;un sig ned char count;un sig ned int valve_bufN;un sig ned int sum=0;for(co un t=0;co un tN;co un t+)valve_bufco un t=get_ad();Delayms();for(j=0;jN-1;j+) for(i=0;ivalve_bufi+1)temp=valve_bufi; valve_bufi=valve_bufi+1; valve_bufi+1=temp;for(co un t=1;co un tN-1;co un t+)sum+=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论