generate pwm to control dc motor using lmd18200t like power stage

Dependencies:   mbed

main.cpp

Committer:
exarkun
Date:
2017-10-06
Revision:
0:d550b3f8c46b

File content as of revision 0:d550b3f8c46b:

#include "mbed.h"
#include <string>


Serial device(p9, p10);  // tx, rx
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

float a=0;
float b=0;
float c=0;
float d=0;
float e=0;
float f=0;

//void init_moteur_1a6()
//{
    
//affectation pin frein moteur 
DigitalOut frein_moteur1(p5); 
DigitalOut frein_moteur2(p6); 
DigitalOut frein_moteur3(p7); 
DigitalOut frein_moteur4(p8); 
DigitalOut frein_moteur5(p11); 
DigitalOut frein_moteur6(p12); 

//affectation pin sens rotation moteur
DigitalOut sens_rotation_moteur1(p13); 
DigitalOut sens_rotation_moteur2(p14);
DigitalOut sens_rotation_moteur3(p27); 
DigitalOut sens_rotation_moteur4(p28);
DigitalOut sens_rotation_moteur5(p29); 
DigitalOut sens_rotation_moteur6(p30);

//affectation pin pwm
PwmOut PWM1(p21);
PwmOut PWM2(p22);
PwmOut PWM3(p23);
PwmOut PWM4(p24);
PwmOut PWM5(p25);
PwmOut PWM6(p26);



//};

/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur1                    //
/////////////////////////////////////////////////////////////////////////////

void motor1_mouve(float Vmax1,int T11,int sens_rotation1,int frein1)
{
    
//////////////////////////
//initialisation moteur //
//////////////////////////
    
DigitalOut frein_moteur1(p5); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur1(p13); //declaration sens de rotation moteur1 sur p13
PwmOut PWM1(p21); //declaration de la sortie pwm sur p21
PWM1.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur1.write(frein1);//affectation de la valeur du frein moteur1
sens_rotation_moteur1.write(sens_rotation1); //affectation du sens de rotation moteur1

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax1;a=a+0.001)
{
    wait(0.001);
    PWM1.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T11);

//    deceleration 
for(float a=Vmax1;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM1.write(a);// fixe le rapport cyclique à la valeur a% 
}

};

/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur2                    //
/////////////////////////////////////////////////////////////////////////////

void motor2_mouve(float Vmax2,int T12,int sens_rotation2,int frein2)
{
    
///////////////////////////
//initialisation moteur2 //
///////////////////////////
    
DigitalOut frein_moteur2(p6); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur2(p14); //declaration sens de rotation moteur1 sur p13
PwmOut PWM1(p22); //declaration de la sortie pwm sur p21
PWM2.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur2.write(frein2);//affectation de la valeur du frein moteur1
sens_rotation_moteur2.write(sens_rotation2); //affectation du sens de rotation moteur1

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax2;a=a+0.001)
{
    wait(0.001);
    PWM2.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T12);

//    deceleration 
for(float a=Vmax2;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM2.write(a);// fixe le rapport cyclique à la valeur a% 
}

};

/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur3                    //
/////////////////////////////////////////////////////////////////////////////

void motor3_mouve(float Vmax3,int T13,int sens_rotation3,int frein3)
{
    
///////////////////////////
//initialisation moteur3 //
///////////////////////////
    
DigitalOut frein_moteur3(p7); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur3(p27); //declaration sens de rotation moteur1 sur p13
PwmOut PWM3(p23); //declaration de la sortie pwm sur p21
PWM3.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur3.write(frein3);//affectation de la valeur du frein moteur1
sens_rotation_moteur3.write(sens_rotation3); //affectation du sens de rotation moteur1

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax3;a=a+0.001)
{
    wait(0.001);
    PWM3.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T13);

//    deceleration 
for(float a=Vmax3;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM3.write(a);// fixe le rapport cyclique à la valeur a% 
}

};

/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur4                    //
/////////////////////////////////////////////////////////////////////////////

void motor4_mouve(float Vmax4,int T14,int sens_rotation4,int frein4)
{
    
///////////////////////////
//initialisation moteur4 //
///////////////////////////
    
DigitalOut frein_moteur4(p8); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur4(p28); //declaration sens de rotation moteur1 sur p13
PwmOut PWM4(p24); //declaration de la sortie pwm sur p21
PWM4.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur4.write(frein4);//affectation de la valeur du frein moteur4
sens_rotation_moteur4.write(sens_rotation4); //affectation du sens de rotation moteur4

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax4;a=a+0.001)
{
    wait(0.001);
    PWM4.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T14);

//    deceleration 
for(float a=Vmax4;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM4.write(a);// fixe le rapport cyclique à la valeur a% 
}

};


/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur5                    //
/////////////////////////////////////////////////////////////////////////////

