Generatore segnale encoder in quadratura max 20 Mhz

Ciao a tutti,

Per lavoro mi hanno chiesto di studiare un generatore di segnale encoder che varia da 100Khz a 20 Mhz.

Con arduino ho provato a generare il segnale ma al max arrivo a 4Khz.

Googlelando ho trovato una scheda AD9851 ma non saprei come controllare e generare un segnale in quadratura.

Qualcuno di voi la conosce?

Sono in fase di studio Hardware.

Grazie in anticipo per ogni risposta

cos'é un "generatore di segnale encoder" ?
Ciao Uwe

Voglio generare 4 segnali in quadratura:

Segnali

A
A negato
B sfalsato di 90 gradi
B negato.

4 kHZ mi sembrano molto poco anche per un clock "limitato" come quello di Arduino.

Evidentemente il micro fa anche altre cose.

Se ci spieghi cosa vuoi ottenere (oltre al segnale in quadratura), forse potremo aiutarti.

Voglio solo ottenere il segnale in quadratura con la possibilità di cambiare la frequenza:

Ecco la bozza di codice:

/*

Virtual Encoder:


Signal:

A  = pin 9
A- = pin 10
B  = pin 11
B- 0 PIN 12


# Author: Davide Marchetto #
*/

#include <TimerOne.h>

#define	GPIO2_PREFER_SPEED	1 
#include "arduino2.h"  // fast I-0

int i = 0;

GPIO_pin_t A = DP9;
GPIO_pin_t Anot = DP10;
GPIO_pin_t B = DP11;
GPIO_pin_t Bnot = DP12;

unsigned int timer = 50;

/// debug 
/// comment line below for disable serial.print
#define debug
/// end debug

 
void setup() 
{
  // Initialize the digital pin as an output.
  
  
  pinMode2f(DP9,OUTPUT);
  pinMode2f(DP10,OUTPUT);
  pinMode2f(DP11,OUTPUT);
  pinMode2f(DP12,OUTPUT);
 
  // set all output to LOW
  digitalWrite2f(DP9, LOW);
  digitalWrite2f(DP10, LOW);
  digitalWrite2f(DP11, LOW);
  digitalWrite2f(DP12, LOW);
  
  Timer1.initialize(1000); // set a timer of length 1 millisecond
  Timer1.attachInterrupt( encoder ); // attach the service routine here
 Serial.begin(9600); // initialize serial
}
 
void loop()
{
	if ( Serial.available()>0){
	timer =	Serial.readString().toInt();

	}

 Timer1.setPeriod(timer);
 #ifdef debug
 Serial.println("timer value on main loop");
 Serial.println(timer);
 #endif

 

}
 
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void encoder()
{
    switch (i){
    case 0:
      digitalWrite2f(DP9, HIGH);
      digitalWrite2f(DP10, LOW);
      break;
      
    case 1:
      digitalWrite2f(DP11, HIGH);
      digitalWrite2f(DP12, LOW);
      break;
      
    case 2:
      digitalWrite2f(DP9, LOW);
      digitalWrite2f(DP10, HIGH);
      break;
      
    case 3:
      digitalWrite2f(DP11, LOW);
      digitalWrite2f(DP12, HIGH);
      break;

    }

	i++;
	if ( i >= 4)
	{
		i = 0;
	}
 #ifdef debug
 Serial.println("timer value on interrupt");
 Serial.println(timer);
 #endif
}

Lavorando sul registro della porta di uscita C (quella corrispondente agli ingressi analogici), puoi ottenere con un solo comando l'impostazione di 4 canali (A, B, Aneg, Bneg), velocizzando di molto la generazione dei segnali.

Usando una variabile Ritardo di tipo unsigned long in microsecondi corrispondente al periodo del tuo segnale (e quindi la frequenza) imposti il ritardo tra segnali: si può arrivare anche a 1-2MHz.

Comunque, se il tuo obiettivo è quello di arrivare a 20MHz devi usare un circuito esterno, anche se il DDS da te indicato mi sembra eccessivo.

Puoi darmi un esempio su come poteri manipolare la porta?

Grazie,

Davide.

2 Mhz per incominciare possono andare bene

chetto983:
2 Mhz per incominciare possono andare bene

Non ho capito ... prima chiedi aiuto per utilizzare un chip che ti può far arrivare a 20 MHz e poi ti vanno bene 2 MHz ??? :astonished: :astonished: :astonished:

Perché, prima di far perdere tempo alla gente, decidi quello che ti serve ... ]:smiley:

... se ti bastano i 2 MHz ... allora il metodo di cyberhs va bene e lo si può sviluppare, ma se poi invece, comunque a te servono frequenze maggiori, inutile perdere tempo a scrivere codice che sarà totalmente da buttare, visto che con il AD9851 non ha nulla a che vedere !

Guglielmo

Mi servirebbero 20 Mhz.

Ma visto che mi è stato riferito che si può arrivare a 2Mhz con arduino posso moltiplicare la frequenza con una scheda della motrona che ho in casa che mi da un uscita 10X.

