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
Diff: main.cpp
- Revision:
- 0:5fb4c7e603cf
- Child:
- 1:bb5b935c0aa9
diff -r 000000000000 -r 5fb4c7e603cf main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon May 11 09:34:13 2020 +0000
@@ -0,0 +1,200 @@
+
+#include "mbed.h"
+/*************** Variables globales **************************/
+volatile int flag_timer_etat=0;
+volatile int flag_timer_reglage_vitesse=0;
+volatile int flag_fc_haut=0;
+volatile int flag_contact=0;
+/*************** Interfaces utilisés *************************/
+Serial pc(USBTX, USBRX,115200); // liaison USB
+Ticker timer_etat; // Interruptions temporelles (timout)
+Ticker timer_reglage_vitesse;
+DigitalOut IN1(PTB23); // sorties logiques
+DigitalOut IN2(PTA1);
+DigitalOut IN3(PTB9);
+DigitalOut IN4(PTC17);
+DigitalOut ENA(PTA2);
+DigitalOut ENB(PTC16);
+AnalogIn ain0(A0); //(lecture potentiometre position) // entrées analogiques
+AnalogIn ain1(A1); // (lecture potentiometre reglage vitesse)
+InterruptIn fc_haut(SW2); // entrées KBI
+InterruptIn contact(SW3); //
+/*************** Programmes d'interruption *******************/
+void IT_timer_etat() { // sequencement phases moteur
+ flag_timer_etat=1;
+ }
+void IT_timer_reglage_vitesse() { // reglage de la vitesse
+ flag_timer_reglage_vitesse=1;
+ }
+void IT_fc_haut(){ // position haute atteinte (raz)
+ flag_fc_haut=1;
+ }
+void IT_contact(){ // contact avec echantillon (OK)
+ flag_contact=1;
+ }
+/*************** Programme Principal *************************/
+int main() {
+ // declaration des variables
+ signed char etat=0; // etat varie de 0 à 7 pour représenter les 8 posiions du mpp
+ signed char sens=0; // -1 : recule / 0 : stop / 1 : avance
+ float Vpot,Vpos,periode,position_mesuree,frequence; // Vpot potentiomètre reglage vitesse
+ // Vpos capteur de position monté sur vérin
+ // position_mesurée : position estimée avec Vpos
+ // periode : periode de l'IT etat (pilotage moteur)
+ // frequence : frequence de l'IT etat (pilotage moteur)
+ char command[9]; // buffer de réception du message
+ int position =0; // comptage du nombre de 1/2 pas
+ // int consigne_position =0;
+ float a=127.47; // coefficient etalonnage capteur de position
+ float b=-6.23; // coefficient etalonnage capteur de position
+ // Initialisations
+ IN1=0; // moteur non alimenté
+ IN2=0;
+ IN3=0;
+ IN4=0;
+ timer_etat.attach(&IT_timer_etat, 0.01); // mise à jour de la commande moteur toutes les 1ms (100Hz)
+ timer_reglage_vitesse.attach(&IT_timer_reglage_vitesse, 0.1); // mise à jour de la vitesse moteur par potentiomètre toutes les 0,1s
+ fc_haut.rise(&IT_fc_haut); // declaration des programmes kbi
+ contact.rise(&IT_contact);
+ // boucle programme principal
+ while(1) {
+ // on traite la liaison serie
+ if (pc.readable()){ // test liaison serie
+ pc.scanf("%s",command); // ecrit dans "command" la chaine reçue
+ if(strcmp(command,"stop")==0) {
+ sens=0; // si j'ai reçu "stop" désactivation du L298 et sens = 0
+ ENA=0;
+ ENB=0;
+ }
+ else if (strcmp(command,"avant")==0){
+ sens=1; // si j'ai reçu "avant" activation du L298 et sens = 1
+ ENA=1;
+ ENB=1;
+ }
+ else if (strcmp(command,"arriere")==0){
+ sens=-1; // si j'ai reçu "arriere" activation du L298 et sens = -1
+ ENA=1;
+ ENB=1;
+ }
+ else if (strcmp(command,"fc_haut")==0){
+ sens=0; // si j'ai reçu "fc_haut" désactivation du L298 et position = 0
+ ENA=0; // (réinitialisation du nombre de pas)
+ ENB=0;
+ position=0;
+ }
+ else if (strcmp(command,"contact")==0){
+ sens=0; // si j'ai reçu "contact" désactivation du L298 et position = 0
+ ENA=0;
+ ENB=0;
+ // en mode test sur système avec capteur de position
+ Vpos=ain1.read(); // lecture du capteur de position
+ position_mesuree=a*Vpos+b; // calcule la position
+ printf("Npas : %d , Vpos : %f , Position mesuree : %f \n", position,Vpos,position_mesuree);
+ // sur le vrai système
+ //position_mesuree=position*0.0125;
+ //printf("nb pas = %d\n", position_mesuree);
+ }
+ else if(strcmp(command,"vitesse")==0) { // trame vitesse : "vitesse<CR>XXXX<CR>" où XXXX représente la frequence de pilotage du moteur
+ pc.scanf("%s",command); // lecture de XXXX la frequence de pilotage
+ frequence=atoi(command); // change la chaine de caractères en entier
+ periode=1/float(frequence);
+ timer_etat.attach(&IT_timer_etat, periode); //on fixe la periode de pilotage du moteur
+ }
+ else if(strcmp(command,"position")==0) {
+ pc.scanf("%s",command);
+ consigne_position=atoi(command);*/
+ }
+ }
+ // on traite la commande du moteur
+ if (flag_timer_etat==1)
+ {
+ if (sens ==1) {
+ etat++;
+ position++;
+ if (etat>7) etat=0;
+ }
+ else if (sens==-1){
+ etat--;
+ position--;
+ if (etat<0) etat=7;
+ }
+ switch (etat) {
+ case 0 :
+ IN1=1;
+ IN2=0;
+ IN3=0;
+ IN4=0;
+ break;
+ case 1 :
+ IN1=1;
+ IN2=0;
+ IN3=1;
+ IN4=0;
+ break;
+ case 2 :
+ IN1=0;
+ IN2=0;
+ IN3=1;
+ IN4=0;
+ break;
+ case 3 :
+ IN1=0;
+ IN2=1;
+ IN3=1;
+ IN4=0;
+ break;
+ case 4 :
+ IN1=0;
+ IN2=1;
+ IN3=0;
+ IN4=0;
+ break;
+ case 5 :
+ IN1=0;
+ IN2=1;
+ IN3=0;
+ IN4=1;
+ break;
+ case 6 :
+ IN1=0;
+ IN2=0;
+ IN3=0;
+ IN4=1;
+ break;
+ case 7 :
+ IN1=1;
+ IN2=0;
+ IN3=0;
+ IN4=1;
+ break;
+ default :
+ etat=0;
+ }
+ // printf ("etat = %d\n",etat);
+ flag_timer_etat=0;
+ }
+ if (flag_fc_haut==1){ // si j'ai un appui sur BP fc_haut : désactivation du L298 et position = 0
+ position=0;
+ sens=0;
+ ENA=0;
+ ENB=0;
+ flag_fc_haut=0;
+ }
+ if (flag_contact==1){ // si j'ai un appui sur BP contact : désactivation du L298 et envoi de la position
+ sens=0;
+ ENA=0;
+ ENB=0;
+ //position_mesuree=position*0.0125; // sur le vrai système
+ //printf("nb pas = %d\n", position_mesuree);
+ printf("position : %d \n",position);
+ flag_contact=0;
+ }
+ if (flag_timer_reglage_vitesse==1){
+ Vpot=ain0.read(); // Vpot varie de 0 à 100% (0 à 1) en fonction du réglage vitesse
+ frequence= 700*(Vpot+1); // frequence varie de 700 Hz à 1400Hz)
+ periode=1/float(frequence);
+ timer_etat.attach(&IT_timer_etat, periode); // maj vitesse moteur par potentiomètre
+ flag_timer_reglage_vitesse=0;
+ }
+ }
+}
\ No newline at end of file