void motor5_mouve(float Vmax5,int T15,int sens_rotation5,int frein5)
{
    
///////////////////////////
//initialisation moteur5 //
///////////////////////////
    
DigitalOut frein_moteur5(p11); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur5(p29); //declaration sens de rotation moteur1 sur p13
PwmOut PWM5(p25); //declaration de la sortie pwm sur p21
PWM5.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur5.write(frein5);//affectation de la valeur du frein moteur4
sens_rotation_moteur5.write(sens_rotation5); //affectation du sens de rotation moteur4

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax5;a=a+0.001)
{
    wait(0.001);
    PWM5.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T15);

//    deceleration 
for(float a=Vmax5;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM5.write(a);// fixe le rapport cyclique à la valeur a% 
}

};


/////////////////////////////////////////////////////////////////////////////
//                   declaration de la fonction moteur6                    //
/////////////////////////////////////////////////////////////////////////////

void motor6_mouve(float Vmax6,int T16,int sens_rotation6,int frein6)
{
    
///////////////////////////
//initialisation moteur6 //
///////////////////////////
    
DigitalOut frein_moteur6(p12); //declaration sortie frein sur p5
DigitalOut sens_rotation_moteur6(p30); //declaration sens de rotation moteur1 sur p13
PwmOut PWM6(p26); //declaration de la sortie pwm sur p21
PWM6.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz

frein_moteur6.write(frein6);//affectation de la valeur du frein moteur4
sens_rotation_moteur6.write(sens_rotation6); //affectation du sens de rotation moteur4

//////////////////////////////////////////////////
//   conversion valeur % vers num explotable    //
//////////////////////////////////////////////////

// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //
// //  // // // // // // // // // // // // // // //

//    acceleration    
for(float a=0;a<= Vmax6;a=a+0.001)
{
    wait(0.001);
    PWM6.write(a);// fixe le rapport cyclique à la valeur a% 
}

//    mouvement en Vmax
wait(T16);

//    deceleration 
for(float a=Vmax6;a>=0;a=a-0.001)
{
    wait(0.001);
    PWM6.write(a);// fixe le rapport cyclique à la valeur a% 
}

};

int main()
{
device.baud(38400);    
device.printf("Hello World\n");


char c;

led1=0;
led2=0;
led3=0;
led4=0;

while (1)
{
  
               device.printf("Enter axis to move?\r\n");        
                device.scanf("%c",&c);          
                switch(c){
                    case '1':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 1\r\n");    
                        led1=1;
                        led2=0;
                        led3=0;
                        led4=0;                
                        motor1_mouve(1,1,1,0);              
                    break; 
                    
                    case '2':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 2\r\n");      
                        led1=0;
                        led2=1;
                        led3=0;
                        led4=0;   
                        motor2_mouve(1,1,1,0);       
                    break;   
                    
                    case '3':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 3\r\n");
                        led1=1;
                        led2=1;
                        led3=0;
                        led4=0;
                        motor3_mouve(1,1,1,0);
                    break;
                    
                    case '4':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 4\r\n");
                        led1=0;
                        led2=0;
                        led3=1;
                        led4=0;
                        motor4_mouve(1,1,1,0);
                    break;
                    
                    case '5':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 5\r\n");
                        led1=1;
                        led2=0;
                        led3=1;
                        led4=0;
                        motor5_mouve(1,1,1,0);
                    break;
                    
                    case '6':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic Axis 6\r\n");
                        led1=0;
                        led2=1;
                        led3=1;
                        led4=0;                       
                        motor6_mouve(1,1,1,0);
                    break;

                   case '7':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic  7\r\n");
                        led1=1;
                        led2=1;
                        led3=1;
                        led4=0;                       
                        motor1_mouve(1,1,1,0);
                        motor2_mouve(1,1,1,0);
                        motor3_mouve(1,1,1,0);
                        motor4_mouve(1,1,1,0);
                        motor5_mouve(1,1,1,0);
                        motor6_mouve(1,1,1,0);
                        
                    break;             
                    
                    
                    case '8':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("music Robotic  8\r\n");
                        led1=0;
                        led2=0;
                        led3=0;
                        led4=1;                       

                        PwmOut buzzer(p21);            
                        float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440}; 
                        float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //beat array


                        for (int i=0;i<=11;i++) {
                        buzzer.period(1/(2*frequency[i]));    // set PWM period
                        buzzer=0.5;    // set duty cycle
                        wait(0.4*beat[i]);    // hold for beat period
                            }                       
                    break;            

                   case '9':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic  9\r\n");
                        
                        led1=1;
                        led2=0;
                        led3=0;
                        led4=1; 
                                              
                        motor1_mouve(1,1,1,0);
                        motor1_mouve(1,1,0,0);
                        motor1_mouve(1,1,1,0);
                        motor1_mouve(1,1,0,0);
                        
                    break;   

                   case '0':
                    //(float Vmax,int T1,int sens_rotation,int frein)
                        device.printf("moving Robotic  0\r\n");
                        
                        led1=1;
                        led2=0;
                        led3=1;
                        led4=0; 
                                              
                        motor1_mouve(1,1,1,0);
                        motor1_mouve(1,1,0,0);
                        motor1_mouve(1,1,1,0);
                        motor1_mouve(1,1,0,0);
                        
                    break;                              
                    
                }






};

}