projet neotim mpp / Mbed 2 deprecated projet_v4

Dependencies:   mbed

Committer:
dg81
Date:
Mon May 25 13:04:07 2020 +0000
Revision:
3:b95fe07153f1
Parent:
2:ee896365f8fe
Child:
4:1d58769720c6
commente;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dg81 0:5fb4c7e603cf 1
dg81 0:5fb4c7e603cf 2 #include "mbed.h"
dg81 0:5fb4c7e603cf 3 /*************** Variables globales **************************/
jdeschamps 2:ee896365f8fe 4 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
jdeschamps 2:ee896365f8fe 5 volatile int flag_timer_reglage_vitesse=0; //ce timer lit le réglage de la vitesse tous les 0.1 s
jdeschamps 2:ee896365f8fe 6 volatile int flag_fc_haut=0; //interruption sur SW2
jdeschamps 2:ee896365f8fe 7 volatile int flag_contact=0; //interruption sur SW3
dg81 0:5fb4c7e603cf 8 /*************** Interfaces utilisés *************************/
jdeschamps 1:bb5b935c0aa9 9 Serial pc(USBTX, USBRX,9600); // liaison USB
dg81 0:5fb4c7e603cf 10 Ticker timer_etat; // Interruptions temporelles (timout)
dg81 0:5fb4c7e603cf 11 Ticker timer_reglage_vitesse;
jdeschamps 1:bb5b935c0aa9 12 DigitalOut IN1(PTD3); // sorties logiques
jdeschamps 1:bb5b935c0aa9 13 DigitalOut IN2(PTC4);
jdeschamps 1:bb5b935c0aa9 14 DigitalOut IN3(PTD1);
jdeschamps 1:bb5b935c0aa9 15 DigitalOut IN4(PTC12);
jdeschamps 1:bb5b935c0aa9 16 DigitalOut ENA(PTA1);
jdeschamps 1:bb5b935c0aa9 17 DigitalOut ENB(PTD2);
jdeschamps 1:bb5b935c0aa9 18 AnalogIn ain0(A0); //(lecture potentiometre vitesse) // entrées analogiques
jdeschamps 2:ee896365f8fe 19 AnalogIn ain1(A1); // (lecture potentiometre lecture position)
jdeschamps 2:ee896365f8fe 20 InterruptIn fc_haut(SW2); // SW2 est associé à une interruption kbi s'appelant fc_haut
jdeschamps 2:ee896365f8fe 21 InterruptIn contact(SW3); // SW3 est associé à une interruption kbi s'appelant contact
dg81 0:5fb4c7e603cf 22 /*************** Programmes d'interruption *******************/
jdeschamps 2:ee896365f8fe 23 void IT_timer_etat() { // sequencement phases moteur dont la fréquence est réglable potentiomètre/trame
dg81 0:5fb4c7e603cf 24 flag_timer_etat=1;
dg81 0:5fb4c7e603cf 25 }
jdeschamps 2:ee896365f8fe 26 void IT_timer_reglage_vitesse() { // reglage de la vitesse tous les 100 ms
dg81 0:5fb4c7e603cf 27 flag_timer_reglage_vitesse=1;
dg81 0:5fb4c7e603cf 28 }
dg81 0:5fb4c7e603cf 29 void IT_fc_haut(){ // position haute atteinte (raz)
dg81 0:5fb4c7e603cf 30 flag_fc_haut=1;
dg81 0:5fb4c7e603cf 31 }
dg81 0:5fb4c7e603cf 32 void IT_contact(){ // contact avec echantillon (OK)
dg81 0:5fb4c7e603cf 33 flag_contact=1;
dg81 0:5fb4c7e603cf 34 }
dg81 0:5fb4c7e603cf 35 /*************** Programme Principal *************************/
dg81 0:5fb4c7e603cf 36 int main() {
dg81 0:5fb4c7e603cf 37 // declaration des variables
dg81 0:5fb4c7e603cf 38 signed char etat=0; // etat varie de 0 à 7 pour représenter les 8 posiions du mpp
dg81 0:5fb4c7e603cf 39 signed char sens=0; // -1 : recule / 0 : stop / 1 : avance
dg81 0:5fb4c7e603cf 40 float Vpot,Vpos,periode,position_mesuree,frequence; // Vpot potentiomètre reglage vitesse
dg81 0:5fb4c7e603cf 41 // Vpos capteur de position monté sur vérin
dg81 0:5fb4c7e603cf 42 // position_mesurée : position estimée avec Vpos
dg81 0:5fb4c7e603cf 43 // periode : periode de l'IT etat (pilotage moteur)
dg81 0:5fb4c7e603cf 44 // frequence : frequence de l'IT etat (pilotage moteur)
jdeschamps 2:ee896365f8fe 45 char command[30]; // buffer de réception du message
dg81 3:b95fe07153f1 46 int Nb_pas =0; // comptage du nombre de 1/2 pas
dg81 3:b95fe07153f1 47 int consigne_position =0;
dg81 3:b95fe07153f1 48 // dans le cas du firgelli :
dg81 0:5fb4c7e603cf 49 float a=127.47; // coefficient etalonnage capteur de position
dg81 0:5fb4c7e603cf 50 float b=-6.23; // coefficient etalonnage capteur de position
dg81 0:5fb4c7e603cf 51 // Initialisations
dg81 0:5fb4c7e603cf 52 IN1=0; // moteur non alimenté
dg81 0:5fb4c7e603cf 53 IN2=0;
dg81 0:5fb4c7e603cf 54 IN3=0;
dg81 0:5fb4c7e603cf 55 IN4=0;
jdeschamps 2:ee896365f8fe 56 timer_etat.attach(&IT_timer_etat, 0.01); // mise à jour de la commande moteur toutes les 10ms (100Hz)
dg81 0:5fb4c7e603cf 57 timer_reglage_vitesse.attach(&IT_timer_reglage_vitesse, 0.1); // mise à jour de la vitesse moteur par potentiomètre toutes les 0,1s
dg81 3:b95fe07153f1 58 fc_haut.fall(&IT_fc_haut); // declaration des programmes kbi (SW2)
dg81 3:b95fe07153f1 59 contact.fall(&IT_contact); // declaration des programmes kbi (SW3)
dg81 0:5fb4c7e603cf 60 // boucle programme principal
dg81 0:5fb4c7e603cf 61 while(1) {
dg81 0:5fb4c7e603cf 62 // on traite la liaison serie
dg81 0:5fb4c7e603cf 63 if (pc.readable()){ // test liaison serie
dg81 0:5fb4c7e603cf 64 pc.scanf("%s",command); // ecrit dans "command" la chaine reçue
dg81 0:5fb4c7e603cf 65 if(strcmp(command,"stop")==0) {
dg81 0:5fb4c7e603cf 66 sens=0; // si j'ai reçu "stop" désactivation du L298 et sens = 0
dg81 0:5fb4c7e603cf 67 ENA=0;
dg81 0:5fb4c7e603cf 68 ENB=0;
dg81 0:5fb4c7e603cf 69 }
dg81 0:5fb4c7e603cf 70 else if (strcmp(command,"avant")==0){
dg81 0:5fb4c7e603cf 71 sens=1; // si j'ai reçu "avant" activation du L298 et sens = 1
dg81 0:5fb4c7e603cf 72 ENA=1;
dg81 0:5fb4c7e603cf 73 ENB=1;
dg81 0:5fb4c7e603cf 74 }
dg81 0:5fb4c7e603cf 75 else if (strcmp(command,"arriere")==0){
dg81 0:5fb4c7e603cf 76 sens=-1; // si j'ai reçu "arriere" activation du L298 et sens = -1
dg81 0:5fb4c7e603cf 77 ENA=1;
dg81 0:5fb4c7e603cf 78 ENB=1;
dg81 0:5fb4c7e603cf 79 }
dg81 0:5fb4c7e603cf 80 else if (strcmp(command,"fc_haut")==0){
dg81 0:5fb4c7e603cf 81 sens=0; // si j'ai reçu "fc_haut" désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 82 ENA=0; // (réinitialisation du nombre de pas)
dg81 0:5fb4c7e603cf 83 ENB=0;
dg81 3:b95fe07153f1 84 Nb_pas=0;
dg81 0:5fb4c7e603cf 85 }
dg81 0:5fb4c7e603cf 86 else if (strcmp(command,"contact")==0){
dg81 0:5fb4c7e603cf 87 sens=0; // si j'ai reçu "contact" désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 88 ENA=0;
dg81 0:5fb4c7e603cf 89 ENB=0;
dg81 3:b95fe07153f1 90 /***********************************************************************************************************/
dg81 3:b95fe07153f1 91 /******************** Traitement contact si firgelli *******************************************************/
dg81 3:b95fe07153f1 92 /***********************************************************************************************************/
dg81 3:b95fe07153f1 93 /*// en mode test sur système avec capteur de position
dg81 3:b95fe07153f1 94 Vpos=ain1.read(); // lecture du capteur de position (firgelli)
dg81 3:b95fe07153f1 95 position_mesuree=a*Vpos+b; // calcule la position (firgelli)
dg81 0:5fb4c7e603cf 96 printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);
dg81 0:5fb4c7e603cf 97 // sur le vrai système
dg81 0:5fb4c7e603cf 98 //position_mesuree=position*0.0125;
dg81 3:b95fe07153f1 99 //printf("nb pas = %d\n", position_mesuree); */
dg81 3:b95fe07153f1 100 /***********************************************************************************************************/
dg81 3:b95fe07153f1 101 /******************** Traitement contact si moteur pas à pas ************************************************/
dg81 3:b95fe07153f1 102 /***********************************************************************************************************/
dg81 3:b95fe07153f1 103 // en mode test sur système avec capteur de position
dg81 3:b95fe07153f1 104 position_mesuree=Nb_pas*0.0125;
dg81 3:b95fe07153f1 105 printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", Nb_pas,Vpos,position_mesuree);
dg81 0:5fb4c7e603cf 106 }
dg81 0:5fb4c7e603cf 107 else if(strcmp(command,"vitesse")==0) { // trame vitesse : "vitesse<CR>XXXX<CR>" où XXXX représente la frequence de pilotage du moteur
dg81 0:5fb4c7e603cf 108 pc.scanf("%s",command); // lecture de XXXX la frequence de pilotage
dg81 0:5fb4c7e603cf 109 frequence=atoi(command); // change la chaine de caractères en entier
dg81 0:5fb4c7e603cf 110 periode=1/float(frequence);
dg81 0:5fb4c7e603cf 111 timer_etat.attach(&IT_timer_etat, periode); //on fixe la periode de pilotage du moteur
dg81 0:5fb4c7e603cf 112 }
dg81 0:5fb4c7e603cf 113 else if(strcmp(command,"position")==0) {
dg81 0:5fb4c7e603cf 114 pc.scanf("%s",command);
jdeschamps 2:ee896365f8fe 115 consigne_position=atoi(command);
jdeschamps 2:ee896365f8fe 116
dg81 0:5fb4c7e603cf 117 }
dg81 0:5fb4c7e603cf 118 }
dg81 0:5fb4c7e603cf 119 // on traite la commande du moteur
dg81 0:5fb4c7e603cf 120 if (flag_timer_etat==1)
dg81 0:5fb4c7e603cf 121 {
dg81 0:5fb4c7e603cf 122 if (sens ==1) {
dg81 0:5fb4c7e603cf 123 etat++;
dg81 3:b95fe07153f1 124 Nb_pas++;
dg81 0:5fb4c7e603cf 125 if (etat>7) etat=0;
dg81 0:5fb4c7e603cf 126 }
dg81 0:5fb4c7e603cf 127 else if (sens==-1){
dg81 0:5fb4c7e603cf 128 etat--;
dg81 3:b95fe07153f1 129 Nb_pas--;
dg81 0:5fb4c7e603cf 130 if (etat<0) etat=7;
dg81 0:5fb4c7e603cf 131 }
dg81 0:5fb4c7e603cf 132 switch (etat) {
dg81 0:5fb4c7e603cf 133 case 0 :
dg81 0:5fb4c7e603cf 134 IN1=1;
dg81 0:5fb4c7e603cf 135 IN2=0;
dg81 0:5fb4c7e603cf 136 IN3=0;
dg81 0:5fb4c7e603cf 137 IN4=0;
dg81 0:5fb4c7e603cf 138 break;
dg81 0:5fb4c7e603cf 139 case 1 :
dg81 0:5fb4c7e603cf 140 IN1=1;
dg81 0:5fb4c7e603cf 141 IN2=0;
dg81 0:5fb4c7e603cf 142 IN3=1;
dg81 0:5fb4c7e603cf 143 IN4=0;
dg81 0:5fb4c7e603cf 144 break;
dg81 0:5fb4c7e603cf 145 case 2 :
dg81 0:5fb4c7e603cf 146 IN1=0;
dg81 0:5fb4c7e603cf 147 IN2=0;
dg81 0:5fb4c7e603cf 148 IN3=1;
dg81 0:5fb4c7e603cf 149 IN4=0;
dg81 0:5fb4c7e603cf 150 break;
dg81 0:5fb4c7e603cf 151 case 3 :
dg81 0:5fb4c7e603cf 152 IN1=0;
dg81 0:5fb4c7e603cf 153 IN2=1;
dg81 0:5fb4c7e603cf 154 IN3=1;
dg81 0:5fb4c7e603cf 155 IN4=0;
dg81 0:5fb4c7e603cf 156 break;
dg81 0:5fb4c7e603cf 157 case 4 :
dg81 0:5fb4c7e603cf 158 IN1=0;
dg81 0:5fb4c7e603cf 159 IN2=1;
dg81 0:5fb4c7e603cf 160 IN3=0;
dg81 0:5fb4c7e603cf 161 IN4=0;
dg81 0:5fb4c7e603cf 162 break;
dg81 0:5fb4c7e603cf 163 case 5 :
dg81 0:5fb4c7e603cf 164 IN1=0;
dg81 0:5fb4c7e603cf 165 IN2=1;
dg81 0:5fb4c7e603cf 166 IN3=0;
dg81 0:5fb4c7e603cf 167 IN4=1;
dg81 0:5fb4c7e603cf 168 break;
dg81 0:5fb4c7e603cf 169 case 6 :
dg81 0:5fb4c7e603cf 170 IN1=0;
dg81 0:5fb4c7e603cf 171 IN2=0;
dg81 0:5fb4c7e603cf 172 IN3=0;
dg81 0:5fb4c7e603cf 173 IN4=1;
dg81 0:5fb4c7e603cf 174 break;
dg81 0:5fb4c7e603cf 175 case 7 :
dg81 0:5fb4c7e603cf 176 IN1=1;
dg81 0:5fb4c7e603cf 177 IN2=0;
dg81 0:5fb4c7e603cf 178 IN3=0;
dg81 0:5fb4c7e603cf 179 IN4=1;
dg81 0:5fb4c7e603cf 180 break;
dg81 0:5fb4c7e603cf 181 default :
dg81 0:5fb4c7e603cf 182 etat=0;
dg81 0:5fb4c7e603cf 183 }
dg81 0:5fb4c7e603cf 184 // printf ("etat = %d\n",etat);
dg81 0:5fb4c7e603cf 185 flag_timer_etat=0;
dg81 0:5fb4c7e603cf 186 }
dg81 0:5fb4c7e603cf 187 if (flag_fc_haut==1){ // si j'ai un appui sur BP fc_haut : désactivation du L298 et position = 0
dg81 3:b95fe07153f1 188 Nb_pas=0;
dg81 0:5fb4c7e603cf 189 sens=0;
dg81 0:5fb4c7e603cf 190 ENA=0;
dg81 0:5fb4c7e603cf 191 ENB=0;
dg81 0:5fb4c7e603cf 192 flag_fc_haut=0;
dg81 0:5fb4c7e603cf 193 }
dg81 0:5fb4c7e603cf 194 if (flag_contact==1){ // si j'ai un appui sur BP contact : désactivation du L298 et envoi de la position
dg81 3:b95fe07153f1 195 sens=0; // si j'ai reçu "contact" désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 196 ENA=0;
dg81 0:5fb4c7e603cf 197 ENB=0;
dg81 3:b95fe07153f1 198 /***********************************************************************************************************/
dg81 3:b95fe07153f1 199 /******************** Traitement contact si firgelli *******************************************************/
dg81 3:b95fe07153f1 200 /***********************************************************************************************************/
dg81 3:b95fe07153f1 201 /*// en mode test sur système avec capteur de position
dg81 3:b95fe07153f1 202 Vpos=ain1.read(); // lecture du capteur de position (firgelli)
dg81 3:b95fe07153f1 203 position_mesuree=a*Vpos+b; // calcule la position (firgelli)
dg81 3:b95fe07153f1 204 printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);
dg81 3:b95fe07153f1 205 // sur le vrai système
dg81 3:b95fe07153f1 206 //position_mesuree=position*0.0125;
dg81 3:b95fe07153f1 207 //printf("nb pas = %d\n", position_mesuree); */
dg81 3:b95fe07153f1 208 /***********************************************************************************************************/
dg81 3:b95fe07153f1 209 /******************** Traitement contact si moteur pas à pas ************************************************/
dg81 3:b95fe07153f1 210 /***********************************************************************************************************/
dg81 3:b95fe07153f1 211 // en mode test sur système avec capteur de position
dg81 3:b95fe07153f1 212 position_mesuree=Nb_pas*0.0125;
dg81 3:b95fe07153f1 213 printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", Nb_pas,Vpos,position_mesuree);
dg81 0:5fb4c7e603cf 214 }
dg81 0:5fb4c7e603cf 215 if (flag_timer_reglage_vitesse==1){
dg81 0:5fb4c7e603cf 216 Vpot=ain0.read(); // Vpot varie de 0 à 100% (0 à 1) en fonction du réglage vitesse
dg81 0:5fb4c7e603cf 217 frequence= 700*(Vpot+1); // frequence varie de 700 Hz à 1400Hz)
dg81 0:5fb4c7e603cf 218 periode=1/float(frequence);
dg81 0:5fb4c7e603cf 219 timer_etat.attach(&IT_timer_etat, periode); // maj vitesse moteur par potentiomètre
dg81 0:5fb4c7e603cf 220 flag_timer_reglage_vitesse=0;
dg81 0:5fb4c7e603cf 221 }
dg81 0:5fb4c7e603cf 222 }
dg81 0:5fb4c7e603cf 223 }