projet neotim mpp / Mbed 2 deprecated projet_v4

Dependencies:   mbed

Committer:
jdeschamps
Date:
Mon May 25 06:41:51 2020 +0000
Revision:
1:bb5b935c0aa9
Parent:
0:5fb4c7e603cf
Child:
2:ee896365f8fe
derniereversion

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 **************************/
dg81 0:5fb4c7e603cf 4 volatile int flag_timer_etat=0;
dg81 0:5fb4c7e603cf 5 volatile int flag_timer_reglage_vitesse=0;
dg81 0:5fb4c7e603cf 6 volatile int flag_fc_haut=0;
dg81 0:5fb4c7e603cf 7 volatile int flag_contact=0;
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 1:bb5b935c0aa9 19 AnalogIn ain1(A1); // (lecture potentiometre reglage position)
dg81 0:5fb4c7e603cf 20 InterruptIn fc_haut(SW2); // entrées KBI
dg81 0:5fb4c7e603cf 21 InterruptIn contact(SW3); //
dg81 0:5fb4c7e603cf 22 /*************** Programmes d'interruption *******************/
dg81 0:5fb4c7e603cf 23 void IT_timer_etat() { // sequencement phases moteur
dg81 0:5fb4c7e603cf 24 flag_timer_etat=1;
dg81 0:5fb4c7e603cf 25 }
dg81 0:5fb4c7e603cf 26 void IT_timer_reglage_vitesse() { // reglage de la vitesse
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)
dg81 0:5fb4c7e603cf 45 char command[9]; // 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;
dg81 0:5fb4c7e603cf 55 timer_etat.attach(&IT_timer_etat, 0.01); // mise à jour de la commande moteur toutes les 1ms (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
dg81 0:5fb4c7e603cf 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 1:bb5b935c0aa9 105 //consigne_position=atoi(command);*/
dg81 0:5fb4c7e603cf 106 }
dg81 0:5fb4c7e603cf 107 }
dg81 0:5fb4c7e603cf 108 // on traite la commande du moteur
dg81 0:5fb4c7e603cf 109 if (flag_timer_etat==1)
dg81 0:5fb4c7e603cf 110 {
dg81 0:5fb4c7e603cf 111 if (sens ==1) {
dg81 0:5fb4c7e603cf 112 etat++;
dg81 0:5fb4c7e603cf 113 position++;
dg81 0:5fb4c7e603cf 114 if (etat>7) etat=0;
dg81 0:5fb4c7e603cf 115 }
dg81 0:5fb4c7e603cf 116 else if (sens==-1){
dg81 0:5fb4c7e603cf 117 etat--;
dg81 0:5fb4c7e603cf 118 position--;
dg81 0:5fb4c7e603cf 119 if (etat<0) etat=7;
dg81 0:5fb4c7e603cf 120 }
dg81 0:5fb4c7e603cf 121 switch (etat) {
dg81 0:5fb4c7e603cf 122 case 0 :
dg81 0:5fb4c7e603cf 123 IN1=1;
dg81 0:5fb4c7e603cf 124 IN2=0;
dg81 0:5fb4c7e603cf 125 IN3=0;
dg81 0:5fb4c7e603cf 126 IN4=0;
dg81 0:5fb4c7e603cf 127 break;
dg81 0:5fb4c7e603cf 128 case 1 :
dg81 0:5fb4c7e603cf 129 IN1=1;
dg81 0:5fb4c7e603cf 130 IN2=0;
dg81 0:5fb4c7e603cf 131 IN3=1;
dg81 0:5fb4c7e603cf 132 IN4=0;
dg81 0:5fb4c7e603cf 133 break;
dg81 0:5fb4c7e603cf 134 case 2 :
dg81 0:5fb4c7e603cf 135 IN1=0;
dg81 0:5fb4c7e603cf 136 IN2=0;
dg81 0:5fb4c7e603cf 137 IN3=1;
dg81 0:5fb4c7e603cf 138 IN4=0;
dg81 0:5fb4c7e603cf 139 break;
dg81 0:5fb4c7e603cf 140 case 3 :
dg81 0:5fb4c7e603cf 141 IN1=0;
dg81 0:5fb4c7e603cf 142 IN2=1;
dg81 0:5fb4c7e603cf 143 IN3=1;
dg81 0:5fb4c7e603cf 144 IN4=0;
dg81 0:5fb4c7e603cf 145 break;
dg81 0:5fb4c7e603cf 146 case 4 :
dg81 0:5fb4c7e603cf 147 IN1=0;
dg81 0:5fb4c7e603cf 148 IN2=1;
dg81 0:5fb4c7e603cf 149 IN3=0;
dg81 0:5fb4c7e603cf 150 IN4=0;
dg81 0:5fb4c7e603cf 151 break;
dg81 0:5fb4c7e603cf 152 case 5 :
dg81 0:5fb4c7e603cf 153 IN1=0;
dg81 0:5fb4c7e603cf 154 IN2=1;
dg81 0:5fb4c7e603cf 155 IN3=0;
dg81 0:5fb4c7e603cf 156 IN4=1;
dg81 0:5fb4c7e603cf 157 break;
dg81 0:5fb4c7e603cf 158 case 6 :
dg81 0:5fb4c7e603cf 159 IN1=0;
dg81 0:5fb4c7e603cf 160 IN2=0;
dg81 0:5fb4c7e603cf 161 IN3=0;
dg81 0:5fb4c7e603cf 162 IN4=1;
dg81 0:5fb4c7e603cf 163 break;
dg81 0:5fb4c7e603cf 164 case 7 :
dg81 0:5fb4c7e603cf 165 IN1=1;
dg81 0:5fb4c7e603cf 166 IN2=0;
dg81 0:5fb4c7e603cf 167 IN3=0;
dg81 0:5fb4c7e603cf 168 IN4=1;
dg81 0:5fb4c7e603cf 169 break;
dg81 0:5fb4c7e603cf 170 default :
dg81 0:5fb4c7e603cf 171 etat=0;
dg81 0:5fb4c7e603cf 172 }
dg81 0:5fb4c7e603cf 173 // printf ("etat = %d\n",etat);
dg81 0:5fb4c7e603cf 174 flag_timer_etat=0;
dg81 0:5fb4c7e603cf 175 }
dg81 0:5fb4c7e603cf 176 if (flag_fc_haut==1){ // si j'ai un appui sur BP fc_haut : désactivation du L298 et position = 0
dg81 0:5fb4c7e603cf 177 position=0;
dg81 0:5fb4c7e603cf 178 sens=0;
dg81 0:5fb4c7e603cf 179 ENA=0;
dg81 0:5fb4c7e603cf 180 ENB=0;
dg81 0:5fb4c7e603cf 181 flag_fc_haut=0;
dg81 0:5fb4c7e603cf 182 }
dg81 0:5fb4c7e603cf 183 if (flag_contact==1){ // si j'ai un appui sur BP contact : désactivation du L298 et envoi de la position
dg81 0:5fb4c7e603cf 184 sens=0;
dg81 0:5fb4c7e603cf 185 ENA=0;
dg81 0:5fb4c7e603cf 186 ENB=0;
dg81 0:5fb4c7e603cf 187 //position_mesuree=position*0.0125; // sur le vrai système
dg81 0:5fb4c7e603cf 188 //printf("nb pas = %d\n", position_mesuree);
dg81 0:5fb4c7e603cf 189 printf("position : %d \n",position);
dg81 0:5fb4c7e603cf 190 flag_contact=0;
dg81 0:5fb4c7e603cf 191 }
dg81 0:5fb4c7e603cf 192 if (flag_timer_reglage_vitesse==1){
dg81 0:5fb4c7e603cf 193 Vpot=ain0.read(); // Vpot varie de 0 à 100% (0 à 1) en fonction du réglage vitesse
dg81 0:5fb4c7e603cf 194 frequence= 700*(Vpot+1); // frequence varie de 700 Hz à 1400Hz)
dg81 0:5fb4c7e603cf 195 periode=1/float(frequence);
dg81 0:5fb4c7e603cf 196 timer_etat.attach(&IT_timer_etat, periode); // maj vitesse moteur par potentiomètre
dg81 0:5fb4c7e603cf 197 flag_timer_reglage_vitesse=0;
dg81 0:5fb4c7e603cf 198 }
dg81 0:5fb4c7e603cf 199 }
dg81 0:5fb4c7e603cf 200 }