修正

Dependencies:   mbed

main.cpp

Committer:
skycc6
Date:
2018-11-04
Revision:
0:61f234ae4194

File content as of revision 0:61f234ae4194:


#include "mbed.h"

#define PWM_FC1_1 PC_3
#define PWM_FC2_1 PC_2
#define PWM_FC1_2 PA_0
#define PWM_FC2_2 PA_1
#define PWM_FC1_3 PC_8
#define PWM_FC2_3 PC_6
#define PWM_FC1_4 PB_0
#define PWM_FC2_4 PB_1
#define N 19
/*#define L1 PB_5
#define L2 PB_6
#define F1 PB_9
#define F2 PB_10
#define B1 PB_7
#define B2 PB_8*/
#define uchar unsigned char 
#define uint unsigned int
Ticker timer;
InterruptIn event1(PC_1);
InterruptIn event2(PC_0);
InterruptIn event3(PA_8);
InterruptIn event4(PC_7);
/*InterruptIn event_L1(PB_5);
InterruptIn event_L2(PB_6);
InterruptIn event_F1(PB_9);
InterruptIn event_F2(PB_10);
InterruptIn event_B1(PB_7);
InterruptIn event_B2(PB_8);*/
DigitalOut PWM1_1(PWM_FC1_1);
DigitalOut PWM2_1(PWM_FC2_1);
DigitalOut PWM1_2(PWM_FC1_2);
DigitalOut PWM2_2(PWM_FC2_2);
DigitalOut PWM1_3(PWM_FC1_3);
DigitalOut PWM2_3(PWM_FC2_3);
DigitalOut PWM1_4(PWM_FC1_4);
DigitalOut PWM2_4(PWM_FC2_4);
/*DigitalIn L_1(L1);
DigitalIn L_2(L2);
DigitalIn F_1(F1);
DigitalIn F_2(F2);
DigitalIn B_1(B1);
DigitalIn B_2(B2);*/
Serial pc(PA_9, PA_10,9600);

int count = 0;
int JS=0;
int sum1=0,sum2=0,sum3=0,sum4=0;
int sum1_1=0,sum2_1=0,sum3_1=0,sum4_1=0;
int sum1_2=0,sum2_2=0,sum3_2=0,sum4_2=0;
int PWM=0;
int turn=1;
int e_1=0,e1_1=0,e2_1=0;          //pid 偏差
float uk_1=0,uk1_1=0.0,duk_1=0.0; //pid输出值
int e_2=0,e1_2=0,e2_2=0;          //pid 偏差
float uk_2=0,uk1_2=0.0,duk_2=0.0; //pid输出值
int e_3=0,e1_3=0,e2_3=0;          //pid 偏差
float uk_3=0,uk1_3=0.0,duk_3=0.0; //pid输出值
int e_4=0,e1_4=0,e2_4=0;          //pid 偏差
float uk_4=0,uk1_4=0.0,duk_4=0.0; //pid输出值
float Kp=2,Ki=2,Kd=0.9;

int out1=0,out2=0,out3=0,out4=0;;
int X=0,Y=0;
uint SpeedSet1=15;
uint SpeedSet2=15;
uint SpeedSet3=15;
uint SpeedSet4=15;
uint cnt=0;
uint Inpluse1=0,Inpluse2=0,Inpluse3=0,Inpluse4=0,num1=0,num2=0,num3=0,num4=0;       //脉冲计数
uint PWMTime1=0,PWMTime2=0,PWMTime3=10,PWMTime4=10 ;


void PIDControl1();
void PIDControl2();
void PIDControl3();
void PIDControl4();
void PWMOUT();
   
void trigger1() {
    //pc.printf("triggered!\n");
    
    Inpluse1++;
   // pc.printf("%d\n",n);
}
void trigger2() {
   
    Inpluse2++;
}
void trigger3() {
   
    Inpluse3++;
}
void trigger4() {
   
    Inpluse4++;
}
/*void trigger_L1_up() {          //    F1      L1 L2        B1
                                //     |                    |
                                //    F2                   B2
   if(turn==3||turn==4)
    { SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
   else if(turn==1)
     {X++;}
   else if(turn==2)
     {X--;}
}
void trigger_L1_down() {
   if(turn==4)
   SpeedSet1=N;
   else if(turn==3)
   SpeedSet2=N;
}
void trigger_L2_up() {
  if(turn==3||turn==4)
   {  SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
}
void trigger_L2_down() {
   if(turn==4)
   SpeedSet2=N;
   else if(turn==3)
   SpeedSet1=N;
      
}
void trigger_F1_up() {
    if(turn==1||turn==2)
    { SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
   esle if(turn==3)
      {Y--;}
   else if(turn==4)
      {Y++;}
    }
void trigger_F1_down() {
    if(turn==1)
    SpeedSet4=N;
    else if(turn==2)
    SpeedSet1=N;
    
    }
void trigger_F2_up() {
     if(turn==1||turn==2)
    { SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
    
    }
void trigger_F2_down() {
    if(turn==1)
    SpeedSet1=N;
    else if(turn==2)
    SpeedSet4=N;
    
    }
void trigger_B1_up() {
     if(turn==1||turn==2)
    { SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
    
    }
void trigger_B1_down() {
    if(turn==1)
    SpeedSet2=N;
    else if(turn==2)
    SpeedSet3=N;
    
    }
void trigger_B2_up() {
     if(turn==1||turn==2)
    { SpeedSet1=15;
      SpeedSet2=15;
      SpeedSet3=15;
      SpeedSet4=15;}
    
    }
void trigger_B2_down() {
    if(turn==1)
    SpeedSet3=N;
    else if(turn==2)
    SpeedSet2=N;
    
    }
    */
