emulare enconder in quadratura

ciao a tutti,

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.

Cosa intendi per onda quadra sfasata di 90°? L'armonica fondamentale sfasata o semplicemente l'onda quadra translata di un certo tempo?

A primo acchito sembrerebbe che vuoi due onde quadre in antifase, ovvero una ON quando l'altra è OFF e viceversa, la semplice funzione NOT

Ciao

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 
}

A lui bastano solo 40 Hz, non vuole neanche un KHz quindi meglio di così :smiley:

x iscrizione

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

flz47655:
Cosa intendi per onda quadra sfasata di 90°? L'armonica fondamentale sfasata o semplicemente l'onda quadra translata di un certo tempo?

A primo acchito sembrerebbe che vuoi due onde quadre in antifase, ovvero una ON quando l'altra è OFF e viceversa, la semplice funzione NOT

Ciao

In antifase sono sfasate di 180°

Ok, mi ero sbagliato

Ciao

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' ?

il 13 è il pin del led, probabilmente serve per fare un poco di debug (se si spegne = arduino resettato)

Lesto scusa la mia ignoranza in C ma mi potresti spiegare questo codice?

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

Mi servirebbe per creare un encoder sintetico a 4 canali per automatizzare 5 ponti trasversali
Per taglio vetro.

Grazie mille

cbi mette a zero il bit n° bit della variabile sfr, sbi, invece lo mette ad uno. molro comode per lavorare sui bit e quindi sui registri

Grazie mille