projet neotim mpp / Mbed 2 deprecated projet_v4

Dependencies:   mbed

Committer:
jdeschamps
Date:
Mon May 25 12:31:45 2020 +0000
Revision:
2:ee896365f8fe
Parent:
1:bb5b935c0aa9
Child:
3:b95fe07153f1
test

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 0:5fb4c7e603cf 46 int position =0; // comptage du nombre de 1/2 pas
dg81 0:5fb4c7e603cf 47 // int consigne_position =0;
dg81 0:5fb4c7e603cf 48 float a=127.47; // coefficient etalonnage capteur de position
dg81 0:5fb4c7e603cf 49 float b=-6.23; // coefficient etalonnage capteur de position
dg81 0:5fb4c7e603cf 50 // Initialisations
dg81 0:5fb4c7e603cf 51 IN1=0; // moteur non alimenté
dg81 0:5fb4c7e603cf 52 IN2=0;
dg81 0:5fb4c7e603cf 53 IN3=0;
dg81 0:5fb4c7e603cf 54 IN4=0;
jdeschamps 2:ee896365f8fe 55 timer_etat.attach(&IT_timer_etat, 0.01); // mise à jour de la commande moteur toutes les 10ms (100Hz)
dg81 0:5fb4c7e603cf 56 timer_reglage_vitesse.attach(&IT_timer_reglage_vitesse, 0.1); // mise à jour de la vitesse moteur par potentiomètre toutes les 0,1s
dg81 0:5fb4c7e603cf 57 fc_haut.rise(&IT_fc_haut); // declaration des programmes kbi
jdeschamps 2:ee896365f8fe 58 contact.rise(&IT_contact); //
dg81 0:5fb4c7e603cf 59 // boucle programme principal
dg81 0:5fb4c7e603cf 60 while(1) {
dg81 0:5fb4c7e603cf 61 // on traite la liaison serie
dg81 0:5fb4c7e603cf 62 if (pc.readable()){ // test liaison serie
dg81 0:5fb4c7e603cf 63 pc.scanf("%s",command); // ecrit dans "command" la chaine reçue
dg81 0:5fb4c7e603cf 64 if(strcmp(command,"stop")==0) {
dg81 0:5fb4c7e603cf 65 sens=0; // si j'ai reçu "stop" désactivation du L298 et sens = 0
dg81 0:5fb4c7e603cf 66 ENA=0;
dg81 0:5fb4c7e603cf 67 ENB=0;
dg81 0:5fb4c7e603cf 68 }
dg81 0:5fb4c7e603cf 69 else if (strcmp(command,"avant")==0){
dg81 0:5fb4c7e603cf 70 sens=1; // si j'ai reçu "avant" activation du L298 et sens = 1
dg81 0:5fb4c7e603cf 71 ENA=1;
dg81 0:5fb4c7e603cf 72 ENB=1;
dg81 0:5fb4c7e603cf 73 }
dg81 0:5fb4c7e603cf 74 else if (strcmp(command,"arriere")==0){
dg81 0:5fb4c7e603cf 75 sens=-1; // si j'ai reçu "arriere" activation du L298 et sens = -1
dg81 0:5fb4c7e603cf 76 ENA=1;
dg81 0:5fb4c7e603cf 77 ENB=1;
dg81 0:5fb4c7e603cf 78 }
dg81 0:5fb4c7e603cf 79 else if (strcmp(command,"fc_haut")==0){
dg81 0:5fb4c7e603cf 80 sens=0; // si j'ai reçu "fc_haut" désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 81 ENA=0; // (réinitialisation du nombre de pas)
dg81 0:5fb4c7e603cf 82 ENB=0;
dg81 0:5fb4c7e603cf 83 position=0;
dg81 0:5fb4c7e603cf 84 }
dg81 0:5fb4c7e603cf 85 else if (strcmp(command,"contact")==0){
dg81 0:5fb4c7e603cf 86 sens=0; // si j'ai reçu "contact" désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 87 ENA=0;
dg81 0:5fb4c7e603cf 88 ENB=0;
dg81 0:5fb4c7e603cf 89 // en mode test sur système avec capteur de position
dg81 0:5fb4c7e603cf 90 Vpos=ain1.read(); // lecture du capteur de position
dg81 0:5fb4c7e603cf 91 position_mesuree=a*Vpos+b; // calcule la position
dg81 0:5fb4c7e603cf 92 printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);
dg81 0:5fb4c7e603cf 93 // sur le vrai système
dg81 0:5fb4c7e603cf 94 //position_mesuree=position*0.0125;
dg81 0:5fb4c7e603cf 95 //printf("nb pas = %d\n", position_mesuree);
dg81 0:5fb4c7e603cf 96 }
dg81 0:5fb4c7e603cf 97 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 98 pc.scanf("%s",command); // lecture de XXXX la frequence de pilotage
dg81 0:5fb4c7e603cf 99 frequence=atoi(command); // change la chaine de caractères en entier
dg81 0:5fb4c7e603cf 100 periode=1/float(frequence);
dg81 0:5fb4c7e603cf 101 timer_etat.attach(&IT_timer_etat, periode); //on fixe la periode de pilotage du moteur
dg81 0:5fb4c7e603cf 102 }
dg81 0:5fb4c7e603cf 103 else if(strcmp(command,"position")==0) {
dg81 0:5fb4c7e603cf 104 pc.scanf("%s",command);
jdeschamps 2:ee896365f8fe 105 consigne_position=atoi(command);
jdeschamps 2:ee896365f8fe 106
dg81 0:5fb4c7e603cf 107 }
dg81 0:5fb4c7e603cf 108 }
dg81 0:5fb4c7e603cf 109 // on traite la commande du moteur
dg81 0:5fb4c7e603cf 110 if (flag_timer_etat==1)
dg81 0:5fb4c7e603cf 111 {
dg81 0:5fb4c7e603cf 112 if (sens ==1) {
dg81 0:5fb4c7e603cf 113 etat++;
dg81 0:5fb4c7e603cf 114 position++;
dg81 0:5fb4c7e603cf 115 if (etat>7) etat=0;
dg81 0:5fb4c7e603cf 116 }
dg81 0:5fb4c7e603cf 117 else if (sens==-1){
dg81 0:5fb4c7e603cf 118 etat--;
dg81 0:5fb4c7e603cf 119 position--;
dg81 0:5fb4c7e603cf 120 if (etat<0) etat=7;
dg81 0:5fb4c7e603cf 121 }
dg81 0:5fb4c7e603cf 122 switch (etat) {
dg81 0:5fb4c7e603cf 123 case 0 :
dg81 0:5fb4c7e603cf 124 IN1=1;
dg81 0:5fb4c7e603cf 125 IN2=0;
dg81 0:5fb4c7e603cf 126 IN3=0;
dg81 0:5fb4c7e603cf 127 IN4=0;
dg81 0:5fb4c7e603cf 128 break;
dg81 0:5fb4c7e603cf 129 case 1 :
dg81 0:5fb4c7e603cf 130 IN1=1;
dg81 0:5fb4c7e603cf 131 IN2=0;
dg81 0:5fb4c7e603cf 132 IN3=1;
dg81 0:5fb4c7e603cf 133 IN4=0;
dg81 0:5fb4c7e603cf 134 break;
dg81 0:5fb4c7e603cf 135 case 2 :
dg81 0:5fb4c7e603cf 136 IN1=0;
dg81 0:5fb4c7e603cf 137 IN2=0;
dg81 0:5fb4c7e603cf 138 IN3=1;
dg81 0:5fb4c7e603cf 139 IN4=0;
dg81 0:5fb4c7e603cf 140 break;
dg81 0:5fb4c7e603cf 141 case 3 :
dg81 0:5fb4c7e603cf 142 IN1=0;
dg81 0:5fb4c7e603cf 143 IN2=1;
dg81 0:5fb4c7e603cf 144 IN3=1;
dg81 0:5fb4c7e603cf 145 IN4=0;
dg81 0:5fb4c7e603cf 146 break;
dg81 0:5fb4c7e603cf 147 case 4 :
dg81 0:5fb4c7e603cf 148 IN1=0;
dg81 0:5fb4c7e603cf 149 IN2=1;
dg81 0:5fb4c7e603cf 150 IN3=0;
dg81 0:5fb4c7e603cf 151 IN4=0;
dg81 0:5fb4c7e603cf 152 break;
dg81 0:5fb4c7e603cf 153 case 5 :
dg81 0:5fb4c7e603cf 154 IN1=0;
dg81 0:5fb4c7e603cf 155 IN2=1;
dg81 0:5fb4c7e603cf 156 IN3=0;
dg81 0:5fb4c7e603cf 157 IN4=1;
dg81 0:5fb4c7e603cf 158 break;
dg81 0:5fb4c7e603cf 159 case 6 :
dg81 0:5fb4c7e603cf 160 IN1=0;
dg81 0:5fb4c7e603cf 161 IN2=0;
dg81 0:5fb4c7e603cf 162 IN3=0;
dg81 0:5fb4c7e603cf 163 IN4=1;
dg81 0:5fb4c7e603cf 164 break;
dg81 0:5fb4c7e603cf 165 case 7 :
dg81 0:5fb4c7e603cf 166 IN1=1;
dg81 0:5fb4c7e603cf 167 IN2=0;
dg81 0:5fb4c7e603cf 168 IN3=0;
dg81 0:5fb4c7e603cf 169 IN4=1;
dg81 0:5fb4c7e603cf 170 break;
dg81 0:5fb4c7e603cf 171 default :
dg81 0:5fb4c7e603cf 172 etat=0;
dg81 0:5fb4c7e603cf 173 }
dg81 0:5fb4c7e603cf 174 // printf ("etat = %d\n",etat);
dg81 0:5fb4c7e603cf 175 flag_timer_etat=0;
dg81 0:5fb4c7e603cf 176 }
dg81 0:5fb4c7e603cf 177 if (flag_fc_haut==1){ // si j'ai un appui sur BP fc_haut : désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 178 position=0;
dg81 0:5fb4c7e603cf 179 sens=0;
dg81 0:5fb4c7e603cf 180 ENA=0;
dg81 0:5fb4c7e603cf 181 ENB=0;
dg81 0:5fb4c7e603cf 182 flag_fc_haut=0;
dg81 0:5fb4c7e603cf 183 }
dg81 0:5fb4c7e603cf 184 if (flag_contact==1){ // si j'ai un appui sur BP contact : désactivation du L298 et envoi de la position
dg81 0:5fb4c7e603cf 185 sens=0;
dg81 0:5fb4c7e603cf 186 ENA=0;
dg81 0:5fb4c7e603cf 187 ENB=0;
dg81 0:5fb4c7e603cf 188 //position_mesuree=position*0.0125; // sur le vrai système
dg81 0:5fb4c7e603cf 189 //printf("nb pas = %d\n", position_mesuree);
dg81 0:5fb4c7e603cf 190 printf("position : %d \n",position);
dg81 0:5fb4c7e603cf 191 flag_contact=0;
dg81 0:5fb4c7e603cf 192 }
dg81 0:5fb4c7e603cf 193 if (flag_timer_reglage_vitesse==1){
dg81 0:5fb4c7e603cf 194 Vpot=ain0.read(); // Vpot varie de 0 à 100% (0 à 1) en fonction du réglage vitesse
dg81 0:5fb4c7e603cf 195 frequence= 700*(Vpot+1); // frequence varie de 700 Hz à 1400Hz)
dg81 0:5fb4c7e603cf 196 periode=1/float(frequence);
dg81 0:5fb4c7e603cf 197 timer_etat.attach(&IT_timer_etat, periode); // maj vitesse moteur par potentiomètre
dg81 0:5fb4c7e603cf 198 flag_timer_reglage_vitesse=0;
dg81 0:5fb4c7e603cf 199 }
dg81 0:5fb4c7e603cf 200 }
dg81 0:5fb4c7e603cf 201 }