Catégories
Cours VHDL Projets Arduino Projets électroniques Projets FPGA

Projet électronique : Traitement du signal avec Arduino # Lissage & Seuillage d’un signal 3/3

 Projet électronique Traitement du signal avec Arduino Lissage et Seuillage d’un signal 3-3- Schéma de principe

Objectifs du projet électronique

Générateur des signaux avec FPGA

projet-électronique-Générateur-des-signaux-à-base-du-PIC16877-à-fréquence-fixe-reseau-R-2R

Le seuil de basculement

On va utiliser un potentiomètre variable comme étant le seuil de déclenchement. Le potentiomètre est alimenté par une tension de 3.3V (ou 5V) fixe. Le pin 2 (voir la figure) sera branché avec le pin 2 de la carte Arduino.

Schéma de câblage avec Arduino

Projet électronique Traitement du signal avec Arduino Lissage et Seuillage d’un signal 3-3- Schéma cablage Arduino

Codes Arduino et autres fonctions

// SigProc.ino
#define Taille 64

// Sortie numériue
const int OutCompare = 2;

// Entrées Analogiques signal & seuil
const int InSignal = 1;
const int InSeuil = 2;

//Paramètres des signaux
float ValuSig[Taille];
float ValueSeuil[Taille];
float SeuilFixe =0.0;
float InputSignal=0.0;
int i=0;


void setup() {

  pinMode(OutCompare, OUTPUT);
  pinMode(InSignal, INPUT);
  pinMode(InSeuil, INPUT);

  // Calcul initial du seuil moyenne sur Taille échantillons
  // Accumulation des échantillons
  for( i=0;i<Taille ; i++)
  {
    ValueSeuil[i]=5.0*analogRead(InSeuil)/1023;
  }
  // Calcul de la moyenne des échantillons
  SeuilFixe = Moyenne(Taille, ValueSeuil);

  // Initialisation de la sortie TOR
  digitalWrite(OutCompare, LOW);
  delay(3000);

}

void loop()
{
    // Détection du seuil avec la méthode basée sur la comparaison
  InputSignal = 5.0*analogRead(InSignal)/1023;
  digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));

  // Détection du seuil avec la méthode de la Moyenne  - Solution 1
  /*for( i=0;i<Taille ; i++)
  {
    ValuSig[i]=5.0*analogRead(InSignal)/1023.0;
  }

  InputSignal =Moyenne(Taille, ValuSig);
  digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));*/


  /* // Détection du seuil avec la méthode de la Moyenne  - Solution 2
  ValuSig[i]=5.0*analogRead(InSeuil)/1023;
  //InputSignal =Moyenne(Taille, &ValuSig[0]);
  InputSignal=(ValuSig[0]+ValuSig[1]+ValuSig[2]+ValuSig[3])/Taille;
  digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));
  i=(i++) % Taille; */

  /* // Détection du seuil avec la méthode de la Médiane
  ValuSig[i]=5.0*analogRead(InSeuil)/1023;
  TableSort(Taille ,  ValuSig);
  InputSignal =Mediane(Taille, ValuSig);
  i=(i++) % Taille;
  digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal)); */

}


// Fonction qui calcul la moyenne d'un tableau
float Moyenne(unsigned char taille,  float *DataIn)
{
        unsigned char i=0;
        float somme =0.0;
        for(i=0;i<taille; i++)
                somme+=DataIn[i];

        return somme/taille;

}
// Fonction qui calcul la valeur médiane d'un tableau
float Mediane(unsigned char taille,  float *DataSort)
{
        float MedValue = 0.0;
        MedValue = DataSort[round((taille-1.0)/2.0)];

        return MedValue;
}

// Fonction de tri d’un tableau
 void TableSort(unsigned char taille,  float *DataIn)
 {
         unsigned char  i, j ;
         float temp;
         for (i = 0; i < (taille - 1); ++i)
         {
                  for (j = 0; j < taille - 1 - i; ++j )
                  {
                           if (DataIn[j] > DataIn[j+1])
                           {
                                        temp = DataIn[j+1];
                                        DataIn[j+1] = DataIn[j];
                                        DataIn[j] = temp;
                           }
                  }
         }
 }

