projet neotim mpp / Mbed 2 deprecated projet_v4

Dependencies:   mbed

main.cpp

Committer:
jdeschamps
Date:
2020-06-16
Revision:
5:3e44d8755e88
Parent:
4:1d58769720c6

File content as of revision 5:3e44d8755e88:


#include "mbed.h"
/*************** Variables globales **************************/
volatile int flag_timer_etat=0; //ce timer séquence l'alimaentation des phases du moteur, sa fréquence est réglable avec le potentiomètre + trame vitesse
volatile int flag_timer_reglage_vitesse=0; //ce timer lit le réglage de la vitesse tous les 0.1 s
volatile int flag_fc_haut=0; //interruption sur SW2
volatile int flag_contact=0; //interruption sur SW3
volatile int flag_retour=0;
volatile int flag_monte=0;
volatile int flag_descend=0;
volatile int flag_stop=0;
volatile int flag_position=0;
/*************** Interfaces utilisés *************************/
Serial pc(USBTX, USBRX,9600); // liaison USB
Ticker timer_etat;                     // Interruptions temporelles (timout)
Ticker timer_reglage_vitesse;         
DigitalOut DIRA(PTD3);          // sorties logiques
DigitalOut BRKA(PTC4);
DigitalOut DIRB(PTD1);
DigitalOut BRKB(PTC12);
DigitalOut ENA(PTA1);
DigitalOut ENB(PTD2);
AnalogIn ain0(A0);             //(lecture potentiometre vitesse) // entrées analogiques
AnalogIn ain1(A1);             // (lecture potentiometre lecture position)
InterruptIn fc_haut(SW2);      // SW2 est associé à une interruption kbi s'appelant fc_haut
InterruptIn contact(SW3);      // SW3 est associé à une interruption kbi s'appelant contact
InterruptIn monte (D4);        // D4 est associé à une interruption kbi s'appelant monte
InterruptIn descend (D8);      // D3 est associé à une interruption kbi s'appelant descend
InterruptIn retour (D7);       // D7 est associé à une interruption kbi s'appelant retour
InterruptIn stop (D6);         // D6 est associé à une interruption kbi s'appelant stop
//InterruptIn position;
/*************** Programmes d'interruption *******************/
void IT_timer_etat() {          // sequencement phases moteur dont la fréquence est réglable potentiomètre/trame
    flag_timer_etat=1;
    }
void IT_timer_reglage_vitesse() { // reglage de la vitesse tous les 100 ms
    flag_timer_reglage_vitesse=1;
    }
void IT_fc_haut(){                  // position haute atteinte (raz)
    flag_fc_haut=1;
    } 
void IT_contact(){                  // contact avec echantillon (OK)
    flag_contact=1;
    }  
void IT_retour(){
    flag_retour=1;
    }
    
void IT_monte(){
    flag_monte=1;
    }
    
void IT_descend(){
    flag_descend=1;
    }
    
void IT_stop(){
    flag_stop=1;
    }
