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.
Diff: main.cpp
- Revision:
- 2:03c99cd73da2
- Parent:
- 1:2011b28f3283
- Child:
- 3:42edde42531b
diff -r 2011b28f3283 -r 03c99cd73da2 main.cpp
--- a/main.cpp Mon Oct 26 18:18:54 2020 +0000
+++ b/main.cpp Tue Jul 27 12:25:23 2021 +0000
@@ -1,61 +1,124 @@
-#include "mbed.h"
+/* Franck DURAND 2021 - V3
-#define fech 40000 // Fréquence d'échantillonnage souhaitée
-#define NB_COEFF 21 // Nombre de coefficients du filtre RIF
+Projet SID sur microcontroleur STM32 avec carte de développement Nucléo STM32F429ZI
+Signal d'entrée sur la broche A2 0 à 3.3 Volt maxi f<fe/2 f< 30 KHz
-Serial pc(USBTX, USBRX);
+Etape 1: Acquisition des échantillons sur la broche A2 avec recopie sur D13
-AnalogIn entree_analogique(PC_3); // A2 connecteur Arduino
-AnalogOut sortie_analogique(PA_5); // D13 Arduino
-PwmOut sortie(PE_9); // D6 Arduino
-DigitalOut visu(PG_9) ; // D0 Arduino
-Ticker ADC_DAC ;
+Etape 2: Mise en œuvre du calcul de la valeur efficace en temps réel avec
+ filtre RII premier ordre.
+ veff = sqrt (0.0001f*in*in + 0.9999f*veff) ;
+ /* Calcul de la valeur efficace avec un filtre recursif ordre 1 */
+ /* y(n) = sqrt[(1 + a)*x(n)x(n) - a*y(n-1)]
+Etape 3: Mémorisation des valeurs moyennes sur clé USB toutes les secondes
+*/
-// Filtre RIF passe_bas fc = 2000 Hz généré avec Octave fe réelle = 40 kHz
-// Fe = 1 dans Octave --> Fc Octavve = 2000/40000 = 0.075
-// b = fir1(20,0.075) ; 21 = nb coeffients dans b
-float coeff_filtre[NB_COEFF] = {0.0026603,0.0045069,0.0091798,0.017556,
- 0.029809,0.045263,0.062429,0.079237,0.093403,
- 0.10286,0.10619,0.10286,0.093403,0.079237,
- 0.062429,0.045263,0.029809,0.017556,0.0091798,
- 0.0045069,0.0026603
- } ;
+#include "mbed.h"
+#include "math.h"
+#include "USBHostMSD.h"
+#include "string"
+#include <stdio.h>
+
+#define fech 48000 // Fréquence d'échantillonnage souhaitée 48 KHz
+#define taille 3600 // nombre d'enregistrements par fichier (24 heures=86400 secondes)
+
+Serial pc2(USBTX,USBRX);
-// Temps de traitement d'un échantillon 1.3 us
-float fir(float xn)
+AnalogIn entree_analogique(PC_3); // A2 connecteur Arduino Signal d'entrée
+AnalogOut sortie_analogique(PA_5); // D13 Arduino sortie de contrôle analogique
+PwmOut sortie(PE_9); // D6 Arduino pour les tests uniquement
+DigitalOut visu(PG_9) ; // D0 Arduino pour les tests de la mesure du temps de traitement
+DigitalIn mybutton(USER_BUTTON); // Bouton utilisateur pour arret du programme
+Ticker ADC_DAC ; // Aquisition des échantillons sur interpuption ticker
+
+/**************************** Variables globales *******************************************************/
+float input = 0 ; // valeur de la tension d'entrée acquise en volt
+float moy = 0 ;
+float eff2_ACDC = 0 ;
+float eff_AC = 0 ; // Valeur de la tension efficace d'un échantillon
+float eff[taille];
+int i; // variable indice de la mesure enregistree dans cle usb
+string s; // chaine de caratères pour stocker la valeur des secondes sous forme string
+
+
+/*************************************** Acquisition signal analogique ********************************/
+void acquisition()
{
- static float in[NB_COEFF + 1] ;
- int k ;
- float yn = 0 ;
- in[0] = xn ; // Entrée de l'échantillon courant au début du tableau
- for (k = NB_COEFF - 1 ; k >=0 ; k--) {
- yn += in[k]*coeff_filtre[k] ;
- in[k+1] = in[k] ; // Glissement des échantillons dans la pile après utilisation
- }
- return(yn);
+ float x,y ;
+
+ // visu = 1 ; // Permet de mesurer les temps de traitements des differentes instructions entre visu=1 et visu=0
+
+ y = entree_analogique.read(); // Acquisition du signal analogique
+ sortie_analogique.write(y) ; //Sortie d'un échantillon du signal (recopie du signal d'entrée)
+
+ // visu = 0 ; // Permet de mesurer les temps de traitements des differentes instructions entre visu=1 et visu=0
+
+ input = 3.3f*y; // Conversion en volts de l'échantillon du signal filtré
+ moy = 0.0001f*input + 0.9999f*moy; /* Calcul de la valeur efficace avec un filtre récursif d'ordre 1 */
+ eff2_ACDC = 0.0001f*input*input + 0.9999f*eff2_ACDC; /* Ici carré de la valeur efficace */
+ eff_AC = sqrt(eff2_ACDC);
+ /* Calcul de la valeur de la tension efficace avec un filtre récursif d'ordre 1 */
+ /* y(n) = racine[(1 + a)*x(n)*x(n) - a*y(n-1)] */
+ /* a = -0.9999 pour un lissage fort */
}
-
-void filtrage()
-{
- float x,y ;
- x = entree_analogique.read();
- visu = 1 ;
- y = fir(x) ;
- visu = 0 ;
- sortie_analogique.write(y) ;
-}
+/***********************************************************************************************************/
int main()
{
-
- pc.printf("\nEssai filtrage numerique temps reel fech = %d Hz\n",fech);
- pc.printf("Connectez la sortie D6 (signal a filtrer) sur l'entree A2 \n");
- pc.printf("Visualisez signal filtre sur la broche D13 \n");
- pc.printf("Mesure du temps de traitement du filtrage sur D0 \n");
- pc.printf("Traitement en cours : \n");
- ADC_DAC.attach_us(&filtrage,1000000/fech);
- sortie.period_us(2000);
- sortie.write(0.5f) ; // rapport cyclique 1/2
- while(1) {
+ USBHostMSD msd("usb");
+
+ set_time(1256729737);
+ time_t seconds = time(NULL);
+ pc2.printf("Time as a basic string = %s", ctime(&seconds));
+
+ pc2.printf("Connectez la clef USB sur le connecteur prevu a cet effet\n");
+ // Attente de la connexion USB
+ while(!msd.connect()) // try to connect a MSD device,
+ { // répétition jusqu'au branchement de la clé USB
+ }
+
+ pc2.printf("Clef USB connectee ne pas debrancher\n");
+ pc2.printf("Ecriture des donnees sur la clef USB dans le fichier data.txt\n");
+ FILE *fp = fopen("/usb/data.txt","w");
+
+ pc2.printf("\n fech = %d Hz\n",fech);
+ pc2.printf("Connectez la sortie D6 (signal a filtrer) sur l'entree A2 \n");
+ pc2.printf("Visualisez signal filtre sur la broche D13 \n");
+ pc2.printf("Mesure du temps de traitement du filtrage sur D0 \n");
+ pc2.printf("Traitement en cours : \n");
+
+ /********************************* Générateur de signal PWM pour les essais ********************************/
+ ADC_DAC.attach_us(&acquisition,1000000/(fech)); // démmarage du Ticker d'aquisition des échantillons sur interpuption
+ sortie.period_us(51); // utilisé uniquement pour les tests si pas de générateur GBF
+ sortie.write(0.5f) ; // rapport cyclique 1/2
+ /***********************************************************************************************************/
+
+ i=0;
+ while(1) { // Boucle inifinie avec execution du programme défini entre les accolades
+ if (fp != NULL) // Execution uniquement si la cle usb n est pas debranchee
+ {
+ i++; // Incrémentation de l'index de 1 pour une nouvelle mesure à enregistrer
+ eff[i] = eff_AC; // Sauvegarde de m'échantillon dans le tableau à l'indice i
+ // pc.printf("valeur efficace ACDC de la tension d entrée = %10.3f \n",eff2_ACDC);
+ // pc.printf("valeur moyenne de la tension d entrée = %10.3f \n",moy);
+
+ s=ctime(&seconds);
+ pc2.printf("RMS Value: %10.3f Time: %s",eff[i],s); // affichage de la valeur RMS sur la console
+ fprintf(fp,"RMS value ; %10.3f ;Time ;%s ",eff[i],s); // enregistrement des deux valeurs sur la clé USB
+
+ if (mybutton ==1||i>=taille) { // Procédure d'interruption du programme et de fermeture du fichier
+ // fin de programme si nombre d'échantillons supérieur ou égale à taille
+ // ou bouton poussoir USER (bleu) appuyé par l'utilisateur
+ pc2.printf("Demande arret du programme / sauvegarde en cours : \n");
+ fclose(fp); // Fermeture du fichier
+ wait(2);
+ pc2.printf("Vous pouvez retirer la cle USB \n");
+ while(1); // Boucle sans fin qui arrête définitivement le programme
+ }
+ }
+ else // Si l'accès au répertoire ne fonctionne pas.
+ pc2.printf("Impossible d'ouvrir le fichier data.txt\n");
+
+ wait_ms(1000); // attente une seconde
}
}