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.
main.cpp
- Committer:
- qmaker
- Date:
- 2021-04-15
- Revision:
- 2:7de884ffc9d9
- Parent:
- 1:b44f69eb07c4
- Child:
- 3:3bc2882232a6
File content as of revision 2:7de884ffc9d9:
#include "mbed.h" #include "rtos.h" #include "MPU6050.h" #include "FastPWM.h" #include "codeurs.h" int dato=0; // déclaration des objets Serial pc(USBTX, USBRX,115200); Serial bluetooth(PA_9, PA_10,38400); //PINS TO CONECT. PA_9 WITH RX PIN HC-06 DigitalOut led(LED1); MPU6050 module(I2C_SDA, I2C_SCL); // valeur de Te float tems = 10; // variable asserv position float erreurPosition, erreurPosition_p, consignePosition = 0; float KPP = 0.001; // varailble necessire à la mesure de la position angulaire du gyropode float accelero[3]= {0}; float gyro[3] = {0}; float tauFC = 0.2; // constante de tyemps en seconde du filtre passe bas du filtre complémentaire float aFC, bFC; // les coefficient du filter passe bas du filtre complémentaire float angleATG,angleNF, angleGyro,omegarGyro, angleGyrop,angleGyroConsigne; float consigneAngle = -0.001; float CommandeVitesse = 0; // varailble necessire à l'asserv angulaire et vitesse float offsetConsigneAngle = 0; float KPV = 0.026; float KDA = 0.08; float KPA =2.3; float KDV = 0.01; float erreurVitesse, offsetConsigneAngle_p; // valeur du filtre passe bas float ec_f, ec_fp; float Te = 0.0002; float ec,ecCorrige; // grandeur de commande float ecVir; // Codeurs Codeurs codeurs; int g, d, vitesseCodeur1, g_p, vitesseCodeur2, d_p; float moyVitesse_p, moyVitesse; //sorties moteur FastPWM M1_1(D9); FastPWM M1_2(D10); FastPWM M2_1(D11); FastPWM M2_2(D12); int nbInc=0; char flagInterupt=0; //reception void reception(char ch) { static int i=0; // inice du dernier caratère recu static char chaine[10]; // chaine de stockage des caratères recus char commande[3]; // chaine contenant la commande char valeur[6]; // chaine contenant la valeur if ((ch==13) or (ch==10)) { chaine[i]='\0'; // séparation de la commande et de la valeur strcpy(commande, strtok(chaine, " ")); strcpy(valeur, strtok(NULL, " ")); if (strcmp( commande, "KPV" ) == 0) { KPV=atof(valeur); } if (strcmp( commande, "CA" ) == 0) { consigneAngle=atof(valeur); } if (strcmp( commande, "KDA" ) == 0) { KDA=atof(valeur); } if (strcmp( commande, "KPA" ) == 0) { KPA=atof(valeur); } if (strcmp( commande, "CV" ) == 0) { CommandeVitesse=atof(valeur); } if (strcmp( commande, "KDV" ) == 0) { KDV=atof(valeur); } // reinitialisation de l indice de chaine i = 0; } else { chaine[i]=ch; i++; } } void interupt() { codeurs.read(g, d); nbInc++; /**********************************************************************************************/ /* Estimation position angulaire */ /**********************************************************************************************/ // Lecture des données de l'accéléro et du gyro module.getAccelero(accelero); module.getGyro(gyro); // calcul pos angulaire du gyropode à partir de l'arc tangeante des accelerations angleATG = atan2(accelero[1],accelero[0]); // Calcul de la sortie du filtre complementaire omegarGyro = -gyro[2]; angleNF = angleATG + tauFC * omegarGyro; angleGyro = aFC*( angleNF + bFC * angleGyrop); // Memorisation des valeurs precedante pour les filtres recursifs angleGyrop = angleGyro; /**********************************************************************************************/ /* Asserv postion angulaire gyropode */ /**********************************************************************************************/ // Definir la consigne de l'asservissement de la pos angulaire angleGyroConsigne = consigneAngle+offsetConsigneAngle; // consigneAngle est la grandeur de commande issue de l'asservissement de l image de la vitesse // Calcul de la grandeur de commande de l'asservissement des pos angulaire ec= KPA*(angleGyroConsigne-angleGyro)-KDA*omegarGyro; /**********************************************************************************************/ /* Asserv Position */ /**********************************************************************************************/ erreurPosition = consignePosition - (g-d); CommandeVitesse = KPP * (erreurPosition-erreurPosition_p); erreurPosition_p = erreurPosition; if (CommandeVitesse>3) CommandeVitesse = 3; else if (CommandeVitesse < -3) CommandeVitesse = -3; /**********************************************************************************************/ /* Asserv Vitesse */ /**********************************************************************************************/ // Correcteur proportionel KPV erreurVitesse = CommandeVitesse-moyVitesse; // Asservissement de vitesse offsetConsigneAngle = (KPV*erreurVitesse)+(KDV*(moyVitesse - moyVitesse_p)); moyVitesse_p = moyVitesse; // Calcul vitesse codeur vitesseCodeur1 = -g_p+g; g_p = g; vitesseCodeur2 = d_p-d; d_p = d; moyVitesse = (vitesseCodeur1+vitesseCodeur2)/2; moyVitesse = moyVitesse/10; /**********************************************************************************************/ /* Commande Moteurs */ /**********************************************************************************************/ // Compenssation frottement sec if (ec<0)ecCorrige=ec-0.15; else if (ec>0)ecCorrige=ec+0.15; else ecCorrige = 0; // Saturation if (ecCorrige<-0.5)ecCorrige=-0.5; if (ecCorrige>0.5)ecCorrige=0.5; // Sorties PWM Moteurs M1_1.write(0.5+(ecCorrige+ecVir)); M1_2.write(0.5-(ecCorrige+ecVir)); M2_1.write(0.5-(ecCorrige-ecVir)); M2_2.write(0.5+(ecCorrige-ecVir)); flagInterupt=1; } RtosTimer timer(mbed::callback(interupt),osTimerPeriodic); int main() { pc.printf("Test unitaire mecatro \n\r"); M1_1.period_us(50); M1_2.period_us(50); M2_1.period_us(50); M2_2.period_us(50); M1_1.write(0.5); M1_2.write(0.5); M2_1.write(0.5); M2_2.write(0.5); // Test connection codeurs pc.printf("Test des codeurs\r\n"); while (!codeurs.test()) { pc.printf("Codeurs non connectes\r\n"); wait(1); } pc.printf("Codeurs ok\r\n"); codeurs.reset(); // initialisation et test de connection du MPU6050 while (module.testConnection()==0) { pc.printf("not connected to mpu\n\r"); wait(1); } //changement du l'echelle du module module.setGyroRange(MPU6050_GYRO_RANGE_2000); module.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G); // calcul des coefficients des filtres aFC=(float)1/(1+tauFC/(tems/1000)); bFC=tauFC/(tems/1000); // initialisation de la latache periodique du noyau multitache timer.start(tems); while(1) { if (flagInterupt==1) { pc.printf("%4.3f %4.3f %4.3f %4.3f \n\r",angleGyro,moyVitesse,offsetConsigneAngle,ec); flagInterupt=0; } if(bluetooth.readable()) { dato=bluetooth.getc(); pc.putc(dato); } if(pc.readable()) { dato=pc.getc(); bluetooth.putc(dato); } // Controle valeur de la commande via HC06 if(dato == 'A') { CommandeVitesse = 3; } else if(dato == 'R') { CommandeVitesse = -3; } else if((dato == 'a') || (dato == 'r')) { CommandeVitesse = 0; } else if((dato == 'g') || (dato == 'd')) { ecVir = 0; } else if(dato == 'G') { ecVir = -0.1; } else if(dato == 'D') { ecVir = 0.1; } else if(dato == 'o') { KPV =0; KDA =0; KPA =0; KDV =0; consigneAngle =0; } else if(dato == 'O') { KPV = 0.026; KDA = 0.08; KPA =2.3; KDV = 0.01; consigneAngle = -0.001; } } }