void attach(){
   
   
    cnt++;
    count++;
    if(count==20)//每0.1s处理一次脉冲
    {    
        count=0;
        JS++;
        num1=Inpluse1;
        num2=Inpluse2;
        num3=Inpluse3;
        num4=Inpluse4;
        sum1=Inpluse1+sum1;
        sum2=Inpluse2+sum2;
        sum3=Inpluse3+sum3;
        sum4=Inpluse4+sum4;
 /*if(JS==100)
       {
        pc.printf("1DJ%d\r\n",PWMTime1);
        pc.printf("2DJ%d\r\n",PWMTime2);
        pc.printf("3DJ%d\r\n",PWMTime3);
        pc.printf("4DJ%d\r\n",PWMTime4);
        pc.printf("1DJsum%d\r\n",sum1);
        pc.printf("2DJsum%d\r\n",sum2);
        pc.printf("3DJsum%d\r\n",sum3);
        pc.printf("4DJsum%d\r\n",sum4);
        JS=0;}*/
        Inpluse1=0;     //清零,为下一次计数做准备
        Inpluse2=0; 
        Inpluse3=0; 
        Inpluse4=0; 
        PIDControl1();  //调用PID控制程序
        PIDControl2();
        PIDControl3();
        PIDControl4();
    }

}
/*void Tracking()                 //    F1      L1 L2        B1
{                                       |                     |
                                  //    F2                   B2
    if(turn==1&&F_1==1&&F_2==1&&B_1==1&&B_2==1)
      
    
    }*/
void motor1(int i)
{
    if(i==1)
    {PWM1_1=PWM;
    PWM2_1=0;}
    else if(i==2)
    {PWM2_1=PWM;
    PWM1_1=0;}
    
    else if(i==3)
    {PWM1_1=PWM;
    PWM2_1=0; }
    else if(i==4)
    {PWM2_1=PWM;
    PWM1_1=0;}
    }
void motor2(int i)
{
    if(i==1)
    {PWM2_2=PWM;
    PWM1_2=0;}
    else if(i==2)
    {PWM1_2=PWM;
    PWM2_2=0;}
    else if(i==3)
    {PWM1_2=PWM;
    PWM2_2=0;}
    else if(i==4)
    {PWM2_2=PWM;
    PWM1_2=0;}
    }
void motor3(int i)
{
    if(i==1)
    {PWM1_3=PWM;
    PWM2_3=0;}
    else if(i==2)
    {PWM2_3=PWM;
    PWM1_3=0;}
    else if(i==4)
    {PWM2_3=PWM;
    PWM1_3=0;}
    else if(i==3)
    {PWM1_3=PWM;
    PWM2_3=0;}
    }
void motor4(int i)
{
    if(i==1)
    {PWM1_4=PWM;
    PWM2_4=0;}
    else if(i==2)
    {PWM2_4=PWM;
    PWM1_4=0;}
     else if(i==3)
    {PWM2_4=PWM;
    PWM1_4=0;}
    else if(i==4)
    {PWM1_4=PWM;
    PWM2_4=0;}
    }
void PWMOUT()       //50ms pwm
{
    if(cnt<PWMTime4)//若小于PWM的设定时间,则输出高电平
        {PWM=1;
        motor4(turn);
        }
    else           //否则输出低电平
        {PWM=0;
        motor4(turn);
        }
    if(cnt<PWMTime2)//若小于PWM的设定时间,则输出高电平
        {PWM=1;
        motor2(turn);
        }
    else           //否则输出低电平
        {PWM=0;
        motor2(turn);
        }
    if(cnt<PWMTime3)//若小于PWM的设定时间,则输出高电平
        {PWM=1;
        motor3(turn);
        }
    else           //否则输出低电平
        {PWM=0;
        motor3(turn);
        }
    if(cnt<PWMTime1)//若小于PWM的设定时间,则输出高电平
        {PWM=1;
        motor1(turn);
        }
    else           //否则输出低电平
        {PWM=0;
        motor1(turn);
        }
    if(cnt>25)    //超过限制清零
        cnt=0;
}

