Pages: [1]   Go Down
Author Topic: emulare enconder in quadratura  (Read 1012 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Parma
Offline Offline
Edison Member
*
Karma: 19
Posts: 2313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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

Parma
Offline Offline
Edison Member
*
Karma: 19
Posts: 2313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 38
Posts: 5604
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

F

Parma
Offline Offline
Edison Member
*
Karma: 19
Posts: 2313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, mi ero sbagliato

Ciao
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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' ?
« Last Edit: August 12, 2012, 03:09:23 pm by volcane » Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille
Logged

Pages: [1]   Go Up
Jump to: