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@3:42edde42531b, 2022-04-07 (annotated)
- Committer:
- fdurand
- Date:
- Thu Apr 07 14:49:22 2022 +0000
- Revision:
- 3:42edde42531b
- Parent:
- 2:03c99cd73da2
version 4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fdurand | 2:03c99cd73da2 | 1 | /* Franck DURAND 2021 - V3 |
pierreprovent | 0:c7bba77179af | 2 | |
fdurand | 2:03c99cd73da2 | 3 | Projet SID sur microcontroleur STM32 avec carte de développement Nucléo STM32F429ZI |
fdurand | 2:03c99cd73da2 | 4 | Signal d'entrée sur la broche A2 0 à 3.3 Volt maxi f<fe/2 f< 30 KHz |
pierreprovent | 0:c7bba77179af | 5 | |
fdurand | 2:03c99cd73da2 | 6 | Etape 1: Acquisition des échantillons sur la broche A2 avec recopie sur D13 |
pierreprovent | 0:c7bba77179af | 7 | |
fdurand | 2:03c99cd73da2 | 8 | Etape 2: Mise en œuvre du calcul de la valeur efficace en temps réel avec |
fdurand | 2:03c99cd73da2 | 9 | filtre RII premier ordre. |
fdurand | 2:03c99cd73da2 | 10 | veff = sqrt (0.0001f*in*in + 0.9999f*veff) ; |
fdurand | 2:03c99cd73da2 | 11 | /* Calcul de la valeur efficace avec un filtre recursif ordre 1 */ |
fdurand | 2:03c99cd73da2 | 12 | /* y(n) = sqrt[(1 + a)*x(n)x(n) - a*y(n-1)] |
fdurand | 2:03c99cd73da2 | 13 | Etape 3: Mémorisation des valeurs moyennes sur clé USB toutes les secondes |
fdurand | 2:03c99cd73da2 | 14 | */ |
pierreprovent | 0:c7bba77179af | 15 | |
fdurand | 2:03c99cd73da2 | 16 | #include "mbed.h" |
fdurand | 2:03c99cd73da2 | 17 | #include "math.h" |
fdurand | 2:03c99cd73da2 | 18 | #include "USBHostMSD.h" |
fdurand | 2:03c99cd73da2 | 19 | #include "string" |
fdurand | 2:03c99cd73da2 | 20 | #include <stdio.h> |
fdurand | 2:03c99cd73da2 | 21 | |
fdurand | 2:03c99cd73da2 | 22 | #define fech 48000 // Fréquence d'échantillonnage souhaitée 48 KHz |
fdurand | 3:42edde42531b | 23 | #define taille 2880 // nombre d'enregistrements par fichier (24 heures= 2880 pour 2 ech/minutes) |
fdurand | 3:42edde42531b | 24 | // (2880*32bits)/1024 = 90 Ko |
fdurand | 2:03c99cd73da2 | 25 | |
fdurand | 2:03c99cd73da2 | 26 | Serial pc2(USBTX,USBRX); |
pierreprovent | 0:c7bba77179af | 27 | |
fdurand | 2:03c99cd73da2 | 28 | AnalogIn entree_analogique(PC_3); // A2 connecteur Arduino Signal d'entrée |
fdurand | 2:03c99cd73da2 | 29 | AnalogOut sortie_analogique(PA_5); // D13 Arduino sortie de contrôle analogique |
fdurand | 2:03c99cd73da2 | 30 | PwmOut sortie(PE_9); // D6 Arduino pour les tests uniquement |
fdurand | 2:03c99cd73da2 | 31 | DigitalOut visu(PG_9) ; // D0 Arduino pour les tests de la mesure du temps de traitement |
fdurand | 2:03c99cd73da2 | 32 | DigitalIn mybutton(USER_BUTTON); // Bouton utilisateur pour arret du programme |
fdurand | 2:03c99cd73da2 | 33 | Ticker ADC_DAC ; // Aquisition des échantillons sur interpuption ticker |
fdurand | 2:03c99cd73da2 | 34 | |
fdurand | 2:03c99cd73da2 | 35 | /**************************** Variables globales *******************************************************/ |
fdurand | 2:03c99cd73da2 | 36 | float input = 0 ; // valeur de la tension d'entrée acquise en volt |
fdurand | 2:03c99cd73da2 | 37 | float moy = 0 ; |
fdurand | 2:03c99cd73da2 | 38 | float eff2_ACDC = 0 ; |
fdurand | 2:03c99cd73da2 | 39 | float eff_AC = 0 ; // Valeur de la tension efficace d'un échantillon |
fdurand | 2:03c99cd73da2 | 40 | float eff[taille]; |
fdurand | 2:03c99cd73da2 | 41 | int i; // variable indice de la mesure enregistree dans cle usb |
fdurand | 2:03c99cd73da2 | 42 | string s; // chaine de caratères pour stocker la valeur des secondes sous forme string |
fdurand | 2:03c99cd73da2 | 43 | |
fdurand | 2:03c99cd73da2 | 44 | |
fdurand | 2:03c99cd73da2 | 45 | /*************************************** Acquisition signal analogique ********************************/ |
fdurand | 2:03c99cd73da2 | 46 | void acquisition() |
pierreprovent | 0:c7bba77179af | 47 | { |
fdurand | 2:03c99cd73da2 | 48 | float x,y ; |
fdurand | 2:03c99cd73da2 | 49 | |
fdurand | 2:03c99cd73da2 | 50 | // visu = 1 ; // Permet de mesurer les temps de traitements des differentes instructions entre visu=1 et visu=0 |
fdurand | 2:03c99cd73da2 | 51 | |
fdurand | 2:03c99cd73da2 | 52 | y = entree_analogique.read(); // Acquisition du signal analogique |
fdurand | 2:03c99cd73da2 | 53 | sortie_analogique.write(y) ; //Sortie d'un échantillon du signal (recopie du signal d'entrée) |
fdurand | 2:03c99cd73da2 | 54 | |
fdurand | 2:03c99cd73da2 | 55 | // visu = 0 ; // Permet de mesurer les temps de traitements des differentes instructions entre visu=1 et visu=0 |
fdurand | 2:03c99cd73da2 | 56 | |
fdurand | 2:03c99cd73da2 | 57 | input = 3.3f*y; // Conversion en volts de l'échantillon du signal filtré |
fdurand | 2:03c99cd73da2 | 58 | moy = 0.0001f*input + 0.9999f*moy; /* Calcul de la valeur efficace avec un filtre récursif d'ordre 1 */ |
fdurand | 2:03c99cd73da2 | 59 | eff2_ACDC = 0.0001f*input*input + 0.9999f*eff2_ACDC; /* Ici carré de la valeur efficace */ |
fdurand | 2:03c99cd73da2 | 60 | eff_AC = sqrt(eff2_ACDC); |
fdurand | 2:03c99cd73da2 | 61 | /* Calcul de la valeur de la tension efficace avec un filtre récursif d'ordre 1 */ |
fdurand | 2:03c99cd73da2 | 62 | /* y(n) = racine[(1 + a)*x(n)*x(n) - a*y(n-1)] */ |
fdurand | 2:03c99cd73da2 | 63 | /* a = -0.9999 pour un lissage fort */ |
pierreprovent | 0:c7bba77179af | 64 | } |
fdurand | 2:03c99cd73da2 | 65 | /***********************************************************************************************************/ |
pierreprovent | 0:c7bba77179af | 66 | |
pierreprovent | 0:c7bba77179af | 67 | int main() |
pierreprovent | 0:c7bba77179af | 68 | { |
fdurand | 2:03c99cd73da2 | 69 | USBHostMSD msd("usb"); |
fdurand | 2:03c99cd73da2 | 70 | |
fdurand | 2:03c99cd73da2 | 71 | set_time(1256729737); |
fdurand | 2:03c99cd73da2 | 72 | time_t seconds = time(NULL); |
fdurand | 2:03c99cd73da2 | 73 | pc2.printf("Time as a basic string = %s", ctime(&seconds)); |
fdurand | 2:03c99cd73da2 | 74 | |
fdurand | 2:03c99cd73da2 | 75 | pc2.printf("Connectez la clef USB sur le connecteur prevu a cet effet\n"); |
fdurand | 2:03c99cd73da2 | 76 | // Attente de la connexion USB |
fdurand | 2:03c99cd73da2 | 77 | while(!msd.connect()) // try to connect a MSD device, |
fdurand | 2:03c99cd73da2 | 78 | { // répétition jusqu'au branchement de la clé USB |
fdurand | 2:03c99cd73da2 | 79 | } |
fdurand | 2:03c99cd73da2 | 80 | |
fdurand | 2:03c99cd73da2 | 81 | pc2.printf("Clef USB connectee ne pas debrancher\n"); |
fdurand | 2:03c99cd73da2 | 82 | pc2.printf("Ecriture des donnees sur la clef USB dans le fichier data.txt\n"); |
fdurand | 2:03c99cd73da2 | 83 | FILE *fp = fopen("/usb/data.txt","w"); |
fdurand | 2:03c99cd73da2 | 84 | |
fdurand | 2:03c99cd73da2 | 85 | pc2.printf("\n fech = %d Hz\n",fech); |
fdurand | 2:03c99cd73da2 | 86 | pc2.printf("Connectez la sortie D6 (signal a filtrer) sur l'entree A2 \n"); |
fdurand | 2:03c99cd73da2 | 87 | pc2.printf("Visualisez signal filtre sur la broche D13 \n"); |
fdurand | 2:03c99cd73da2 | 88 | pc2.printf("Mesure du temps de traitement du filtrage sur D0 \n"); |
fdurand | 2:03c99cd73da2 | 89 | pc2.printf("Traitement en cours : \n"); |
fdurand | 2:03c99cd73da2 | 90 | |
fdurand | 2:03c99cd73da2 | 91 | /********************************* Générateur de signal PWM pour les essais ********************************/ |
fdurand | 2:03c99cd73da2 | 92 | ADC_DAC.attach_us(&acquisition,1000000/(fech)); // démmarage du Ticker d'aquisition des échantillons sur interpuption |
fdurand | 2:03c99cd73da2 | 93 | sortie.period_us(51); // utilisé uniquement pour les tests si pas de générateur GBF |
fdurand | 2:03c99cd73da2 | 94 | sortie.write(0.5f) ; // rapport cyclique 1/2 |
fdurand | 2:03c99cd73da2 | 95 | /***********************************************************************************************************/ |
fdurand | 2:03c99cd73da2 | 96 | |
fdurand | 2:03c99cd73da2 | 97 | i=0; |
fdurand | 2:03c99cd73da2 | 98 | while(1) { // Boucle inifinie avec execution du programme défini entre les accolades |
fdurand | 2:03c99cd73da2 | 99 | if (fp != NULL) // Execution uniquement si la cle usb n est pas debranchee |
fdurand | 2:03c99cd73da2 | 100 | { |
fdurand | 2:03c99cd73da2 | 101 | i++; // Incrémentation de l'index de 1 pour une nouvelle mesure à enregistrer |
fdurand | 2:03c99cd73da2 | 102 | eff[i] = eff_AC; // Sauvegarde de m'échantillon dans le tableau à l'indice i |
fdurand | 2:03c99cd73da2 | 103 | // pc.printf("valeur efficace ACDC de la tension d entrée = %10.3f \n",eff2_ACDC); |
fdurand | 2:03c99cd73da2 | 104 | // pc.printf("valeur moyenne de la tension d entrée = %10.3f \n",moy); |
fdurand | 2:03c99cd73da2 | 105 | |
fdurand | 2:03c99cd73da2 | 106 | s=ctime(&seconds); |
fdurand | 2:03c99cd73da2 | 107 | pc2.printf("RMS Value: %10.3f Time: %s",eff[i],s); // affichage de la valeur RMS sur la console |
fdurand | 2:03c99cd73da2 | 108 | fprintf(fp,"RMS value ; %10.3f ;Time ;%s ",eff[i],s); // enregistrement des deux valeurs sur la clé USB |
fdurand | 2:03c99cd73da2 | 109 | |
fdurand | 2:03c99cd73da2 | 110 | if (mybutton ==1||i>=taille) { // Procédure d'interruption du programme et de fermeture du fichier |
fdurand | 2:03c99cd73da2 | 111 | // fin de programme si nombre d'échantillons supérieur ou égale à taille |
fdurand | 2:03c99cd73da2 | 112 | // ou bouton poussoir USER (bleu) appuyé par l'utilisateur |
fdurand | 2:03c99cd73da2 | 113 | pc2.printf("Demande arret du programme / sauvegarde en cours : \n"); |
fdurand | 2:03c99cd73da2 | 114 | fclose(fp); // Fermeture du fichier |
fdurand | 2:03c99cd73da2 | 115 | wait(2); |
fdurand | 2:03c99cd73da2 | 116 | pc2.printf("Vous pouvez retirer la cle USB \n"); |
fdurand | 2:03c99cd73da2 | 117 | while(1); // Boucle sans fin qui arrête définitivement le programme |
fdurand | 2:03c99cd73da2 | 118 | } |
fdurand | 2:03c99cd73da2 | 119 | } |
fdurand | 2:03c99cd73da2 | 120 | else // Si l'accès au répertoire ne fonctionne pas. |
fdurand | 2:03c99cd73da2 | 121 | pc2.printf("Impossible d'ouvrir le fichier data.txt\n"); |
fdurand | 2:03c99cd73da2 | 122 | |
fdurand | 3:42edde42531b | 123 | wait_ms(30000) // attente 30 secondes |
pierreprovent | 0:c7bba77179af | 124 | } |
pierreprovent | 0:c7bba77179af | 125 | } |