Franck DURAND / Mbed 2 deprecated SID_V3_Nucleo_F429ZI

Dependencies:   mbed USBHost

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?

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 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 }