内容发布更新时间 : 2024/11/18 20:24:40星期一 下面是文章的全部内容请认真阅读。
PCA0CPH1=0XFF;
PCA0CN=0X40; }
void timer0() //Timer0{
SFRPAGE=0X00;
TMOD=0X02; //T0 CKCON=0X08; //T0 TH0=0XA0; //T0 TL0=TH0; ET0=0;
TR0=1; //}
void timer1() //T0{SFRPAGE=0X00;
TMOD|=0X20; // CKCON|=0X10; // TH1=0XF3; TL1=TH1; TR1=1; }
void timer2() //Timer2{
SFRPAGE=0X00;
初始化 为模式2,8位自动重载 时钟为系统时钟 赋计数初值 启动T0 作为UART0波特率发生器模式2,8位自动重载 采用系统时钟 初始化,T2计主电机脉冲 TMR2CF=0X00; //自增模式 RCAP2=0X0000; //计数初值清0 TMR2=0X0000;
TMR2CN=0X06; // T2工作在计数模式,启动T2 }
void timer3() //Timer3{
SFRPAGE=0X01; TMR3CF=0X00; RCAP3=0X0000; TMR3=0X0000; TMR3CN=0X06; }
void timer4() //T4{
SFRPAGE=0X02;
TMR4CN=0X84; // TMR4CF=0X00; //T4 RCAP4=0X389E; // TMR4=0x389e; SFRPAGE=0X00;
EIE2|=0X04; //}
void config() {
初始化与T2相同,T2计主电机脉冲初始化,定时25ms 溢出位清0,启动T4
重载计数,采用系统时钟12分频 设定时初值 允许T4中断 WDTCN=0X07; //看门狗禁止,便于系统调试 WDTCN=0XDE; WDTCN=0XAD;
SFRPAGE=0X0F; //交叉开关配置
XBR0=0X14; //将CEX0和CEX1,UART0配置到端口 XBR1=0X20; //将T2配置到端口 XBR2=0X40; //开启交叉开关配置 XBR3=0X01; //将T3配置到端口
SFRPAGE=0X0F;
P0MDOUT=0X0D; //P0口输出配置 P0=0X32;
SFRPAGE=0X0F;
CLKSEL=0X00; //采用内部晶振 OSCXCN=0X00; //关闭外部晶振电路
OSCICN=0X83; //开启内部晶振,系统时钟为内部晶振1分频 }
void main()
{uchar k1=1,k2=1; //积分项系数
int e11,e12,e13; //主电机近三次速度偏差 int e21,e22,e23; //从电机近三次速度偏差 int eu1,u1,eu2,u2; //主从电机的控制量 u1=u2=0; e11=e12=e13=0; e21=e22=e23=0;
shj=300; //将主电机速度设定为300 shd=shj*5/3; //300转时的控制参数 T1=8; T2=8; Td1=2; Td2=1; Ti1=Ti2=32; Kp1=0.3; Kp2=0.3;
A12=-1-2*Td1/T1; // A22=-1-2*Td2/T2; A13=Td1/T1; A23=Td2/T2;
config(); // pwm_set(); timer0(); timer1(); timer2(); timer3(); timer4();
EA=1; //
while(1) // {
if(j==1) //运算系数 初始化 开启中断 主循环 判断是否运算
{j=0;
e11=e12; //计算主电机的最近三次偏差 e12=e13; e13=shd-cesu1;
e21=e22; //计算主电机的最近三次偏差 e22=e23;
e23=cesu1-cesu2;
if((e13>300)||(u1==255)&&(e13>0)) k1=0; //判断主电机运算是否积分饱和 else k1=1;
if((e23>200)||(u2==255)&&(e23>0)) k2=0; //判断主电机运算是否积分饱和 else k2=1;
if((e13>2)||(e13<-2)||(e13-e12>2)||(e12-e13>2)) //计算主电机控制量 { A11=1+k1*T1/Ti1+Td1/T1;
eu1=(A11*e13+A12*e12+A13*e11)*Kp1; u1+=eu1;
if(u1>255) u1=255; if(u1<0) u1=0; SFRPAGE=0X00; PCA0CPH0=~u1; }
if((e23>2)||(e23<-2)||(e13-e12>2)||(e12-e13>2)) //计算主电机控制量 { A21=1+k2*T2/Ti2+Td2/T2;
eu2=(A21*e23+A22*e22+A23*e21)*Kp2; u2+=eu2;
if(u2>255) u2=255;