@gaston48
pas erreur cumulative car a chaque impulsion de l encodeur l erreur et recalculé avec la précédente , voici mon prog faut juste changer dx et dy pour le rapport de réduction
#include <avr/io.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define bit1(PORT,masque) (PORT|=(masque))
#define bit0(PORT,masque) (PORT&=~(masque))
#define encoder0PinA 2 //pin2 arduino
#define encoder0PinB 3 //PIN3
#define pulseMoteur A1 //pin A1
#define directionMoteur A2 //pin A2
#define encoderA 0b00000100 //masque pinA (portd)
#define encoderB 0b00001000 //masque pinB (portd)
#define sens 0b00000100 //masque direction (portc)
#define pas 0b00000010 //masque step (portc)
#define pas_encodeur 2400 //encodeur 600i/t en mode 4x =2400
#define moteur_res 1600 //1600 micropas pour 1 tour
signed long encoder0Pos = 0;
unsigned int dx=1; //ici rapport de reduction
encodeur(dx) et moteur pas a pas(dy)
unsigned int dy=1; // dx et dy entier positif
et dx=>dy dx
int dxx;
int dyy;
signed int erreur;
void setup() {
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print("Reducteur 59jag");
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
pinMode(pulseMoteur, OUTPUT);
pinMode(directionMoteur, OUTPUT);
attachInterrupt(0, doEncoderA, CHANGE);
attachInterrupt(1, doEncoderB, CHANGE);
dxx=dx*pas_encodeur; //calcul du rapport de
reduc final
dyy=dy*moteur_res;
erreur=-dxx/2;
delay(1000);
}
void loop(){
lcd.setCursor(0,0);
lcd.print(dy);
lcd.print("/");
lcd.print(dx);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("enc_pos ");
lcd.print(encoder0Pos);
lcd.print(" ");
delay(100);
}
void doEncoderA(){
if ((PIND & encoderA) != 0) {
if ((PIND & encoderB) == 0) {encoder0Pos++; bit0(PORTC,sens);}
else {encoder0Pos--; bit1(PORTC,sens);}
}
else {
if ((PIND & encoderB) != 0) {encoder0Pos++; bit0(PORTC,sens);}
else {encoder0Pos--; bit1(PORTC,sens);}
}
erreur=erreur+dyy;
if(erreur>0){bit1(PORTC,pas);erreur=erreur-dxx; bit0(PORTC,pas);} //fait avancer le moteur d un pas
}
void doEncoderB(){
if ((PIND & encoderB) != 0) {
if ((PIND & encoderA) != 0) {encoder0Pos++; bit0(PORTC,sens);}
else {encoder0Pos--; bit1(PORTC,sens);}
}
else {
if ((PIND & encoderA) == 0) {encoder0Pos++; bit0(PORTC,sens);}
else {encoder0Pos--; bit1(PORTC,sens);}
}
erreur=erreur+dyy;
if(erreur>0){bit1(PORTC,pas);erreur=erreur-dxx; bit0(PORTC,pas);}
}