Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@3:b95fe07153f1, 2020-05-25 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |