Il aurait été possible que l’Arduino lise un signal carré extérieur et de faire une sortie analogique des valeurs sur une PWM pour démontrer l’utilisation d’un filtre numérique sur un oscilloscope avec une routine d’interruption de 1ms pour faire les calculs du filtrage qui a été présenté précédemment.
Mais, nous avons utilisé juste le terminal pour observer les calculs du filtre et vérifier que le float avec ces 7 chiffres significatif fonctionne bien comme on peut l’observer sur le code suivant qui ont été placé dans Excel pour observer les dynamiques du filtre.
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <avr/wdt.h> //chien de garde
//#include "LowPower.h" //https://github.com/rocketscream/Low-Power
LiquidCrystal lcd(9, 8, 4, 5, 6, 7); // LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Configuration des variables
unsigned int temps=0;
float entree=0;
float sortie=0;
// Filtre numerique premier ordre
void setup() {
Timer1.initialize(1000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
lcd.begin(16, 2); //modifier pour un afficheur 20x4
Serial.begin(9600);
TCCR2B = (TCCR2B & 0b11111000) | 0x01; //pin 10 32khz http://playground.arduino.cc/Main/TimerPWMCheatsheet
//wdt_enable(WDTO_15MS);
}
// Interruptions tous les 0.001s fait par le timer1***********************************
void callback() {
temps++;
sortie=entree*0.008+sortie*0.992; //filtre passe pas
Serial.print(temps);
Serial.print(";");
Serial.print("\t");
Serial.print(entree);
Serial.print(";");
Serial.print("\t");
Serial.print(sortie,2);
Serial.print("\t");
Serial.println(";"); //mise à la ligne
//wdt_reset();
}//fin routine
///////////////////////////////////////////// Boucle correspondant à la fonction main
void loop() {
if (temps>=50) //1=singnal carré de 100ms
{
temps=0; //reset : attention cette boucle doit etre infereir à son temps d'execution
if (entree==16384) {entree=0;} else {entree=16384;}
}//temps>100
} // fin loop
Avec le terme 0.91 du filtre échantillon à 1ms, On peut observer que la constante de temps est environ celle théorique de 10ms, pour une amplitude de 1023 de l’entrée (10bits).
Avec le terme 0.98 du filtre échantillon à 1ms, On peut observer que la constante de temps est légèrement inférieure à la valeur théorique de 50ms, pour une amplitude de 16384 (14bits) de l’entrée.
Lorsque la constante de temps devient très grande devant la période du signal, la sortie du filtre donnera une oscillation avec une amplitude correspondant à l’équation suivant autour de la valeur moyenne du signal d’entrée
Avec le terme 0.992 du filtre échantillon à 1ms, la constante de temps theorique
on peut observer que l’amplitude
Donc, il y a des petites différences entre la théorique et la pratique mais globalement, cela fonctionne correctement.
Remarque : ne jamais depasser la valeur de 1, sinon c'est instable, d'ou l'obligation de declarer en float
faut il des bibliotheques filtre pour cela ? ? ? ? ? ? ? ?
https://playground.arduino.cc/Code/Filters/