Probleme régulation vitesse moteur CC

Bonjour,
Je commence mon premier projet avec un arduino : Démarrer un moteur suite à l'action sur un bouton poussoir, puis auto régulation de sa vitesse dans une plage Vconsigne +/- 20 tr/min.
Lorsque j'utilise mon programme arduino sans piloter la puissance moteur via une sortie PWM qui commute un MOSFET via un transistor (je vais varier manuellement la vitesse du moteur connecté directement sur une alim) ==> Tout se passe bien, le programme fonctionne et le port série m'affiche la vitesse.
Par contre, dés lors que je laisse la sortie PWM piloter le moteur, j'arrive à le démarrer, à l’arrêter, mais la vitesse affiche des valeurs hallucinante (parfois 1200 tr/min), et le port série se fige et plus rien n'est affiché. Il me faut relancer le programme arduino pour pouvoir de nouveau réouvrir une fenêtre du port série.
Je pense que comme la vitesse est basée sur un capteur infrarouge connecté sur la PIN 2 sur laquelle je compte les impulsions à l'aide d'une interruption, il doit y avoir des parasites qui sont compté comme une impulsion du capteur.
Comment peut-on surpprimer les parasites sur une entrée arduino (mon capteur sort un signal numérique 0 - 5V) ???

Je remercie par avance tous ceux qui pourront m'aider......

Laurent

Aucun code, aucun montage ... Comment espères-tu qu'on t'aide ??

Je pensais tout simplement que ma question sur l'antiparasitage etait suffisamment precise..... mais effectivement la solution peut dependre des composants choisis.... je fais un petit schema de mon montage et je le post dans la journee... merci de t'etre intéressé à mon probleme...

Si parasitage il y a, c'est que ton montage n'est pas parfait, et que donc pour le corriger il faut bien l'avoir sous les yeux :wink:

Mais je parierais plus pour un problème de code :slight_smile:

Bonjour,
Pouvez vous m'expliquer comment on insert une photo ici? et un code ? svp
Merci

Tu insères ton code entre ces balises [ code].... [ /code] avec le bouton #

Les photos sont à charger sur un serveur de ton choix, et tu indiques le lien entre balises [ img]http://mon serveur/mon dossier /ma photo .jpg[ /img]

Merci..
Alors l'image de mon càblage (le MOSFET est un IRF 540 BPBF). Le moteur à CC est un 200W fonctionnant sous 20V et donc 10A) ==>

Le code ==>

// Connexion du LCD sur les broches de la carte Arduino 
      // Connecter broche RS du LCD sur la broche 8 (gris)
      // Connecter broche E du LCD sur la broche 9 (orange)
      // Connecter broche D4 du LCD sur la broche 4 (vert)
      // Connecter broche D5 du LCD sur la broche 5 (bleu)
      // Connecter broche D6 du LCD sur la broche 6 (jaune)
      // Connecter broche D7 du LCD sur la broche 7 (mauve)
      // +LED retro éclairage sur sortie 3,3V (marron)
      // Alimentation +5V (rouge) - Masse (Noir)

// Connection de la LED attestant de la demande de démarrage moteur, Led allumée (ou arrêt = étteinte) sur D13 (Utilisation résistance interne ARDUINO)

// Connection de la sortie du capteur phot-sensible sur PIN 2 pour gestion interruption 0
// Connection de l'interrupteur "Action Opérateur" sur PIN 3 pour gestion interruption 1 - Interrupteur relié à la masse

// Sortie pour commande moteur 11


//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---
#include <Wire.h> // librairie standard
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
#include <SimpleTimer.h> // 

// --- Déclaration des constantes ---

// --- constantes des broches ---
int ledPin = 13;
int inter = 3;

const int RS=8; //declaration constante de broche 
const int E=9; //declaration constante de broche 
const int D4=4; //declaration constante de broche 
const int D5=5; //declaration constante de broche 
const int D6=6; //declaration constante de broche 
const int D7=7; //declaration constante de broche 

long vitesse = 0;
long chrono = 0; // valeur courante du chrono
long chrono_depart = 0; // valeur de départ du chrono
long duree_test = 2000; // test sur X milli secondes

SimpleTimer timer;

const int _Moteur = 11;

  
// --- Déclaration des variables globales ---
volatile long nb_chgt = 0; // nb de changement etat Pin 2 (interup 0)
volatile int Act_OP = 1; // etat Pin 3 (interup 1)
volatile int EtatLED = 0;

int cmd = 0; // commande du moteur

float consigne_Vaxe_tours_minute = 200; //Nombre de tour d'axe par minute
int Consigne_Atteinte = 0;
int Maintien_Alim = 0;

// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits


//**************** FONCTION SETUP = Code d'initialisation : La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme *****

void setup()    // debut de la fonction setup()
{
delay(1000);
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes 
delay(1000); // pause rapide pour laisser temps initialisation
// Test du LCD
lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(1000); // pause de 1 seconde
lcd.setCursor(0,0); // curseur début première ligne
lcd.print ("   Version du   ");
lcd.setCursor(0,1); // curseur début deuxième ligne
lcd.print ("   07_02_2014   ");
delay (4000);

lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran

pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
pinMode(inter,INPUT);
digitalWrite(inter,HIGH);

Serial.begin(115200); // initialise connexion série à 115200 bauds
pinMode (_Moteur, OUTPUT); // Sortie moteur PIN11
analogWrite (_Moteur, 255); // Sortie moteur à 0


lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes 
delay(10); // pause rapide pour laisser temps initialisation
lcd.setCursor(0,1);
lcd.print("Vaxe= 0   tr/min"); // affiche fixe de la chaîne texte

chrono_depart = millis();

attachInterrupt(0,gere_int0,CHANGE); // lance la procédure gere_int0 lors de la détection d'un changement sur interrup0 de la PIN2
attachInterrupt(1,gere_int1,LOW); // lance la procédure gere_int1 lors de la détection d'un changement sur interrup0 de la PIN3     
timer.setInterval (duree_test, Calcul_Vitesse); //interruption pour calcul de la vitesse de rotation de l'axe

}

// ********************************************************************************


void loop() // debut de la fonction loop()
{
  //Serial.println ("LOOP");

while (EtatLED == 1){
     Consigne_Atteinte = 2;
     lcd.setCursor(0,0);
     lcd.print(" Marche Moteur  ");
     Consigne_Atteinte = 0;
     Maintien_Alim = 0;
    
     while (Consigne_Atteinte != 1  && EtatLED == 1) {
       timer.run();
       delay (10);
     //  Serial.println ("Cherche_Atteindre_Consigne");
       analogWrite (_Moteur, 0); // Sortie moteur à 100%
       if (vitesse > consigne_Vaxe_tours_minute + 20) {
          Maintien_Alim = 1;
          Consigne_Atteinte = 1;
         }
      };
    
     while (Maintien_Alim == 1 && EtatLED == 1) {
       timer.run();
       delay (10);
       //Serial.println ("Maintien_Consigne");

       analogWrite (_Moteur, 200); // Sortie moteur à 50%
       if (vitesse < consigne_Vaxe_tours_minute - 20) {
         Consigne_Atteinte = 0;
         Maintien_Alim = 0;
         }
      };
}
   
while (EtatLED == 0){
   // Serial.println ("Arret_Moteur");

    analogWrite (_Moteur, 255); // Sortie moteur à 0
    timer.run();
    delay (10);
    if (nb_chgt != 0){ lcd.setCursor(0,0);
      lcd.print(" ARRET EN COURS ");
    }
    else { lcd.setCursor(0,0);
      lcd.print("   MMC ARRETEE  ");
      analogWrite (_Moteur, 255); // Sortie moteur à 0
     }
  }
}


// ********************************************************************************

// ------------------- fonction de gestion l'interruption externe n°0 (broche 2) ----------------
// cette fonction est appelée à chaque fois que l'interruption a lieu selon le mode configuré (LOW, CHANGE, RISING, FALLING)

void gere_int0() { 
    nb_chgt = nb_chgt + 1 ;  
}

void gere_int1() { 

   if (digitalRead(inter)==Act_OP) {
       if (EtatLED==0) EtatLED=1; else EtatLED=0; // inverse la variable etatLED
}
  if (EtatLED==1) { // si la variable vaut 1
    digitalWrite(ledPin,HIGH); // la LED est allumée
}
  else { // sinon, càd si la variable vaut 0
    digitalWrite(ledPin,LOW); // la LED est éteinte
 }  
}

// ********************************************************************************

void Calcul_Vitesse() {

     int chang = nb_chgt;
     nb_chgt = 0;
     lcd.setCursor(5,1); // curseur début deuxième ligne et 5ième colonne
     lcd.print("     "); // effacer la mesure précédente
   
     vitesse=1.05 * (((60000/duree_test) * chang) / 40);
  
     lcd.setCursor(6,1); // curseur début deuxième ligne    
     lcd.print(vitesse);
     Serial.println(vitesse);

}
// ********************************************************************************

// --- Fin programme ---

Merci pour votre aide.....

Laurent

Mosfet IRF 540 NPBF... pardon

Bonsoir... personne pour m'aider?.......

Laurent13:
Bonsoir... personne pour m'aider?.......

bonsoir
je prend là

Alors l'image de mon càblage (le MOSFET est un IRF 540 BPBF). Le moteur à CC est un 200W fonctionnant sous 20V et donc 10A) ==>
Mosfet IRF 540 NPBF

peut etre déjà voir là ?

Absolute Maximum Ratings
@ 25°C Power Dissipation 130 W

http://www.redrok.com/MOSFET_IRF540N_100V_33A_44mO_Vth4.0_TO-220.pdf

Bonsoir, et merci de t'interesser à mon probleme....
Ok effectivement il peut y avoir un soucis avec la capacite de dissipation du mosfet, faudra que j'en trouve un autre ==> une reference à me conseiller?
Par contre il doit y avoir autre chose, car meme sous 60W (20v - 3A) j'ai le meme probleme. Il n'y à pas une possibilité simple dejà de filtrer l'entree Arduino qui recoit les tops du capteur IR??
Merci encore car je seche vraiment et ca m'empeche d'avancer dans ma decouverte de l'arduino...
Laurent, un ch'ti à Marseille :wink:

Bonjour les Amis,
Par expérience, de tous les moteurs que j'ai utilisé avec un quelconque microcontrôleur les moteurs à courant continu sont de loin les plus teigneux au point de vue parasites.
Mis à part les moteurs CC sans collecteurs, qui sont des cas très particuliers, pour les autres, chaque fois que j’ai eu une masse commune, les parasites générés par le collecteur venait me perturber intensément les capteurs et le µP.
La seule façon que j’ai trouvé d’arriver à un contrôle à partir d’un processeur quelconque c’est d’alimenter le moteur à part. AUCUNE LIAISON FILAIRE entre carte processeur et Ensemble moteur.
Le seul lien est l’arrivée du secteur sur l’alimentation du microcontrôleur que j’immunise avec un filtre en PI sur le 220V et l’alimentation basse tension. J’ai également placé sur le fil secteur un anneau de ferrite magnétique.
Pour envoyer des consignes et recevoir des états issues de l’électronique coté moteur, des barrières de type optocoupleurs sont alors impératives.
Je sais que tout ce verbiage décrit des "solutions lourdes techniquement", mais je n’ai pas trouvé plus simple pour aboutir à un fonctionnement fiable.

P.S : Un filtre en PI est constitué d'une bobine de gros fil émaillé sur un noyau en ferrite de quelques tours placée en série dans chaque fils du secteur. Deux condensateurs sont alors placés entre les extrémités de ces bobines et la terre, et ça sur chaque bobine. Les condensateurs sont des 100nF par exemple, quand au nombre de spires ... expérimental ! Un oscilloscope à l'entrée de l'alimentation permet d'observer les parasites qui se superposent au 220V, mais il faut isoler la "caisse" de l'oscilloscope de la terre et prendre DE GRANDES PRECAUTIONS pour ne pas s'électrocuter quand on procède à ce genre de mesures. Ce n'est pas à la portée d'un électronicien débutant à mon sens, d'autant plus que tout le monde n'a pas d'oscilloscope à sa disposition.

Laurent13:
Bonsoir, et merci de t'interesser à mon probleme....
Ok effectivement il peut y avoir un soucis avec la capacite de dissipation du mosfet, faudra que j'en trouve un autre ==> une reference à me conseiller?
Par contre il doit y avoir autre chose, car meme sous 60W (20v - 3A) j'ai le meme probleme. Il n'y à pas une possibilité simple dejà de filtrer l'entree Arduino qui recoit les tops du capteur IR??
Merci encore car je seche vraiment et ca m'empeche d'avancer dans ma decouverte de l'arduino...
Laurent, un ch'ti à Marseille :wink:

bonsoir
quelle durée mini (donc vitesse max) le creneau renvoyé par le capteur opto ?
c'est quoi comme capteur ? lien ?

Bonjour,
Alors le capteur:
http://cgi.ebay.fr/ws/eBayISAPI.dll?ViewItem&item=281226390220&ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2649
La vitesse de l'axe du moetur est au maxi 350tr/min, j,ai un disque avec 40 secteurs (20 blancs et 20 noirs).
J'ai testé le capteur en alimentatnt le moteur directement avec une alim (donc sans liaison par les masses entre cette alim et l'arduino), le capteur suis sans probleme juste qu'à plus de 450tr/min. La vitesse a ete verifie avec un tachymetre laser.
On ne peut pas commander le moteur avec une autre electronique sans liaison des masses entre la puissance et la partie commande??
Merci

Bonsoir nulentout :wink: qui m'a l'air un tres bon bricoleur....
Vu ce que tu me dit, je me demande si je ne pourrais pas remplacer mon alimentation de puissance par des batteries de quad par exemple?? Si tu partages, comment puis je limiter le courant max de conso du moteur histoire de ne pas le griller??
Merci encore à ceux qui s'interesse à mon probleme.
Laurent

Personne pour me proposer un montage de commande d'un moteur cc sans masse commune????