il difficile e' capire se si tratta dell' encoder oppure della scheda che legge l'encoder i costi sia dell'uno che dell'altro non sono dei piu' economici, per questi motivi volevo realizzare un emulatore di encoder in modo da capire dove sia il guasto.
Con Arduino al massimo riesci a simulare un encoder con un segnale massimo di 10 kHz (diventano 40 KHz in quadratura), ti allego uno sketch che avevo preparato per un amico con un problema simile.
Lo sketch può simulare sia la rotazione CW che quella CCW e fornire un ben preciso numero di impulsi.
/*
Emulatore encoder a due canali
*/
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define CW // commentare per invertire il senso di rotazione
// la frequenza di lavoro dei canali, A e B, è pari alla durata dell'impulso + 1us
// (tempo impegnato dalla for) moltiplicato per 4.
// Esempio, 24 + 1 = 25 * 4 = 100 us = 10 kHz
#define periodo 100 // durata impulso in us, valore minimo 24 (~10 kHz)
#define Npulse 20000 // numero impulsi ChA e ChB
unsigned long int i;
void setup()
{
pinMode(13, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(13, HIGH);
}
void loop()
{
//for(i=0;i<Npulse;i++) // loop predeterminato (14 fcy = 875 ns)
for(;;) // loop eterno (4 fcy = 250 ns)
{
#if defined CW
sbi(PORTB,0); // pin 8
delayMicroseconds(periodo);
sbi(PORTB,1); // pin 9
delayMicroseconds(periodo);
cbi(PORTB,0); // pin 8
delayMicroseconds(periodo);
cbi(PORTB,1); // pin 9
delayMicroseconds(periodo);
#else
sbi(PORTB,1); // pin 8
delayMicroseconds(periodo);
sbi(PORTB,0); // pin 9
delayMicroseconds(periodo);
cbi(PORTB,1); // pin 8
delayMicroseconds(periodo);
cbi(PORTB,0); // pin 9
delayMicroseconds(periodo);
#endif
}
while(1); // fine ciclo
}