Franck DURAND / Mbed 2 deprecated SID_V3_Nucleo_F429ZI

Dependencies:   mbed USBHost

Committer:
fdurand
Date:
Tue Jul 27 12:25:23 2021 +0000
Revision:
2:03c99cd73da2
Parent:
1:2011b28f3283
Child:
3:42edde42531b
Software for SID recorder, this software make AD conversion with RMS calculation each minutes. results are stored on external USB in .txt file format. ;

Who changed what in which revision?

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