Driver Stepper Motor 5 phases Pentagon.

Bonjours a tous!

Commençons par le début... Je suis perdu! ^^ bref

Je fait beaucoup de recherches sur le sujet des moteur pas à pas 5 phases! ce qui m’amène a plusieurs solutions

1) EIC4101(IC controle) + EIC4081 et EIC4091 (POWER) -> Très bonne solution! Mais datasheet introuvable, j'ai contacté le fournisseur afin d'avoir les documents. toujours dans l’attente.

2) PMM8714PT avec PMM5301 driver -> Trop cher et un peu plus difficile a mettre en oeuvre

3) SI7510 controler avec SLA5073 & SLA5074 driver -> Controleur introuvable a prix resonnable!

Ce qui m'amène a la dernière solution. La solution Microcontrôleur!

Je possède un moteur PAP SANYO DENKI 103H7521-7051.

  • J'ai donc construit une interface de puissance avec des PMOS, 10*IRF9540N Comme le site ORiental motor le présente: Link

Et ça marche! Problème mes transistor ont commencé a fumer ^^

  • Deuxième idée mettre en haut des PMOS et bas des NMOS, baah pareil fumé!

  • Dernière idée: je met que des NMOS, puis des LEDs pour vérifier mes phases de commandes -> Aucune réaction du moteur ... voici mon programme :

///////////////////////////////////////////
///////                             ///////
//////    STEPPER MOTOR 5 PHASES    //////
//////                             ///////
/////////////////////////////////////////

 /// transistor N MOS 

const int VOHGA = 13;
const int VOHGB = 3;
const int VOHGC = 4;
const int VOHGD = 5;
const int VOHGE = 12;
const int VOLA  = 7;
const int VOLB  = 8;
const int VOLC  = 9;
const int VOLD  = 6;
const int VOLE  = 11;
    
     int STEP;
     int delaytime;
     int a =500;
     
void setup() {
 Serial.begin(9600);
  pinMode(VOHGA, OUTPUT);
  pinMode(VOHGB, OUTPUT); 
  pinMode(VOHGC, OUTPUT); 
  pinMode(VOHGD, OUTPUT); 
  pinMode(VOHGE, OUTPUT);   
  pinMode(VOLA, OUTPUT);
  pinMode(VOLB, OUTPUT); 
  pinMode(VOLC, OUTPUT); 
  pinMode(VOLD, OUTPUT); 
  pinMode(VOLE, OUTPUT);     
}

void loop(){

     // 1000000110
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, LOW);
      delay(a);
      // 1100000010
      
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, LOW);
      delay(a);    
      
      // 0100000011
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, HIGH);
      delay(a);    
      
      // 0110000001
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, HIGH);
      delay(a);    
      
      // 0010010001
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, HIGH);
      delay(a);      
      
      // 0011010000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
     // 0001011000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);     
      
      // 0001101000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
      // 0000101100
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
      // 1000100100
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
  }

Si vous avez des idées a me proposer...

Merci de bien vouloir m'aider,

Julien RAUCH

salut Julien, - si les transistors fument et heureusement pas le moteur, c'est qu'à un moment les 2 transistors d'un même demi-pont sont commandés en même temps (court-circuit!), donc, soit une erreur dans la séquence, soit l'absence d'un temps mort entre les transitions (le P est passant alors que le N n'est pas encore entièrement coupé). - il serait bien de limiter le courant pour préserver le moteur ... et mes mosfets à+, Marc

comment commandes-tu les 2 transistors d'un même 1/2 pont ?

Merci de suscité de l’intérêt pour mon problème!

  • La solution NMOS PMOS, je l'ai laissé de coté! (utilisé par manque de moyen)

  • Du coup je suis avec que des NMOS! (IRF530N) Comme sur le schémas ci dessous..

Pour le montage j'ai fait cela:

Pour la séquence j'ai fait cela:

Puis mon code reprend le même nom pour les entrée/sortie...

Salut,

1 - Quelle tension utilises-tu pour alimenter ta puissance (Vc)? 2 - si tu mets des NMOS en haut, as-tu pensé qu'il faut une tension supérieure à Vc (de 10V au moins) pour commander les grilles?

Sinon, une résistance de 1 ohm entre le 0v de ton driver et le GND de l'alim, branché sur oscillo pour surveiller le courant (dans ce cas, 1V => 1A).

les moteurs PAP, c'est pas si évident à comprendre, contrairement à un moteur cc...

le sens de ma 2ème question est "comment attaques-tu, notamment, les NMOS H, constituant la partie P du 1/2 pont ?"

Car il faut un driver et une tension supérieure à Vc ! Pour VOLn, c'est simple : VOLn = L = 0V, et respectivement VOLn = H = +5V Mais pour VOHn, c'est compliqué, il faut : VOHn = L = Vc, et respectivement VOHn = H = Vc + 5V ! Dans le montage décrit, il y a une pompe de charge pour générer le fameux Vc + 5V.

Sans cela le montage pourrait "marchouiller" mais le NMOS H, appelons-le ainsi, se comporte en résistance, chauffe et fume !

Peux-tu nous : - dessiner ton interface entre l'arduino et les MOS - confirmer que ce sont les NMOS H qui sont morts alors que les NMOS L sont indemnes ?

  • @trimarco232: Ah pardon j’avais pas compris le sens de ta question.

Donc pour répondre a ta question, bah j’ai mis direct les 10 Pin de l’arduino sur les 10 transistors directement …
Lorsque j’utilisé les montage P (VOH) en haut et N (VOL) en bas oui ce sont les N qui ont pris cher
Mais dans le dernière montage (Avec que des) personne donne signe de vie! Et c’est sur ce montage que je voudrais travailler.

  • @Super_Cinci : j’utilise une tension de 12V a défaut d’avoir les 24V… mais j’ai réussi a faire tourné le moteur par je ne sais quel miracle avec 12V(Et le montage Pmos Nmos en chaleur)!

Donc si j’ai bien compris il me faut une mini interface entre l’Arduino et les entrées VOHn?
Vcc suffit ou il me faut vraiment Vcc+ 5v?

Par contre j’ai pas compris le pourquoi… en principe c’est VGS < VDS + VT non ?

Merci de votre aide! ça fait plaisir.

Ok c'est bon j'ai compris le pourquoi!

Je propose d'utiliser le ULN2003a pour driver les entrées des transistors du haut.

D'un point de vue Electronique: Est-il préférable d'utilisé que des transistor N-MOS Ou est-il préférable d'utilisé des P-MOS en haut et des N-MOS en bas ? (Pour genre du CMOS?)

  • ULN2003 avec 1 résistance en série et une résistance de pull up à Vc
  • PMOS en haut (ça évite d'avoir recours à une tension > Vc) ; NMOS en bas ... et ça doit marcher !

D’ac, merci beaucoup de l’aide!

J’ai une dernière question au niveau des delay!
Quel temps je doit attendre entre chaque step?

Sachant que mon but final c’est que mon driver ai les mêmes caractéristiques qu’un driver Pololu A4983, avez vous des suggestions, conseils ou autres?

Enfin si j’obtiens les mêmes caractéristiques en principe ce driver serais compatible avec les Ramps 1.4 …

Salut,

Pas sûr que le ULN2003 suffise. Il te faut une tension de commande des NMOS du haut d'au moins 12V, et quand tu passeras en 24v, ça veut dire qu'on atteint les 36v. Tension un peu limite pour les VGS des mos courants.

Pourquoi ne pas plutôt investir dans des drivers de demi ponts, genre IRS2186, qui te permettent d'attaquer directement tes mosfets, puisque c'est fait exactement pour ce dont tu as besoin. (entrées TTL, sorties spécial NMOS).

J'ai longtemps cherché à faire tourner des ponts de la sorte, mais ça tourne très vite à l'usine à gaz, alors que des composants touts faits existent pour moins cher que ce qui risque de dégager en cas de mauvais calculs...

Merci à toi!

Donc en gros j'ai deux solutions! Soit je reste sur du N-MOS partout et j'utilise le driver de N-MOS IRS2186 Soit je met de P-MOS et du N-MOS et j'utilise le ULN2003 pour driver les P-MOS

J'ai une question au niveau des delay! Quel temps je doit attendre entre chaque step?

Sachant que mon but final c'est que mon driver ai les mêmes caractéristiques qu'un driver Pololu A4983, avez vous des suggestions, conseils ou autres?

Enfin si j'obtiens les mêmes caractéristiques en principe ce driver serais compatible avec les Ramps 1.4 ...

Pour les délais, tu peux prendre très simple: avant de changer de pas, tu mets tout à 0 (aucun mos conducteur) et tu attends un certain temps, par exemple 1.5 à 2 x le Toff du plus lent de tes transistors. Ainsi, tu t'assures qu'il n'y a plus aucun transistor qui pourrait entrer en conflit avec un autre...

La plupart des systèmes utilisent un shunt et quelques portes logiques qui interdisent la commande d'un transistor si son opposé est encore passant. Ce qui est étonnant, c'est que le µC pourrait s'en charger, mais ils mettent cette fonction en hard en dehors du µC, certainement parce que l'électronicien n'a pas confiance envers le programmeur, et ça se comprend...

Merci beaucoup! :)

concernant les délais, je pense que c'est inutile : si tu regardes le séquencement, il n'y a pas de risque de conflit entre les 2 transistors d'un même demi-pont

Fais nous quand-même connaître le résultat final, merci !

Bonjours c'est encore moi!

j'ai reçu mon ULN2003, je câble, je programme, et ça fonctionne pas...

A savoir que pour le ULN2003, le signal d'entrée est complémenté en sortie (0 ---> 1) , je raisonne comme si tous les transistor était des N-MOS.

Voici mon montage: Schéma

et voici mon programme:

const int VOHGA = 13;
const int VOHGB = 3;
const int VOHGC = 4;
const int VOHGD = 5;
const int VOHGE = 12;
const int VOLA  = 7;
const int VOLB  = 8;
const int VOLC  = 9;
const int VOLD  = 6;
const int VOLE  = 11;
    
     int STEP;
     int delaytime;
     int a =1000;
     