void PIDControl1()        //pid偏差计算
{
    e_1=SpeedSet1-num1;//设置速度-实际速度,两者的差值 
    //对应于增量式PID的公式Δuk=uk-u(k-1)
//  duk=(Kp*(e-e1))/100;//只调节P
    duk_1=(Kp*e_1+Ki*(e1_1+e_1)*0.01+Kd*(e_1-e1_1)/0.01);//只调节PI
//  duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/100;//调节PID
    //uk=uk1+duk;//uk=u(k-1)+Δuk
    uk_1=duk_1;
    out1=(int)uk_1;//取整后输出
   // pc.printf("wc1 %d\r\n",out1);
    if(out1>25) //设置最大限制
        {out1=25;}
    else if(out1<0)//设置最小限制
       { out1=0;}
    uk1_1=uk_1;       //为下一次增量做准备
    e2_1=e1_1;
    e1_1=e_1;
    PWMTime1=out1;  //out对应于PWM高电平的时间
  //pc.printf("pwm %d\r\n",out1);
}

void PIDControl2()        //pid偏差计算
{
    e_2=SpeedSet2-num2;//设置速度-实际速度,两者的差值 
    //对应于增量式PID的公式Δuk=uk-u(k-1)
//  duk=(Kp*(e-e1))/100;//只调节P
    duk_2=(Kp*e_2+Ki*(e1_2+e_2)*0.01+Kd*(e_2-e1_2)/0.01);//只调节PI
//  duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/100;//调节PID
    //uk=uk1+duk;//uk=u(k-1)+Δuk
    uk_2=duk_2;
    out2=(int)uk_2;//取整后输出
   // pc.printf("wc2 %d\r\n",out2);
    if(out2>25) //设置最大限制
        {out2=25;}
    else if(out2<0)//设置最小限制
       { out2=0;}
    uk1_2=uk_2;       //为下一次增量做准备
    e2_2=e1_2;
    e1_2=e_2;
   /* if((sum1-sum2)>2)
    {out2=out2+3;}
    else if((sum2-sum1)>2)
    {out2=out2-3;}*/
    PWMTime2=out2;  //out对应于PWM高电平的时间
   //pc.printf("pwm %d\r\n",out);
}
void PIDControl3()        //pid偏差计算
{
    e_3=SpeedSet3-num3;//设置速度-实际速度,两者的差值 
    //对应于增量式PID的公式Δuk=uk-u(k-1)
//  duk=(Kp*(e-e1))/100;//只调节P
    duk_3=(Kp*e_3+Ki*(e1_3+e_3)*0.01+Kd*(e_3-e1_3)/0.01);//只调节PI
//  duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/100;//调节PID
    //uk=uk1+duk;//uk=u(k-1)+Δuk
    uk_3=duk_3;
    out3=(int)uk_3;//取整后输出
   // pc.printf("wc2 %d\r\n",out2);
    if(out3>25) //设置最大限制
        {out3=25;}
    else if(out3<0)//设置最小限制
       { out3=0;}
    uk1_3=uk_3;       //为下一次增量做准备
    e2_3=e1_3;
    e1_3=e_3;
  /*  if((sum3-sum2)>2)
    {out3=out3-3;}
    else if((sum2-sum3)>2)
    {out3=out3+5;}*/
    PWMTime3=out3;  //out对应于PWM高电平的时间
   //pc.printf("pwm %d\r\n",out);
}
void PIDControl4()        //pid偏差计算
{
    e_4=SpeedSet4-num4;//设置速度-实际速度,两者的差值 
    //对应于增量式PID的公式Δuk=uk-u(k-1)
//  duk=(Kp*(e-e1))/100;//只调节P
    duk_4=(Kp*e_4+Ki*(e1_4+e_4)*0.01+Kd*(e_4-e1_4)/0.01);//只调节PI
//  duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/100;//调节PID
    //uk=uk1+duk;//uk=u(k-1)+Δuk
    uk_4=duk_4;
    out4=(int)uk_4;//取整后输出
   // pc.printf("wc2 %d\r\n",out2);
    if(out4>25) //设置最大限制
        {out4=25;}
    else if(out4<0)//设置最小限制
       { out4=0;}
    uk1_4=uk_4;       //为下一次增量做准备
    e2_4=e1_4;
    e1_4=e_4;
    /*if((sum4-sum1)>2)
    {out4=out4-3;}
    else if((sum1-sum4)>2)
    {out4=out4+5;}*/
    PWMTime4=out4;  //out对应于PWM高电平的时间
   //pc.printf("pwm %d\r\n",out);
}
int main() {
    event1.rise(&trigger1);
    event2.rise(&trigger2);
    event3.rise(&trigger3);
    event4.rise(&trigger4);
    /*event_L1.rise(&trigger_L1_up);
      event_L1.fall(&trigger_L1_down);
      event_L2.rise(&trigger_L2_up);
      event_L2.fall(&trigger_L2_down);
      event_F2.rise(&trigger_F2_up);
      event_F2.fall(&trigger_F2_down);
      event_B2.rise(&trigger_B2_up);
      event_B2.fall(&trigger_B2_down);*/
    timer.attach(&attach, 0.0005);
   
    while(1) 
    {
        PWMOUT();
  
       // pc.printf("%d\r\n",n);
        
    }
}