Ho delle apparecchiature da riparare/collaudare che contano i giri di motori, usano un encoder in quadratura, spesso si hanno problemi, 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.
Si deve generare un' onda quadra di circa 40hz, credo che per questo non sia difficile, la difficolta' secondo me risiede nel ricreare una seconda onda quadra sempre della stessa frequenza ma che sia sfasata rispetto alla prima in anticipo o in ritardo di 90 gradi, che soluzioni si possono adottare? magari ci fosse gia' qualche codice per capire come implementare la cosa.
Gli encoder in quadratura funzionano grosso modo con due canali, uno viene usato per contare gli impulsi l'altro per capire se lo stai girando verso destra o sinistra, in termini tecnici si hanno due onde quadre sfasate in anticipo o ritardo di 90 gradi a seconda se si stia girando in verso destra o sinistra, ormai moltissime autoradio anche per la regolazione volume usano encoder in quadratura.
Se genero una onda quadra e poi uso il not per generarne un'altra avro' uno sfasamento di 180 gradi e non 90 come richiesto, comunque vedendo la figura 2 del link Using Quadrature Encoders with E Series DAQ Boards si vede come devrebbe essere quello che vorrei fare
volcane:
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
}
astrobeed:
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.
Ti ringrazio cerchero' di provarlo nel fine settimana, poi faccio sapere come e' andata
astrobeed:
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.
Volevo chiederti con la riga #define CW posso mettere un numero ad esempio 1 e poi usare un piedino di arduino come ingresso, se questo va ad 1 allora impostero' CW=1? inoltre vedo che sono usati i piedini 8 e 9 per ricreare i canali dell'encoder, ma nel setup hai messo anche il 13 perche' ?