Lettura segnale analogico

Salve a tutti pian piano sto cercando di venire a capo al mio progetto (ormai è cosa personale! :smiley: ).

devo leggere un segnale e fare la fft, ho studiato un pochetto a riguardo dato che non posso utilizzare le librerie già fatte, ma fare una lettura campionando il segnale, e inviandolo sulla seriale, per poi fare tutto via software sul pc.
in primis per non appesantire il lavoro dell'arduino e limitare lo scambio di dati. comunque non vi scrivo per questo, la cosa che mi fa rimanere un po' perplesso, che tra l'altro è molto banale, è che in affetti arduino nativamente non può gestire un segnale, perché in effetti lui non è in grado leggere un segnale con valori negativi, quindi facendo un campionamento ottengo solo i valori positivi dello spettro e ovviamente nulla dei negativi, quindi mi chiedo primo, come fanno a fare la fft e/o oscilloscopi solo con valori positivi ma sopratutto, come faccio a prendere in considerazione tali valori? sicuramente mi sfugge qualcosa, ma è per questo che chiedo il vostro aiuto!!

ps. non avrei problemi di risoluzione bassa dovendo leggere un picco-picco, perchè le tensione del segnale sono di circa 2v picco picco, ma ho acquistato anche un adc esterno a 16bit per avere poi una maggiore risoluzione!

una delle tante righe di codice che ho trovato che lavora sulla fft è questo, in particolare questa è la parte dove campiona un segnale e gli da addirittura un segno, cosa che non riesco a capire dato che arduino nn legge valori negati, tra l'altro provandolo e usando l'ingresso a0, non ricevo nessuna lettura plausibile, mi da praticamente tutti valori in fondo scala, nello specifico quando somma i due byte facendo un Serial.println(k) ricevo sempre circa 3900 (nn ricordo il valore preciso ma mia pare sia la scala finale dei 16bit), il codice è questo:

void setup() {
  Serial.begin(115200); // use the serial port
  TIMSK0 = 0; // turn off timer0 for lower jitter
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0
}

void loop() {
  while(1) { // reduces jitter
    cli();  // UDRE interrupt slows this way down on arduino1.0
    for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
      while(!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fht_input[i] = k; // put real data into bins
    }

MisterZ:
perchè in effetti lui non leggere un segnale con valori negativi, quindi facendo un campionamento ottengo solo i valori positivi dello spettro e ovviamente nulla dei negativi, quindi mi chiedo primo, ...

Non sono elettronico, ma per quel che sò io la MCU non solo non legge i -V ma questi negativi possono danneggiare il pin. Datasheet del atmega 328pu, paragrafo "28.1 Absolute Maximum Ratings"
Voltage on any Pin except RESET with respect to Ground =-0.5V to VCC+0.5V

Se a picco sono -2V/2V secondo me bisogna portare il segnale a 0/4V con un circuito
http://forum.arduino.cc/index.php?topic=35319.0

le fft cosa sono fatture?
E no, perchè se scrivete tutto prtt e mmm cococo il discorso invece di accorciarsi si allunga, eh! parliamo come magnamo su dai!

nid69ita:
Non sono elettronico, ma per quel che sò io la MCU non solo non legge i -V ma questi negativi possono danneggiare il pin.

Se a picco sono -2V/2V secondo me bisogna portare il segnale a 0/4V con un circuito
Misurare la tensione da -12 a 12v - Italiano - Arduino Forum

infatti non capisco come faccia a funzionare le librerie fft che si trovano, immagino utilizzino un riferimento di tensione diverso!

pablos:
le fft cosa sono fatture?
E no, perchè se scrivete tutto prtt e mmm cococo il discorso invece di accorciarsi si allunga.

scusami pablos ma non ho capito cosa volevi dirmi

Che è sto fffftttt?

Adesso non esageriamo, la FFT è una cosa nota a chiunque processi segnali: Fast Fourier Transform :).

Perfetto scriviamolo, perchè il forum non è solo per ingegneri, ci sono anche altri che stanno imparando, non tutti processiamo segnali analogici appena svegli :slight_smile: .... oggi mi faccio bannare

pablos:
... oggi mi faccio bannare

Bannare no :smiley: :smiley: :smiley: ... ma consigliarti ogni tanto pure tu di usare Google SI !

FFT è un acronimo universamlemte riconosciuto ... NON troverai mai nessuno che in una discussione scrivere "... devo calcolare la trasformata di Fourier veloce" ... ma tutti usano FFT :wink:

Divertiti a cercare "Arduino FFT" e vedrai uscire ... 177'000 risultati :smiley:

Guglielmo

Certo che l'ho usato google, infatti sono arrivato alla pag 155 ... ma siccome io sono un elettronico digitale (dove c'è solo 0 e 1 ) e non ho mai fatto campionamenti di segnali analog, mi piaceva seguire l'argomento :slight_smile:
Anche se un po' di operazionali li ho usati.

