Oui, avec le programme du post#7.
Pour voir ce qui se passait sur le L297 et le L298 quand j'envoie des salves, j'ai déconnecté le moteur et branché les sorties du L297 à l'Arduino. C'est du 5v, pas de souci. Puis j'ai testé avec le même programme les sorties du L298 avec un diviseur de tension cette fois : c'est du 20V. Le programme suivant relève l'état de ces sorties.
//enregistrement des sorties du l297
//
byte pinPas = 7;
byte pinDp = 8;
byte pinL297A = 6;
byte pinL297B = 9;
byte pinL297C = 10;
byte pinL297D = 11;
byte pinEnPap = 17;//carte pap, réduit et en
byte pinSens = 18;
//déclaration pour le test
int PASTOT= 1920; //40 tours de pap
int SALVE;//longueur de salve
int delai;//vitesse du pas
int intersalve;//attente ente deux salves
int PAS;
int A;
int B;
int C;
int D;
//Déclarations générales
int octet;
bool flagok=false;
int I;
void setup(){
//choix du programme à exécuter
pinMode(pinL297A,INPUT);//utilisé pour la sortie A du L297
pinMode(pinL297B,INPUT);//B
pinMode(pinL297C, INPUT);//C
pinMode(pinL297D,INPUT);//D
pinMode(pinDp,INPUT);
pinMode(pinSens, OUTPUT);
pinMode(pinPas, OUTPUT);
pinMode(pinEnPap, OUTPUT);
digitalWrite(pinSens,LOW);
digitalWrite(pinPas, LOW);
digitalWrite(pinEnPap, LOW);
Serial.begin(9600);
}
void loop() {
Serial.println("TESTS L297");
Serial.println("");
//Choix de la vitesse PAP
Serial.print("Vitesse du PAP en µs : ");
delai=recepnbr();
Serial.println(delai);
//Choix du délai intersalve
Serial.print("Intervalle entre deux salves (ms) : ");
intersalve=recepnbr();
Serial.println(intersalve);
//Choix de la salve
Serial.print("Nombre de pas par salve : ");
SALVE=recepnbr();
Serial.println(SALVE);
Serial.print("Nombre de pas : ");
Serial.println(PASTOT);
Serial.println("");
Serial.print("Etat pour le L297 pour ");
Serial.print(" à la vitesse de ");
Serial.print(delai);
Serial.print(" µs/pas et un inter-salve de ");
Serial.print(intersalve);
Serial.println(" ms. Dp pour commencer.") ;
while(digitalRead(pinDp)==LOW){//attente
delay(100);
}
PAS=0;
A=digitalRead(pinL297A);
B=digitalRead(pinL297B);
C=digitalRead(pinL297C);
D=digitalRead(pinL297D);
digitalWrite(pinEnPap,LOW);
Serial.print("départ");
Serial.print('-') ;
Serial.print(A);
Serial.print('-') ;
Serial.print(B);
Serial.print('-') ;
Serial.print(C);
Serial.print('-') ;
Serial.println(D);
while(PAS<=PASTOT){
digitalWrite(pinEnPap,HIGH);
for(I=1;I<=SALVE;I++){
digitalWrite(pinPas,LOW);
delayMicroseconds(delai);
digitalWrite(pinPas,HIGH);
delayMicroseconds(delai);
}
//récupérations des sortie L297 en fin de salve
A=digitalRead(pinL297A);
B=digitalRead(pinL297B);
C=digitalRead(pinL297C);
D=digitalRead(pinL297D);
digitalWrite(pinEnPap,LOW);
Serial.print(PAS);
Serial.print('-') ;
Serial.print(A);
Serial.print('-') ;
Serial.print(B);
Serial.print('-') ;
Serial.print(C);
Serial.print('-') ;
Serial.println(D);
PAS+=SALVE;
delay(intersalve);
}
}
int recepnbr(){
bool flagok=false;
int octet=0;
int NBR=0;
while(flagok==false){
while(Serial.available() > 0){
octet=Serial.read();
if((octet=='\r')||(octet=='\n')){
flagok=true;
break;
}
else {
octet=octet-48;
if(octet<=9 && octet>=0){
NBR=NBR*10 + octet;
}
}
}
}
return NBR;
}
Les résultats sur le moniteur montrent que ces circuits respectent bien les consignes. Exemple sur le test du L298 pour des salves de 47 pas
799-1-0-1-0
846-0-1-1-0
893-0-1-0-1
940-1-0-0-1
987-1-0-1-0
1034-0-1-1-0
le premier nombre indique le numéro de pas. La séquence est conforme aux attentes.
Donc le circuit électronique est innocent. Le programme aussi me semble-t-il. Reste la mécanique... je rappelle que l'axe du moteur est prolongé par une vis sans fin et qu'un écrou sur cette vis entraine le guide-fil. Je rappelle aussi que le couplage avec le guide-fil ne semble pas en cause puisque le problème du fonctionnement erratique persiste avec un second moteur non monté.
Je ne suis pas très calé en mécanique. Quelqu'un aurait une idée ?
merci
Bonsoir alain70
C'est pas dans mes habitudes de contester le choix du demandeur, mais, dans ton cas, je trouve ce couple L297/L298 bien compliquée à mettre en œuvre.
Avec un simple A4988, tu pourrai réaliser le job en utilisant une bibliothèque comme AccelStepper.
A titre d'information, j'ai demandé un programme à ChatGPT, dans ce chat, dans la question, j'ai mis un bouton qui remplace ton capteur de fente, pour des raisons pratiques. Si tu remplaces le bouton par ton lecteur de fente tu n'as rien à changer au programme. L'usage de cette bibliothèque OneButton pour lire ton capteur, assure une lecture très stable. Le moteur est géré par AccelStepper.
Remarque la simplicité du sketch.
A+
Cordialement
jpbbricole
Merci pour ta réponse jpbbricole. Et merci de m'avoir fait découvrir une façon intéressante d'utiliser Chatgpt !
Le programme que j'utilise pour bobiner ressemble fort à celui de Chatgpt, sauf que j'ai renoncé à utiliser AccelStepper : mon moteur n'a que 48 pas par tour, les fils à bobiner sont fins (0.1 à 0.8 mm) donc le nombre pas trop faible pour utiliser efficacement l'accélération (je me trompe ?). Et le nombre de pas n'est pas constant : il faut parfois ajouter un pas pour compenser l'écart dû aux arrondis des calculs. Mais c'était mon plan B.
Cependant je viens de voir qu'en abaissant la tension d'alim du moteur et en augmentant la durée d'un pas, les choses rentrent dans l'ordre ! Il s'agissait donc de rebonds dus à une tension trop forte, d'où les problèmes.
Je suis quand même étonné : le moteur est donné pour 24volts mais il marche bien mieux en 12V.
Merci encore pour ton aide
Cordialement
C'est un peu plus compliqué que ça.
D'après la doc du moteur
il se pilote en courant, 1A max, donc si la tension est élevée et que la limitation en courant du driver est mal réglée tu peux envoyer trop de courant dans les bobinages. En diminuant la tension peut-être que tu rentres un peu plus dans les clous.
Les enroulements font 5.8Ω avec 24V aux bornes du moteur tu peux faire passer plus de 4A.
Oui, j'ai pourtant veillé à envoyer moins de 1 ampère dans les bobines. C'est réglable dans mon schéma.Ou bien ce moteur est surdimensionné pour mon application ?