Pages: [1]   Go Down
Author Topic: Sauvegarde d'une valeur de variable  (Read 1183 times)
0 Members and 1 Guest are viewing this topic.
Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Voilà je souhaiterais savoir si il est possible de sauvegarder la valeur d'une variable tous les "x secondes".

Je m'explique, j'ai une variable "rpm" qui est apparemment trop instable ou rapide (capteur magnétique KMZ) pour servir de référence pour différentes commandes (voir mes posts précédents), donc afin de pouvoir récupérer une valeur stable, l'idée serait de stocker tous les "x secondes" la valeur lue afin d'avoir une sorte de moyenne servant de référence pour différentes commandes (ex : arrêt moteur quand rpm=4000).

Merci pour votre aide.
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3019
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il vaut mieux faire une moyenne glissante sur plusieurs échantillons consécutifs
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

?? comment fait - on cela
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3019
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Plusieurs manières
 - un tableau contenant les N dernières valeurs et on fait la moyenne sur ces valeurs. A chaque nouvelle mesure on enlève la plus ancienne et on ajoute la nouvelle.
 - une moyenne pondérée. V = a * mesure + (1-a) * Vprécédent. Ce filtre dispense de gérer un tableau. En jouant sur la valeur de a on pondère plus ou moins l'influence de la dernière mesures par rapport aux précédentes.

Il y a eu un sujet là-dessus il y a peu de temps http://arduino.cc/forum/index.php/topic,132674.0.html
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci fdufnews  smiley
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Ou puis je trouver la librairie ipfilter () ?


merci
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3019
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pas ipfilter. C'est lpfilter. C'est une fonction elle est dans le code qui se trouve dans le lien que je t'avais mis un peu plus haut.
« Last Edit: December 10, 2012, 07:33:13 am by fdufnews » Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui c'est lpFilter mais est-ce une fonction déjà installée sur l'arduino, existe-elle sur chipKit Max32 ?
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

comment l'appliquer à ce code qui permet de lire et d'afficher la vitesse rpm :

Code:
unsigned byte rpmcount;
float rpm;

unsigned long timeold;

 void setup()
 {
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);
 }

 void loop() {
   if (rpmcount >= 20) {
     rpm = 60*1000/(millis() - timeold)*rpmcount;
     timeold = millis();
     rpmcount = 0;
   
         
   Serial.println(rpm);
   }

 void rpm_fun()
 {
   rpmcount++;
   //Each rotation, this interrupt function is run twice
 }

merci
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3019
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

comment l'appliquer à ce code qui permet de lire et d'afficher la vitesse rpm :
merci


Code:
unsigned byte rpmcount;
float rpm, rpmFiltre;
// Ajuster la valeur suivante entre 0 et 1.0
// plus la valeur est faible plus la mesure actuelle est prépondérante et donc le résultat suit de plus près les variations de l'entrée
// plus la valeur est élevée plus l'historique est prépondérant et donc les variations rapides de l'entrée sont atténuées
float coef = 0.5;

unsigned long timeold;

 void setup()
 {
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);
 }

 void loop() {
   if (rpmcount >= 20) {
     rpm = 60*1000/(millis() - timeold)*rpmcount;
     rpmFiltre = lpfilter(rpm, coef, rpmFiltre );
     timeold = millis();
     rpmcount = 0;
   
         
   Serial.println(rpm);
   }

 void rpm_fun()
 {
   rpmcount++;
   //Each rotation, this interrupt function is run twice
 }


float lpfilter(float data, float filterVal, float filteredVal){
  if (filterVal > 1){
    filterVal = .99;
  }
  else if (filterVal <= 0){
    filterVal = 0;
  }

  filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
  return filteredVal;
}


Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

super je te remercie par contre saurais tu comment je peux remettre la valeur rpmFiltre affichée à zero lorsque mon moteur ne tourne plus et comment afficher cette valeur sur un afficheur série ELCD 4 x 20  (lextronic) car cela fait des mois que je me bats avec ce bout de code et je n'y comprend rien. merci.

Pour la remise à zero j'ai essayé cela mais ca marche pas.

Code:
volatile byte rpmcount = 0;
float rpm, rpmFiltre = 0;
// Ajuster la valeur suivante entre 0 et 1.0
// plus la valeur est faible plus la mesure actuelle est prépondérante et donc le résultat suit de plus près les variations de l'entrée
// plus la valeur est élevée plus l'historique est prépondérant et donc les variations rapides de l'entrée sont atténuées
float coef = 0.99;

unsigned long timeold = 0;
unsigned long timeoldmesure = 0;

 void setup()
 {
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);
 }

 void loop() {
   if (rpmcount >= 20){
     rpm = 60*1000/(millis() - timeold)*rpmcount; 
     timeold = millis();
     rpmcount = 0.00;
   }
   
  if ((rpm > 100) && ((millis() - timeoldmesure)>1000)){
     rpmFiltre = lpfilter(rpm, coef, rpmFiltre );
  }
  else {
     rpmFiltre = 0;
  }   
     
   Serial.println(rpmFiltre);
 
 }

 void rpm_fun() {
   rpmcount++;
   //Each rotation, this interrupt function is run twice
 }


float lpfilter(float data, float filterVal, float filteredVal){
  if (filterVal > 1){
    filterVal = .99;
  }
  else if (filterVal <= 0){
    filterVal = 0;
  }

  filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
  return filteredVal;
}
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je m'aperçois egalement que la valeur rpmFiltre augmente avec le temps sans pour autant que mon moteur accélère ??

Logged

Pages: [1]   Go Up
Jump to: