velocita esecuzione

Salve!

Ho implementato un programma per arduino nano che prima converte il segnale da analogico a digitale e poi lo trasmetta attraverso fibraottica. Ora il segnale ricevuto e riconvertito é fedelissimo all’originale, cambia frequenza e ampiezza velocemente. ho pero’ un problema quando cambio la forma d’onda. Mi spiego meglio: quando con il generatore invio prima un onda sinusoidale poi premo il pulsante per inviare l’onda quadra il segnale ricevuto ci mette circa un secondo a prendere la nuova forma.
Avete consigli? spiegazioni?
So che dovrei mettere il codice ma non posso metterlo tutto perche non é di mia proprieta’, Posto il moi settaggio dei timer. e ADC

  ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // STO FACENDO UNA CONVERSIONE OGNI 0.104MS

  bitClear(TCCR2A, WGM22);
  bitClear(TCCR2A, WGM21);
  bitSet(TCCR2A, WGM20); //set Timer2 to phase correct (doubles PWM frequency)

  bitClear(TCCR2B, CS20);
  bitSet(TCCR2B, CS21);
  bitClear(TCCR2B, CS22);

  DDRD = DDRD | B00001000;  //3putput
  DDRC = DDRC | B00000000; //A0 e A4 input

Giulialiuyi:
Avete consigli? spiegazioni?

Senza codice è difficile fare una diagnosi, sopratutto non specifichi cosa c'è dall'altra parte della fibra ottica e come viene ricostruito il segnale.
Il fatto che ci mette un secondo a cambiare lascia presupporre che dall'altra parte c'è un buffer con logica fifo in grado di ospitare circa abbastanza letture per un secondo di trasmissione, pertanto fino a che il buffer non si svuota non cambia la forma d'onda.

c’é un fotodiodo! e il segnale viene ricostruito partendo dalla pwm visualizzata, calcolo attraverso pulseIn la durata della pulsazione LOW la moltiplico per cento e la divido per il periodo della PWM, cosi ottengo il duty cycle. poi delimito con constrain il valore del duty cycle da 0 a 100, mappo questi due valori da 0 a 100 con map in à, 255.
poi metto nel dac questo valore.
sono sei linee di codice, piu che altro é matematica.
Non so quanto tempo mi prenda pero pulseIn, constrain, e map.

Non ho idea di cosa sia il buffer.

Quello che succede quando cambio forma d’onda é il seguente:

Da sinusoide a quadra => vedo nell’oscilloscopio un segnale continuo con valore corrispondente a meta del valore Massimo della quadra.

Da quadra a sinusoide =>vedo nell’oscilloscopio un segnale continuo con valore corrispondente valore Massimo della quadra.

da sinuoide a triangolare o a /| va tutto bene!

incomingAudio = analogRead(A0) >> 2;//get new value from A0
analogWrite(3, incomingAudio);
voltage =((pulseIn(photodiodo, LOW)*100)/T)>>1;
voltage = constrain(voltage, 0, 100);
voltage = map(voltage, 0, 100, 0, 255);
dac.output(voltage);

... emmm ... perdona la domanda banale, ma ... il segnale Analogico in ingresso al primo Arduino ... lo hai translato rispetto al suo zero per farlo diventare TUTTO positivo vero ?

Non è che stai mandando una segnale sinusoidale che oscilla sopra e sotto zero in ingresso al ADC ?

Guglielmo

a quest’ora il mio arduino sarebbe bello che bruciato! ahaha certo! ha un amplitudine di 4V e il centro 2.1V

Ho visto che il problema inizia prima del passaggio alla ricezione. ma proprio quando passo alla quadra o dalla quadra si blocca. e ci mette un po a fare la PWM. un po come se la conversione impiegasse piu tempo prima di dare il via libera alla PWM.

... l'ho premesso, domanda banale ... ma ... hai idea di quante volte qui capita ? :smiley: :smiley: :smiley:

Guglielmo

Non avevo idea! :slight_smile: prima di inserire o di mettere in contatto arduino con qualche cosa mi sono letta tutte le specifiche! :slight_smile: poi se bruciassi arduino il moi tutor mi manda via XD.
Sto facendo un progetto di tirocinio per un azienda francese :slight_smile:

IL PROBLEMA é PULSEiN

Giulialiuyi:
c'é un fotodiodo!

Eh, certo, scusa la battuta: e che dovrebbe esserci alla fine di una fibra ottica, una mortadella? :slight_smile:

Giulialiuyi:
e il segnale viene ricostruito partendo dalla pwm visualizzata, calcolo attraverso pulseIn la durata della pulsazione LOW la moltiplico per cento e la divido per il periodo della PWM, cosi ottengo il duty cycle. poi delimito con constrain il valore del duty cycle da 0 a 100, mappo questi due valori da 0 a 100 con map in à, 255. poi metto nel dac questo valore.
sono sei linee di codice, piu che altro é matematica.
Non so quanto tempo mi prenda pero pulseIn, constrain, e map.
Non ho idea di cosa sia il buffer.

No, perdonami, qui mi lasci perplesso... Maneggi PWM, constrain, fibra ottica, trasmissione e conversione di segnali, sai cosa sia il duty cycle, usi un DAC, e poi non hai idea di cosa sia un buffer? :o Come ha scritto astrobeed, intanto neanche io escluderei che la causa possa essere all'altro capo della fibra, viste le (poche) informazioni che ci hai dato.

In ogni caso, scherzi a parte, la pulseIn() attende l'esito richiesto, nel tuo caso con LOW prima attende che il segnale sia HIGH, poi appena diventa LOW misura quanto tempo il segnale resta LOW fino al successivo HIGH. E il valore del timeout è esattamente di 1 secondo!
Per cui devi essere certo che tale impulso LOW si verifichi entro i tempi che ti attendi, altrimenti la pulseIn() va in timeout quindi in tal caso hai un delay non atteso, ma contemporaneamente la pulseIn ti restituisce zero, per cui nel tuo codice mettici intanto un tempo massimo per te accettabile (es. 1000 microsecondi) e un controllo di timeout prima di fare lo shift (altrimenti non distingui il timeout da tempi tra 1 e 3 ms) del tipo:

incomingAudio = analogRead(A0,1000);//get new value from A0
if ( incomingAudio !=0 ) {
 incomingAudio = incomingAudio >> 2;
 analogWrite(3, incomingAudio);
 voltage =((pulseIn(photodiodo, LOW)*100)/T)>>1;
 voltage = constrain(voltage, 0, 100);
  ...eccetera
}
else
{
  // che fare se vado in timeout??
  // gestisci qui la cosa...
}