Scusate ma sto cercando di studiare bene l'hardware prima di comprare i componenti.

Sto chiedendo a voi esperti dei consigli

Saluti,

Davide

Se moltiplichi la frequenza per 10 secondo me non hai piú li sfasamento voluto tra i 2 segnali.

Secondo me la cosa piú semplice é con un oscillatore generare una frequenza doppia di quella desiderata e una volta dividerla per 2 (fase A) e una volta invertirla e dividerla per 2 (fase B). Poi invertire i 2 segnali ottenuti (ottieni !A e !B).
Alla fine Ti serve solo un oscillatore regolabile e i divisori/ invertitori che reggono la frequenza desiderata ( 40MHz se vuoi ottenere 20MHz) Come oscillatore potresti usare un generatore di forme d'onda che potresti avere giá in ditta.

Ciao Uwe

Se il vostro scopo è ottenere un simulatore di encoder al fine di testare azionamenti motore di posizionamento ad anello chiuso devi aggiungere altre funzioni non ottenibile con la soluzione proposta da uwefed, che resta comunque valida per un un controllo di velocità sottointeso che come rampa userai il generatore variabile

icio:
Se il vostro scopo è ottenere un simulatore di encoder al fine di testare azionamenti motore di posizionamento ad anello chiuso devi aggiungere altre funzioni non ottenibile con la soluzione proposta da uwefed, che resta comunque valida per un un controllo di velocità sottointeso che come rampa userai il generatore variabile

Penso se il simulatore deve sostituire un motore-encoder in un circuito a controllo ad anello chiuso allora sará difficile costruire il simulatore in modo che simuli con buona aprossimazione le proprietá del insieme motore-encoder con macchinario azionato. Un insieme cosí non parte da 100kHz ma da 0 Hz

Ciao Uwe

Ecco un link utile per la manipolazione delle porte di uscita:
www.arduino.cc/en/Reference/PortManipulation

Ciao a tutti e grazie per l'aiuto.

Ciao a tutti e grazie per l'aiuto.

Non devo collegarlo ad un inverter e quindi non mi serve nessuna rampa.

Questo segnale mi serve per simulare un encoder montato su una rulliera che rileva la velocità di un nastro continuo di vetro.

Questo strumento ci serve in ufficio perché impossibile da simulare senza avere un'alto forno.

Sto guardando per generare il clock questo:

http://netram.co.za/932-programmable-oscillator-breakout.html.

Adesso devo solo capire come generare il segnale in quadratura sfalsato di 90*.

chetto983:
Sto guardando per generare il clock questo:

http://netram.co.za/932-programmable-oscillator-breakout.html.

Adesso devo solo capire come generare il segnale in quadratura sfalsato di 90*.

Quel integrato é sicuramente un valido integrato per esere usato come ocillatore. Comunque mi sembra un po esagerato ordinarlo dal Sudafrica. Visto che il produttore della schedina é Sparkfun (C'é il loro logo) Watterott electronic
Come produrre un segnale simile a quello del Encoder Te lo avevo giá spiegato:

uwefed:
Secondo me la cosa piú semplice é con un oscillatore generare una frequenza doppia di quella desiderata e una volta dividerla per 2 (fase A) e una volta invertirla e dividerla per 2 (fase B). Poi invertire i 2 segnali ottenuti (ottieni !A e !B).
Alla fine Ti serve solo un oscillatore regolabile e i divisori/ invertitori che reggono la frequenza desiderata ( 40MHz se vuoi ottenere 20MHz) Come oscillatore potresti usare un generatore di forme d'onda che potresti avere giá in ditta.
Ciao Uwe

Ciao Uwe

Per ottenere il segnale in quadratura posso fare così:

Sì, i 4 NAND e i 4 transistors però non servono nel tuo caso

potrebbero andare bene questi componenti:

I2C-OSC I2C → http://www.ebay.it/itm/I2C-OSC-I2C-1KHz-to-68MHz-Programmable-Oscillator-/390106009905 ( Oscillatore Programmabile 1Khz-- 64Mhz).

HEF4013BDB → http://www.ebay.it/itm/1-x-HEF4013BDB-Dual-D-type-flip-flop-DIP-14-1pcs-/150954862860?_trksid=p2054897.l5659 ( doppio D-FlipFlop).

Sul doppio D-FlipFlop ho i seguenti PIN:

SD asynchronous set-direct input (active HIGH)
CD asynchronous clear-direct input (active HIGH)

Come devo collegarli?

Saluti,

Davide

Programma.ino (2.56 KB)

al posto del 4013 basta qualsiasi divisore per 4 a 2 bit, ha un ingresso e 2 uscite, per invertire la direzione basta scambi le uscite , il 4013 non arriva a 64Mhz , si ferma a 2Mhz quindi devi scegliere il corrispondente TTL , tipo il sn74hc74, che arriva a 20Mhz, se non ti basta neppure quello, ne devi cercare uno più veloce

ok per sn74hc74

ma i segnali di Set e Reset come li collego?