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

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

volcane


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

Federico Vanzati


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°
F

flz47655


volcane

#9
Aug 12, 2012, 10:00 pm Last Edit: Aug 12, 2012, 10:09 pm by volcane Reason: 1

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

lesto

il 13 è il pin del led, probabilmente serve per fare un poco di debug (se si spegne = arduino resettato)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

chetto983

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

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie


Go Up