Go Down

Topic: Reprise de projet, lecture RPM (tours par minute), moteur 4 temps (Read 1 time) previous topic - next topic

marcus_95

suivant ton programme avec l'interruption il faut la faire par changement niveau Haut vers niveau Bas.
J'ai pas regardé ton programme. (je ne suis pas bon en programmation).
;)

Brasiligun

Je vais essayer, mais je suis super content du résultat !

Avec le code de DFGH je vais essayer d'accelerer le programme

Mais je suis vraiment satisfait ! Merci franchement

marcus_95

Super,
oui Dfgh est très bon en programmation c'est lui qui m'a écrit le programme en assembleur pour mon boitier E85.

Artouste

Je vais essayer, mais je suis super content du résultat !

Avec le code de DFGH je vais essayer d'accélérer le programme

Mais je suis vraiment satisfait ! Merci franchement
:smiley-mr-green:



Pas vraiment bien compris ce que entend par là ?

Pour ce qui est du topic lui même :
- besoin initialement plutôt bien exposé
- réponses  exposées/commentées 

= peu de risque ici , ici de ne pas avoir de  réponses "utilisables" ;D



d'autant plus que la "periode EXAM" est teminée 8)
















Brasiligun

J'ai bien bossé dessus cet aprem, le programme fait exactement ce que je veux!

Je ferai une petite vidéo, équipé sur la moto que ça soit plus parlant pour vous


Quand je disais accélérer le programme, je voulais dire avoir mes acquisition RPM refresh plus rapidement pour transmettre à mon relais les bonnes informations le plus vite possible

J'ai modifié une ligne du code de DFGH, j'ai changé la ligne avec la valeur 10 par 3 (avec 2 aucuns résultats exploitables)


Ça marche carrément bien!


Code: [Select]

{
  if (compteur_injections==1){premiere_injection=micros();}
  if (compteur_injections>=10)
<- remplacé par 3
Code: [Select]


  {
    memo_compteur_injections=compteur_injections;
    compteur_injections=0;
    rpm=((60000000/((micros()-premiere_injection)/(memo_compteur_injections-2)))*2);

  }
}


Le coup de la période exam je n'ai pas trop compris :p Tu parles peut-être de jeune bachelier qui posent des questions en mode désespérés :p J'ai eu ma licence cette année, mais malheureusement, pas d'arduino ou de choses qui s'en approchent au programme


Je reposterai demain en fin de soirée ou Lundi mon montage ainsi que le code, avec une vidéo du montage en action que ça soit parlant. Et je suis toujours preneur de bon conseils ou d'optimisation de code


En tout cas, merci à tous d'être intervenus!

Brasiligun

Rebonjour! J'ai du partir plus vite que prévu pour le boulot dans une autre région, je n'ai pas eu l'occasion de vous poster une petite vidéo du montage  :smiley-cry:

Je rentre enfin demain dans ch'nord, et je vais pouvoir m'y remettre. J'en ai profité pour chopper un relais plus rapide, je me servais d'un Omron G5V1 (commutation entre 3 et 7ms), là, j'ai choppé un relais reed, un Celduc D31B3100 (commutation rebond inclus 1 - 1,5ms)

Le montage sera bien plus vif et performant!


Le but de tout ceci:

Lire le régime moteur: ok
Réussir à couper l'allumage du véhicule, sans le faire caler et en restant invisible au yeux de l'ECU: ok
Décaler le rupteur sur demande: ok

Maintenant, j'ai des doute concernant mon optimisation,

Le but est bien de lire mes RPM en continu, et quant le moteur arrive au seuil, 4000 Tr/min pour l'exemple, l'arduino allume mon relais, puis le coupe pour que la moto remonte à 4000, re-coupure et ainsi de suite

Petit exemple, pour rendre notre cas parlant:

Voila le code:

Code: [Select]

//Definition des variables
volatile byte compteur_injections = 0;
byte memo_compteur_injections = 0;
unsigned long premiere_injection = 0;
int rpm = 0;


int injecteur_Pin = 2; // Signal d'un injecteur
const int ignitionCoilPin =  6; // pin de controle du relais/shifter


int launch = 4000; // Decalage rupteur a: XXXX tr/min
int step = 25 * 1000; // stepper


