DC motor et double encoder

bonjour tout le monde,
lancé dans un petit projet arduino, je rencontre des problemes pour arriver a mes fins.
le but du projet : controler un moteur DC en position.
le montage :
une carte arduino uno
un pont en H (ou plutot 2 demis ponts en H) BTS7960 avec deux entrees PWM
un moteur 12 volts
deux encodeurs rotatifs OMRON A,B,Z de 600 impulsions par tour

le but d’utiliser un encoder comme donneur d’ordre
de faire tourner le moteur sur l’axe duquel le second encodeur est fixé.
je fais la différence des deux encodeurs, et en fonction du resultat, je donne l’ordre au moteur de tourner dans un sens ou dans l’autre pour se mettre a la bonne position.

ci dessous le code que j’utilise. (je precise que je débute en arduino et qu’il contiendra certainement des “lourdeurs”)

code :

volatile int tempA, counterA, tempB, counterB = 0;

void setup() {
Serial.begin (9600);

pinMode(2, INPUT_PULLUP); // internal pullup input pin 2 pour le attach interrupt de l’encoder A
pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3 pour le attach interrupt de l’encodeur B
pinMode(4, INPUT_PULLUP); // internal pullup input pin 4 pour la lecture de l’etat de la sortie B de l’encodeur A pour definir le sens de rotation de A
pinMode(5, INPUT_PULLUP); // internalเป็น pullup input pin 5pour l lecture de l’etat de la sortie B de l’encodeir B pour definir le sens de rotation de B
pinMode(10,OUTPUT);//sortie vers un des deux PWM de la BTS 7960
pinMode(11,OUTPUT);//sortie vers l’autre PWM de la BTS 7960
//Setting up interrupt

attachInterrupt(0, ai0, RISING);

attachInterrupt(1, ai1, RISING);
}

void loop() {
// Send the value of counter
if( counterA != tempA or counterB!=tempB ){
//petite partie de code pour afficher et verifier les variations de encodeur A et B via le moniteur serie
Serial.print ("counter A= “);
Serial.print (counterA);
Serial.print (” et counter B= “);
Serial.print (counterB);
Serial.print (” difference = ");
Serial.println (counterB-counterA);

//controle du moteur
if ((counterB-counterA)>2) {

analogWrite (10,250);// donne l’ordre au BTS 7960 de faire tourner le moetru dans un sens
}
else if ((counterB-counterA)<-2){
analogWrite (11,250);// ou de le faire tourner dans l’autre sene
}
else {
analogWrite (10,0);// ou inon de l’arreter
analogWrite (11,0);

}
tempA = counterA;
tempB = counterB;
}
}
void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(4)==LOW) {
counterA++;
}else{
counterA–;
}
}

void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(5)==LOW) {
counterB++;
}else{
counterB–;
}
}

lorsque je mets tout cela en pratique, a l’ititialisation, les deux encodeurs sont a zero.
des que je tourne un encodeur donneur d’ordre, le moteur tourne tres legerement (un accoup) puis se fige. quand j’actionne l’encodeur donneur d’ordre dans l’autre sens rien ne se passe alors que je constate les variations de valeurs via le moniteur serie.

si d’aventure vous constatez des erreurs ou des incohérences dans mon raisonnement, je suis preneur de toute aide et vous en remercie par avance.
clt railman

Mets ton code entre balises code comme indiqué dans les messages épinglés et avant de copier fait une indentation automatique avec "ctrl T".

Le code deviendra lisible et sera plus lu qu'il ne le sera actuellement.

HELLO 68tjs
nouveau en arduino mais egalement nouveau en publication sur forum.
j’ai pas tout compris du contenu de ton message mais je vais creuser…

comme on dit, toujours essayer de s’endormir moins con qu’on ne s’est levé le matin…

quoi qu’il en soit, apres moultes essais avec le moniteur serie pour analyser mon code je verdict est tombé…
le code est bon, meme si d’autres personnes pourront tres certainement ecrire quelquechose de plus joli et efficace<;

mon probleme vient du hardware et du fait que l’ampérage necessaire pour mon montage dépasse les capacités du pont en H choisi. Le BTS7960 avec ses 43 amp se met en securité d’ou les petits accoups de temps a autre.

avec le même montage mais un plus petit moteur, tout fonctionne.

amicalement à tous;
railman.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.