/*************** Programme Principal *************************/
int main() {
    // declaration des variables
    signed char etat=0; // etat varie de 0 à 7 pour représenter les 8 posiions du mpp
    signed char sens=0; // -1 : recule / 0 : stop / 1 : avance
    float Vpot,Vpos,periode,position_mesuree,frequence; // Vpot potentiomètre reglage vitesse
                                                        // Vpos capteur de position monté sur vérin
                                                        // position_mesurée : position estimée avec Vpos
                                                        // periode : periode de l'IT etat (pilotage moteur)
                                                        // frequence : frequence de l'IT etat (pilotage moteur)
    char command[30];    // buffer de réception du message
    int Nb_pas =0;    // comptage du nombre de 1/2 pas
//    int consigne_position =0;
 //   int position_demandee=10;
   // dans le cas du firgelli :
  //  float a=127.47; // coefficient etalonnage capteur de position
  //  float b=-6.23; // coefficient etalonnage capteur de position
    // Initialisations
        printf("Demarrage1...\n");
    DIRA=0; // moteur non alimenté
    BRKA=0;
    DIRB=0;
    BRKB=0;
    timer_etat.attach(&IT_timer_etat, 0.01); // mise à jour de la commande moteur toutes les 10ms (100Hz)
    timer_reglage_vitesse.attach(&IT_timer_reglage_vitesse, 0.1); // mise à jour de la vitesse moteur  par potentiomètre toutes les 0,1s
    fc_haut.fall(&IT_fc_haut);  // declaration des programmes kbi (SW2)
    contact.fall(&IT_contact);  // declaration des programmes kbi (SW3)
    monte.fall(&IT_monte);      // declaration des programmes kbi (D4)
    descend.fall(&IT_descend);  // declaration des programmes kbi (D8)
    retour.fall(&IT_retour);    // declaration des programmes kbi (D7)
    stop.fall(&IT_stop);      // declaration des programmes kbi (D6)
    printf("Demarrage...\n");
    // boucle programme principal
    while(1) {
        // on traite la liaison serie
        if (pc.readable()){                 // test liaison serie
            pc.scanf("%s",command);         // ecrit dans "command" la chaine reçue
  /*          if(strcmp(command,"position")==0){
                position_demandee=Nb_pas*0.0000125;
                sens=1;
                ENA=1;
                ENB=1;*/
            if(strcmp(command,"stop")==0) {
               sens=0;                      // si j'ai reçu "stop" désactivation du L298 et sens = 0
               ENA=0;
               ENB=0;
                }// fin stop
            else if (strcmp(command,"avant")==0){
                sens=1;                     // si j'ai reçu "avant" activation du L298 et sens = 1
                ENA=1;
                ENB=1;
                }
            else if (strcmp(command,"arriere")==0){
                sens=-1;                    // si j'ai reçu "arriere" activation du L298 et sens = -1
                ENA=1;
                ENB=1;
                }
            else if (strcmp(command,"fc_haut")==0){
                sens=0;                     // si j'ai reçu "fc_haut" désactivation du L298 et position = 0
                ENA=0;                      // (réinitialisation du  nombre de pas)
                ENB=0;
                Nb_pas=0;
                }
            else if (strcmp(command,"retour")==0){
                sens=-1;
                ENA=1;
                ENB=1;
                }
            else if (strcmp(command,"contact")==0){
                sens=0;                     // si j'ai reçu "contact" désactivation du L298 et position = 0
                ENA=0;
                ENB=0;
                /***********************************************************************************************************/
                /******************** Traitement contact si firgelli *******************************************************/
                /***********************************************************************************************************/
                /*// en mode test sur système avec capteur de position 
                Vpos=ain1.read();               // lecture du capteur de position (firgelli)          
                position_mesuree=a*Vpos+b;      // calcule la position (firgelli)
                printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);     
                // sur le vrai système
                //position_mesuree=position*0.0125;
                //printf("nb pas = %d\n", position_mesuree);        */
                 /***********************************************************************************************************/
                /******************** Traitement contact si moteur pas à pas ************************************************/
                /***********************************************************************************************************/
                // en mode test sur système avec capteur de position 
                position_mesuree=Nb_pas*0.0125;
                printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", Nb_pas,Vpos,position_mesuree);                              
                }
           /* else if(strcmp(command,"vitesse")==0) { // trame vitesse : "vitesse<CR>XXXX<CR>" où XXXX représente la frequence de pilotage du moteur
                pc.scanf("%s",command); // lecture de XXXX la frequence de pilotage
                frequence=atoi(command); // change la chaine de caractères en entier
                periode=1/float(frequence);
                printf("frequence : %f, periode : %f  \n", frequence,periode);
                timer_etat.attach(&IT_timer_etat, periode); //on fixe la periode de pilotage du moteur
                }
            else if(strcmp(command,"position")==0) {
                pc.scanf("%s",command);
                consigne_position=atoi(command);
                
                }
            else if (Nb_pas<=0){
                sens=0;
                ENA=0;
                ENB=0;
                }
            else if (position_mesuree<=0){
                sens=0;
                ENA=0;
                ENB=0;
                }
            }    */ 
        // on traite la commande du moteur 
    } // fin if readable 
        if (flag_timer_etat==1)
        {
            //printf("etat=%d\n",etat);
            if (sens ==1) {
                etat++;
                Nb_pas++;
                if (etat>7) etat=0;
                }
            else if (sens==-1){
                etat--;
                Nb_pas--;
                if (Nb_pas<=0){    //quand Nb_pas arrive à 0, le moteur s'arrête
                    sens=0;
                    ENA=0;
                    ENB=0;
                    }
                if (etat<0) etat=7;
            } // fin sens = -1
            switch (etat) {
            case 0 : 
                DIRA=1;
                BRKA=0;
                DIRB=0;
                BRKB=1;
                break;
            case 1 : 
                DIRA=1;
                BRKA=0;
                DIRB=1;
                BRKB=0;
                break;
            case 2 : 
                DIRA=0;
                BRKA=1;
                DIRB=1;
                BRKB=0;
                break;
            case 3 : 
                DIRA=0;
                BRKA=0;
                DIRB=1;
                BRKB=0;
                break;  
            case 4 : 
                DIRA=0;
                BRKA=0;
                DIRB=0;
                BRKB=1;
                break;
            case 5 : 
                DIRA=0;
                BRKA=0;
                DIRB=0;
                BRKB=0;
                break;
            case 6 : 
                DIRA=0;
                BRKA=1;
                DIRB=0;
                BRKB=0;
                break;
            case 7 : 
                DIRA=1;
                BRKA=0;
                DIRB=0;
                BRKB=0;               
                break;   
            default :
                etat=0;
            }  // fin switch
           // printf ("etat = %d\n",etat);                  
            flag_timer_etat=0;
            } // fin if timer
    if (flag_fc_haut==1){       // si j'ai un appui sur BP fc_haut : désactivation du L298 et position = 0
                Nb_pas=0;
                sens=0;
                ENA=0;
                ENB=0;
                flag_fc_haut=0;
                }
    if (flag_retour==1){
                sens=-1;
                ENA=1;
                ENB=1;
                printf("retour a zero \n");
                flag_retour=0;
                }
    if (flag_monte==1){
                wait(0.05);
                sens=1;
                ENA=1;
                ENB=1;
                printf("appui sur monte \n");
                flag_monte=0;
                }
    if (flag_descend==1){
                wait(0.05);  
                sens=-1;
                ENA=1;
                ENB=1;
                printf("appui sur descend \n");
                flag_descend=0;
                }
    if (flag_stop==1){
                sens=0;
                ENA=0;
                ENB=0;
                flag_stop=0;
                }
    if (flag_contact==1){       // si j'ai un appui sur BP contact : désactivation du L298 et envoi de la position
                sens=0;                     // si j'ai reçu "contact" désactivation du L298 et position = 0
                ENA=0;
                ENB=0;
                /***********************************************************************************************************/
                /******************** Traitement contact si firgelli *******************************************************/
                /***********************************************************************************************************/
                /*// en mode test sur système avec capteur de position 
                Vpos=ain1.read();               // lecture du capteur de position (firgelli)          
                position_mesuree=a*Vpos+b;      // calcule la position (firgelli)
                printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);     
                // sur le vrai système
                //position_mesuree=position*0.0125;
                //printf("nb pas = %d\n", position_mesuree);        */
                 /***********************************************************************************************************/
                /******************** Traitement contact si moteur pas à pas ************************************************/
                /***********************************************************************************************************/
                // en mode test sur système avec capteur de position 
                position_mesuree=Nb_pas*0.0000125;
                printf("Npas : %d , Vpos : %f , Position mesuree : %f mm \n", Nb_pas,Vpos,position_mesuree);  
                flag_contact=0;                            
                }
    if (flag_timer_reglage_vitesse==1){
                Vpot=ain0.read(); // Vpot varie de 0 à 100% (0 à 1) en fonction du réglage vitesse
                frequence= 1500*(Vpot+1); // frequence varie de 700 Hz à 1400Hz)
                periode=1/float(frequence);
                timer_etat.attach(&IT_timer_etat, periode); // maj vitesse moteur par potentiomètre
                //printf("frequence : %f, periode : %f  \n", frequence,periode);
                flag_timer_reglage_vitesse=0;
                }
    }
}