void setup() {
 Serial.begin(9600);
  pinMode(VOHGA, OUTPUT);
  pinMode(VOHGB, OUTPUT); 
  pinMode(VOHGC, OUTPUT); 
  pinMode(VOHGD, OUTPUT); 
  pinMode(VOHGE, OUTPUT);   
  pinMode(VOLA, OUTPUT);
  pinMode(VOLB, OUTPUT); 
  pinMode(VOLC, OUTPUT); 
  pinMode(VOLD, OUTPUT); 
  pinMode(VOLE, OUTPUT);     
}

void loop(){

     // 1000000110
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, LOW);
      delay(a);
      // 1100000010
      
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, LOW);
      delay(a);    
      
      // 0100000011
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, HIGH);
      digitalWrite(VOLE, HIGH);
      delay(a);    
      
      // 0110000001
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, HIGH);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, HIGH);
      delay(a);    
      
      // 0010010001
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, HIGH);
      delay(a);      
      
      // 0011010000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, HIGH);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
     // 0001011000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, LOW);
      digitalWrite(VOLA, HIGH);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);     
      
      // 0001101000
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, HIGH);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, LOW);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
      // 0000101100
      digitalWrite(VOHGA, LOW);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, HIGH);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
      
      // 1000100100
      digitalWrite(VOHGA, HIGH);
      digitalWrite(VOHGB, LOW);
      digitalWrite(VOHGC, LOW);
      digitalWrite(VOHGD, LOW);
      digitalWrite(VOHGE, HIGH);
      digitalWrite(VOLA, LOW);
      digitalWrite(VOLB, LOW);
      digitalWrite(VOLC, HIGH);
      digitalWrite(VOLD, LOW);
      digitalWrite(VOLE, LOW);
      delay(a);      
  }

Si vous avez des idées?

Bonjours!

Apres une journée de recherches acharné, je reviens vers vous!
je décide de reprendre la base, deux transistors, P et N, complémentaire!

Sur le première schémas, j’envoie donc un “0” pour saturé le P-MOS et un “0” pour bloqué le transistor N-MOS : résultat la LED s’allume! pas de soucis

Deuxième montage: Transistor P-MOS à “1” '(12v) pour le bloqué et le N-MOS à “1” (5v) ou le saturé, Magnifique ça fonctionne, on as bien une DDP de 12v, super!
après je décide d’éteindre la LED en fermant le N-MOS (à “0”), et je vois une LED allumé! je mesure DDP de 5V (entre VCC et le drain)!
Donc j’en conclu un Vds de 7v pour le transistor P

Questions:

  1. Es ce que c’est normale? (surement oui)
  2. Au vu de mon schémas complet, es ce que c’est a cause de ce phénomène que mon moteur ne tourne pas ?
  3. y’a t’il une solution?

Merci de consacré un peu de temps sur mon problème.

sch1.png

sc2.png

Ton montage est bon, à voir comment tu gères ça...

je prends l'exemple d'un seul demi-pont (une paire N et P) :

au repos, il y a 1 sur le P et 0 sur le N : OK

Pour activer ton pont, tu inverses la commande de l'un des transistor, selon le potentiel voulu en sortie : OK.

Mais :

  • Tu ne dois jamais avoir les deux transistors passants en même temps, sinon, fais le 18 (ou le 112 sur portable).
  • si tu décides d'inverser subitement le potentiel de sortie, je te conseille de passer par un "repos" pendant une petite µs, histoire de ne pas tout cramer (ça va très vite, surtout si ton alim 12V est en forme). La doc du 32U4 du leonardo explique ça un peu sous le terme "dead time", car le léonardo est prévu pour commander des ponts...

Bonjours,

Merci, @Super_cinci

J’ai pris tes conseils en considération depuis les premiers Post, pour le temps mort.
J’ai mis une microsecondes entre chaque Step. donc le problème ne viens pas de la.
J’ai refait un nouveau montage avec des résistance de Pull Up pour ne pas avoir de HIZ (états haute impédance).
J’ai remarqué que un de mes Transistor chauffé donc je l’ai remplacé! plus personne ne chauffe, je pense que niveau montage je suis au Top! Et pourtant…

J’ai vérifier la table de vérité du site Orientale motor, dessins des chronogrammes pour chaque phase! elle me parait plus que pertinente.
Mon programme correspond à la table de vérité…

Symptômes : bruit aigu

Je sais que mon moteurs fonctionne en principe en 24V, et que je l’alimente en 15V mais je pense pas ce soit le problème.
Transistor pas adapté? Pourtant bande passante sympa et fort courant de drain…
Mauvais branchement des phases?

Je suis ouvert à toute propositions concernant mon problème bien-sur :wink:

Bon on va considérer que je me trompe sur l’ordre des phases!
Je prend la doc constructeur:
cf “datasheet”

et es ce que j’ai le droit de me dire ça?
cf “ce_que_je_comprend”

par exemple pour l’étape 1:

  • phase A négative (par rapport a mes petites flèches)
  • phase B ddp nul
  • phase C positive
  • phase D négative
  • phase E positive

Aiguillez moi, s’il vous plait!