爬楼梯的自行轮椅车设计(含全套CAD图纸) 下载本文

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;