Non dite che poi vado OT

ora che bene o male abbiamo capito cos'è la FFt, mi spiegate come fanno a farla se arduino non legge segnali negativi?

ma in realtà potrebbe anche non interessarmi se poi l'algoritmo rispecchia veramente quello reale, o sono barrette un pò randomizzate XD

quello che vi chiedo e come posso fare per effettuare una lettura negativa, se mando lo stesso segnale su un altro ingresso utilizzando "qualcosa", e dovete dirmi voi cosa, che inverta il segno (come un not) e quindi faccia leggere ad arduino un segnale positivo dove poi io lo gestisco via software (sapendo per l'appunto che quel valore in realtà è negativo).

e poi altra cosa a questo punto come filtro gli ingressi in modo da nn far leggere mai letture negative sugli ingressi?

Premesso che non sono pratico del settore, vedo essenzialmente due modi:

  1. Si trasla il segnale in modo che sia completamente positivo, aggiungendo un offset in tensione.

  2. Si legge il segnale tramite un ADC esterno che supporta tensioni negative.

Tutto ciò però è puramente mia speculazione :).

... se hai un segnale +/- usi un circuito con un oprazionale per aggiungere un offset e spostare il tutto nell'area del +.

Ovvio che in questo modo il segnale può essere al massimo -2.5/+2.5 che, aggiungendo un offser di +2.5 V si trasforma in un segnale 0/5V.

Cerca con Google "shift negative voltage adc" ... esempio:

Guglielmo

Molto simile al circuito che legge una temp negativa da un LM35 ... o no?

ma ho acquistato anche un adc esterno a 16bit

Oppure con l'ADC che hai , se ha degli ingressi differenziali

pablos:
Molto simile al circuito che legge una temp negativa da un LM35 ... o no?

Beh ... con Arduino, in ogni caso in cui hai valori di tensione negativi ... devi in qualche modo "spostare" il tutto in valori positivi :wink:

Guglielmo

Brunello:
Oppure con l'ADC che hai , se ha degli ingressi differenziali

io ho preso questo adc "16 Bit I2C 4 Canali ADS1115", leggendo le caratteristiche utilizzandolo con ingressi differenziali, che si riducono poi a 2, a qual punto come faccio ad utilizzarlo? l'ho comprato ma stavo lavorando sul codice di base per implementarlo solo una volta terminato per incrementare la risoluzione, immagino che a questo punto per il mio caso sia la soluzione ideale cosi non sacrifico nemmeno la risoluzione, sapete inoltre dirmi se posso usare 2 canali single-ended + l'ultima coppia con ingresso differenziale?

MisterZ: cortesemente metti sempre il link hai prodotti ... le ricerche con Google spesso danno più schedine con lo stesso chip ... ed è meglio vedere quella che usi TU. Grazie.

Guglielmo

https://www.amazon.it/XCSOURCE-ADS1115-Guadagno-amplificatore-TE570/dp/B01KWZVF1A eccolo, non ero sicuro di poterlo inserire a dire il vero!!

Intanto studiati QUESTO tutorial di Adafruit ... vedrai che chiarisce già parecchi dubbi ... :wink:

Inoltre, nella sezione downloads, trovi anche la libreria pronta per Arduino.

Guglielmo

P.S.: Tranquillo, finché non metti link per pubblicizzare un TUO prodotto commerciale, va tutto bene e NON c'è alcun problema a mettere quelli di prodotti che si usano.