欢迎来到天天文库
浏览记录
ID:25123180
大小:55.79 KB
页数:8页
时间:2018-11-18
《PID有效控制步进电机转速仿真及c程序.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、PID控制步进电机转速仿真及c程序#include#include"lcd1602.h"sfrT2MOD=0x0c9;#defineucharunsignedchar#defineuintunsignedintsbitQ0=P2^4;sbitQ1=P2^5;sbitQ2=P2^6;sbitQ3=P2^7;sbitPWM=P1^7;sbitUP=P1^0;sbitDOWM=P1^1;sbitGORB=P2^3;//换相sbitADDSPEED=P1^2;sbitSUBSPEED=P1^3;uinttuint=65535;uinttpwm=1;//pwm周期为1000
2、0ustpwm变量表示pwm高电平时间,也相当于占空比(仿真时,频率高时,电机反应慢。在实物上要加大频率)uchart1_flag=0;uintpulse=0;uintt0_flag=0;uchart2_flag=0;bitt2_over=0;bitJust_Get=1;#defineZZ{Q0=0;Q1=0;Q2=1;Q3=1;}//正转#defineFZ{Q0=1;Q1=1;Q2=0;Q3=0;}//反转#defineSTOP{Q0=1;Q1=0;Q2=1;Q3=0;}//停止//禁止出现Q0=0;Q1=1;Q2=0;Q3=1;不然会烧掉mos管//**************
3、**********PID*************************************floatnow=0,bef=0,bbef=0;//本次采样值,上次采样值,上上次采样值floaterr_now,err_bef,err_bbef;//当前偏差,上次偏差,上上次偏差floaterror_add=0;//所有偏差之和floatset=25;//设定值floatkp=25;floatki=25;floatkd=0;//*****************************************************************voiddelayms(
4、uintms)//延时?个ms{uchara,b,c;while(ms--){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}}voidtimer_init(){EA=1;ET0=1;ET1=1;ET2=1;TMOD=0x15;//定时器0计数模式定时器1模式1T2MOD=0x01;TH0=TL0=255;TH2=0x3C;TL2=0xB0;//50MS}voidtimer1()interrupt3{if(t1_flag==0){t1_flag=1;PWM=1;TH1=(tuint-tpwm+1)/256;TL1=(tuint
5、-tpwm+1)%256;}else{t1_flag=0;PWM=0;TH1=(tuint-10000+tpwm+1)/256;TL1=(tuint-10000+tpwm+1)%256;}}voidtimer0()interrupt1{TH0=TL0=255;t0_flag++;}voidtimer2()interrupt5{TF2=0;TH2=0x3C;TL2=0xB0;//50MSt2_flag++;if(t2_flag==2){TR0=0;TR2=0;t2_flag=0;t2_over=1;//表示100ms时间到}}voidGetPulse(){t0_flag=0;t2_f
6、lag=0;TH0=TL0=255;TH2=0x3C;TL2=0xB0;//50MSTR0=1;TR2=1;}intPID()//增量式PID{intchange;err_now=set-now;err_bef=set-bef;err_bbef=set-bbef;change=kp*(err_now-err_bef)+ki*err_now+kd*(err_now-2*err_bef+err_bbef);/*if(set>=now){if(set-now>1)change=kp*(err_now-err_bef)+ki*err_now+kd*(err_now-2*err_bef+er
7、r_bbef);elsechange=0.2*kp*(err_now-err_bef)+0.5*ki*err_now+kd*(err_now-2*err_bef+err_bbef);}elseif(now>set){if(now-set>1)change=kp*(err_now-err_bef)+ki*err_now+kd*(err_now-2*err_bef+err_bbef);elsechange=0.2*kp*(err_now-err_bef)+0.5*ki*e
此文档下载收益归作者所有