// Fonction comparateur basique
unsigned char CopareValue(float Seuil, float Value)
{
        unsigned char Sortie =0;
        if (Value >=Seuil)
                Sortie =1;
        else
                Sortie=0;

        return Sortie ;
}

// Conversion d'une valeur entière en tableau binaire
void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray)
{
  int i=0;

  for(i=0;i<taille;i++)
    dataArray[taille-i-1]= (dataIn>>i)&0x01;
}

// Fonction de décalage des échantillons d'un tableau
void DataShiftArray(unsigned char NumShift,unsigned char taille,  unsigned char *DataIn, unsigned char *DataOutShift)
{
  int i=0;

  for(i=0;i<taille;i++)
    DataOutShift[i]= (DataIn[i]>>NumShift);
}
 
// SigProcArduino.c
#include <SigProcArduino.h>
#include "math.h"

float Moyenne(unsigned char NumMean,unsigned char taille,  unsigned char *DataIn)
{
        unsigned char i=0;
        float somme =0.0;
        for(i=0;i<NumMean; i++)
                somme+=DataIn[i];

        return somme/NumMean;

}

float Mediane(unsigned char taille,  unsigned char *DataSort)
{
        unsigned char MedValue = 0;
        //MedValue = DataSort[round((taille-1.0)/2.0)];

        return MedValue;
}

 void TableSort(unsigned char taille,  unsigned char *DataIn)
 {
         unsigned char  i, j, temp;
         for (i = 0; i < (taille - 1); ++i)
         {
                  for (j = 0; j < taille - 1 - i; ++j )
                  {
                           if (DataIn[j] > DataIn[j+1])
                           {
                                        temp = DataIn[j+1];
                                        DataIn[j+1] = DataIn[j];
                                        DataIn[j] = temp;
                           }
                  }
         }
 }

unsigned char CopareValue(unsigned char Seuil, unsigned char Value)
{
        unsigned char Sortie =0;
        if (Value >=Seuil)
                Sortie =1;
        else
                Sortie=0;

        return Sortie ;
}


void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray)
{
  int i=0;

  for(i=0;i<taille;i++)
    dataArray[taille-i-1]= (dataIn>>i)&0x01;
}

void DataShiftArray(unsigned char NumShift,unsigned char taille,  unsigned char *DataIn, unsigned char *DataOutShift)
{
  int i=0;

  for(i=0;i<taille;i++)
    DataOutShift[i]= (DataIn[i]>>NumShift);
}

// SigProcArduino.h
float Moyenne(unsigned char NumMean,unsigned char taille,  unsigned char *DataIn);
float Mediane(unsigned char taille,  unsigned char *DataSort);
void TableSort(unsigned char taille,  unsigned char *DataIn);
unsigned char CopareValue(unsigned char Seuil, unsigned char Value);
void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray);
void DataShiftArray(unsigned char NumShift,unsigned char taille,  unsigned char *DataIn, unsigned char *DataOutShift);

Photos du projet

  • Signal sin + seuil

Projet électronique FPGA 5 Générateur des signaux V1 - photos projets (2)

  • Résultat pour Signal sin + bruit non filtré 

https://www.electronique-mixte.fr/wp-content/uploads/2018/09/Projet-électronique-Traitement-du-signal-avec-Arduino-Seuillage-methode-1-2.jpg

  • Résultat pour Signal sin + bruit filtré 

Projet électronique Traitement du signal avec Arduino - Seuillage methode 1 (1)

************

Un petit commentaire de vous, un Grand encouragement pour nous ?

************

Téléchargement du projet

************

Une réponse sur « Projet électronique : Traitement du signal avec Arduino # Lissage & Seuillage d’un signal 3/3 »

Laisser un commentaire