Go Down

Topic: emulare enconder in quadratura (Read 1 time) previous topic - next topic

volcane

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.

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

volcane

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 http://www.ni.com/white-paper/7109/it si vede come devrebbe essere quello che vorrei fare

astrobeed


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.

Code: [Select]


/*
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
}

flz47655

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

Go Up