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@0:5fb4c7e603cf, 2020-05-11 (annotated)
- Committer:
- dg81
- Date:
- Mon May 11 09:34:13 2020 +0000
- Revision:
- 0:5fb4c7e603cf
- Child:
- 1:bb5b935c0aa9
hello julien that's 11/05/2020
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 **************************/ |
| 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 *************************/ |
| dg81 | 0:5fb4c7e603cf | 9 | Serial pc(USBTX, USBRX,115200); // liaison USB |
| dg81 | 0:5fb4c7e603cf | 10 | Ticker timer_etat; // Interruptions temporelles (timout) |
| dg81 | 0:5fb4c7e603cf | 11 | Ticker timer_reglage_vitesse; |
| dg81 | 0:5fb4c7e603cf | 12 | DigitalOut IN1(PTB23); // sorties logiques |
| dg81 | 0:5fb4c7e603cf | 13 | DigitalOut IN2(PTA1); |
| dg81 | 0:5fb4c7e603cf | 14 | DigitalOut IN3(PTB9); |
| dg81 | 0:5fb4c7e603cf | 15 | DigitalOut IN4(PTC17); |
| dg81 | 0:5fb4c7e603cf | 16 | DigitalOut ENA(PTA2); |
| dg81 | 0:5fb4c7e603cf | 17 | DigitalOut ENB(PTC16); |
| dg81 | 0:5fb4c7e603cf | 18 | AnalogIn ain0(A0); //(lecture potentiometre position) // entrées analogiques |
| dg81 | 0:5fb4c7e603cf | 19 | AnalogIn ain1(A1); // (lecture potentiometre reglage vitesse) |
| 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); |
| dg81 | 0:5fb4c7e603cf | 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 | } |