void setup()
{
  Serial.begin(115200);
  attachInterrupt(0, comptage_injections, RISING);
  premiere_injection = micros();
  pinMode(2, INPUT_PULLUP);

  pinMode(ignitionCoilPin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT); //Led interne, juste pour contrôler le fonctionnement

  digitalWrite(ignitionCoilPin, LOW); //Niveau BAS = fonctionnement normal de la moto, pas de coupure au démarrage
  digitalWrite(LED_BUILTIN, LOW);
}


void loop()
{
  readRpm();
  Serial.println(rpm);

  if (rpm >= launch)
  {
    // cut power to ignition coil for some milliseconds.
    digitalWrite(ignitionCoilPin, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
    delayMicroseconds(step);

    digitalWrite(ignitionCoilPin, LOW);
    digitalWrite(LED_BUILTIN, LOW);
    delayMicroseconds(step);
  }
}


//Fonctions
void readRpm() {
  if (compteur_injections == 1) {
    premiere_injection = micros();
  }
  if (compteur_injections >= 3)
  {
    memo_compteur_injections = compteur_injections;
    compteur_injections = 0;
    rpm = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2)))) * 2;
  }
}

void comptage_injections()
{
  compteur_injections++;
}



Voyez-vous une quelconque amélioration/optimisation de code encore possible? Mais je suis certain que ce nouveau relais va justement me permettre d'être beaucoup plus "agressif" et rapide dans mon contrôle d'allumage

Je pense également, que le fait des faire delayMicroSeconds(step)  n'est peut-etre pas judicieux, en lisant ceci

Le but de ma dernière démarche, est de garder le maximum de vitesse d'execution


Merci!  :smiley-evil:

dfgh

hello
un code pour démarrer la discussion
j'ai volontairement utilisé un "while", car je pense que pendant la coupure, il est inutile de continuer à compter le régime moteur.
Code: [Select]

#define  injecteur                     2 //signal à capter et compter 
#define  relais_coupure                6 //relais coupure allumage
#define  led_relais                   13 //led témoin etat relais
volatile byte compteur_injections =    0;//compteur du signal à capter
byte memo_compteur_injections     =    0;//memorisation du compteur
int seuil                         = 4000;//seuil de la coupure d'allumage
unsigned long premiere_injection  =    0;//debut premiere injection
unsigned long deb_tempo           =    0;//debiut tempo cde relais coupure
unsigned long tempo               =   25;//durée de la coupure par relais
void setup()
{
  attachInterrupt(0, comptage_injections, RISING);
  premiere_injection=micros();
  pinMode(2,INPUT_PULLUP);
  pinMode(relais_coupure, OUTPUT);
  pinMode(led_relais, OUTPUT); //Led interne, juste pour contrôler le fonctionnement

  digitalWrite(relais_coupure, LOW); //Niveau BAS = fonctionnement normal de la moto, pas de coupure au démarrage
  digitalWrite(led_relais, LOW);
}
 
void loop()
{
  if (compteur_injections==1){premiere_injection=micros();}
  if (compteur_injections>=10)
  {
    memo_compteur_injections=compteur_injections;
    compteur_injections=0;
    if(((60000000/((micros()-premiere_injection)/(memo_compteur_injections-2)))*2)>seuil)
    {
      cli();                                //si compteur > seuil, on arrete de compter le regime moteur
      deb_tempo=millis();                   //on saisit le temps
      while((millis()-deb_tempo)<tempo)     //et tant que le temps est < tempo
      digitalWrite(relais_coupure, HIGH);   //on colle le relais de coupure de l'allumage
      digitalWrite(led_relais, HIGH);       //on allume la led temoin de l'etat du relais
      };                                    //le temps "tempo" est passé
      digitalWrite(relais_coupure, LOW);    //on relache le relais de coupure d'allumage
      digitalWrite(led_relais, LOW);        //on eteint la led temoin de l'etat du relais
      sei();                                //on autorise à nouveau le comptage du regime moteur
  }
}

void comptage_injections()
{
  compteur_injections++;
}

Brasiligun

Bonjour dfgh,


Superbe démarche! Je ne connaissais pas du tout cli() et sei(). C'est la que je vois la différence, je sais "bidouiller" dans mon coin mais t'es vraiment un monstre dans le domaine  :smiley-eek:


Je m'étais permis après ta toute 1ère version, de faire une légère modif pour accélérer au mieux l'acquisition des RPM. J'avais du modifier le
Code: [Select]
if (compteur_injections>=10) en
Code: [Select]
if (compteur_injections>=3)

Avec le 10 l'acquisition était avec l'ancienne forme, un peu trop molle, et avec le 3 c'était vraiment pas mal (avec un 2 plus aucun résultats). Penses-tu qu'avec ta nouvelle proposition, je vais devoir faire la même petite modif ou comme la méthode est différente, la réactualisation des RPM sera plus vive?


En tout cas un grand merci, je suis toujours en Normandie, je rentre ce soir et je suis pressé d'essayer en vrai

dfgh

hello
tu fais la même modif que celle que tu avais déjà faite.
bon courage et reviens nous dire...

Brasiligun

hello
tu fais la même modif que celle que tu avais déjà faite.
bon courage et reviens nous dire...
C'était pour être certain :p Si j'ai reçu mon autre relais, petit test demain avec vidéo bien sur!


Bonne fin de journée

Brasiligun

Petit test ajd, et malheureusement la version 2 de programme ne marche pas :/

Passé les 4000 tr, ma moto cale et c'est fini. Pour moi le relais passe en position ouverte et il y reste

dfgh

oups, j'ai oublié les accolades du while. milles excuses

je te laisse modifier le HIGH/LOW de la cde du relais
Code: [Select]
#define  injecteur                     2 //signal à capter et compter 
#define  relais_coupure                6 //relais coupure allumage
#define  led_relais                   13 //led témoin etat relais
volatile byte compteur_injections =    0;//compteur du signal à capter
byte memo_compteur_injections     =    0;//memorisation du compteur
int seuil                         = 4000;//seuil de la coupure d'allumage
unsigned long premiere_injection  =    0;//debut premiere injection
unsigned long deb_tempo           =    0;//debiut tempo cde relais coupure
unsigned long tempo               =   25;//durée de la coupure par relais
void setup()
{
  attachInterrupt(0, comptage_injections, RISING);
  premiere_injection=micros();
  pinMode(2,INPUT_PULLUP);
  pinMode(relais_coupure, OUTPUT);
  pinMode(led_relais, OUTPUT); //Led interne, juste pour contrôler le fonctionnement

  digitalWrite(relais_coupure, LOW); //Niveau BAS = fonctionnement normal de la moto, pas de coupure au démarrage
  digitalWrite(led_relais, LOW);
}
 
void loop()
{
  if (compteur_injections==1){premiere_injection=micros();}
  if (compteur_injections>=10)
  {
    memo_compteur_injections=compteur_injections;
    compteur_injections=0;
    if(((60000000/((micros()-premiere_injection)/(memo_compteur_injections-2)))*2)>seuil)
    {
      cli();                                //si compteur > seuil, on arrete de compter le regime moteur
      deb_tempo=millis();                   //on saisit le temps
      while((millis()-deb_tempo)<tempo)     //et tant que le temps est < tempo
      {
      digitalWrite(relais_coupure, HIGH);   //on colle le relais de coupure de l'allumage
      digitalWrite(led_relais, HIGH);       //on allume la led temoin de l'etat du relais
      };                                    //le temps "tempo" est passé
      digitalWrite(relais_coupure, LOW);    //on relache le relais de coupure d'allumage
      digitalWrite(led_relais, LOW);        //on eteint la led temoin de l'etat du relais
      sei(); 
    }//on autorise à nouveau le comptage du regime moteur
  }
}

void comptage_injections()
{
  compteur_injections++;
}

Brasiligun

Pas de soucis :p J'ai vu les accolades mais ne connaissant pas Cli et Sei je préfère avoir ton aval

Aller je retourner sur le brélon, on va voir si ça marche :p

Artouste

Pas de soucis :p J'ai vu les accolades mais ne connaissant pas Cli et Sei je préfère avoir ton aval

Aller je retourner sur le brélon, on va voir si ça marche :p
8)

les joies du déverminage/debugage collaboratif asynchrone

Brasiligun

8)

les joies du déverminage/debugage collaboratif asynchrone
Grave! Mais c'est ça qu'on aime !

Malheureusement ce fourbe de relais reste ouvert

Je dois recompiler le programme pour qu'il repars fermé

Go Up