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@2:ee896365f8fe, 2020-05-25 (annotated)
- 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?
| 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 | 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 | } |