Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Filtro FIR

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 16:54

Ciao a tutti

sono qui a chiedervi un parere.

in pratica ho un ADC che ha una sua tensione di riferimento. A questa tensione di riferimento, quando la temperatura raggiunge un certo valore, le si aggiungere un ripple di 128mVpp e freq pari a 10khz. I dati che l'ADC converte, tra cui la temperatura del core, io li invio sulla CAN per visualizzarli. Ma quando si aggiunge questo ripple i valori che vengono graficati sono sballati.

Io non posso aggiungere un filtro HW all'uscita della reference perché la scheda è stata già fatta.

Un collega ha proposto di inserire un filtro FIR sui campioni convertiti dall'ADC, prima di essere inviati su CAN. Ma secondo me questa cosa non ha senso, perché io il filtro lo applico su un segnale analogico che poi campiono e filtro e non su gà su campioni digitali ?

Giusto ?

Grazie
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[2] Re: Filtro FIR

Messaggioda Foto UtenteMarcoD » 22 lug 2021, 17:14

E' un problema reale interessante.

Potresti anche applicare un filtro numerico a dei valori digitali.

Per mio chiarimento:
ogni quanto tempo campioni i valori di temperatura ?
ogni quanto tempo li trasmetti su bus CAN ?
Quanto dura una conversione/campionamento?
a quale fondo scala del ADC sono riferiti i 128 mVpp ? 1 V ?
0,128 V su per esempio 1 V è il 10% ! E' tanto !!


Presumo che la temperatura vari molto lentamente ( max 1 °C /secondo ? )

Visto che non puoi filtrare la tensione di riferimento, non rimane che il filtraggio numerico.

Iniziare da qualcosa elementare come una media su per esempio 10 valori letti ?

Prova e visualizza la dispersione dei valori letti dal bus CAN.
O_/
Avatar utente
Foto UtenteMarcoD
9.167 4 9 13
Master EY
Master EY
 
Messaggi: 4329
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[3] Re: Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 17:33

Ciao allora la freq di campionamento dell'xadc presente all'interno della zynq è di 1000ksps, so che è una follia se dobbiamo andare a leggere una temperatura, ma la parte del vhdl per ora non la posso toccare.

La reference è di 1.25V.

Ho un task che prende un campione dall'xadc ogni 100 ms.
Un ulteriore task che prende questo campione e lo salva in un datablock ogni ms.
E sulla can viene inviato con freq 50 Hz.


Con l'scilloscopio ho visto il segnale analogico come vi dicevo.
Io ho provato ad applicare un filtro, mi sono generato i campioni con http://t-filter.engineerjs.com/ per fare una prova veloce.
I valori che ho messo sono:

Fc = 1Mhz ( poiché ho 1000ksps)
Per quanto riguarda la frequenza di cut off mi sono inizialmente basato sulla frequenza del segnale che vedevo sovrapposto alla reference, anche se non credo sia corretto......sbaglio ?

In una situazione del genere , essendo che io sto andando a filtrare campioni discreti come faccio a stabilire la freq di taglio ? E come la posso stimare ?

Grazie
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[4] Re: Filtro FIR

Messaggioda Foto UtenteMarcoD » 22 lug 2021, 17:44

Per quanto riguarda la frequenza di cut off mi sono inizialmente basato sulla frequenza del segnale che vedevo sovrapposto alla reference, anche se non credo sia corretto......sbaglio ?

In una situazione del genere , essendo che io sto andando a filtrare campioni discreti come faccio a stabilire la freq di taglio ? E come la posso stimare ?



Sono un semplicione pragmatico:
Quanto è importante la temperatura, con quanta precisione e dinamica temporale la vuoi misurare?
La temperatura entra in un loop di un feedback?
quale è la costante termica fisica della sorgente della temperatura ?
O ti preoccupi solo che i numeri su un display non "ballino" in modo fastidioso e palesemente erroneo?

Per me la frequenza di taglio deve essere leggermente superiore dell'inverso della costante di tempo dominante del sistema fisico (nel caso specifico la capacità termica/ressitenza termica).

E sulla can viene inviato con freq 50 Hz.
Quindi i dati hanno 20 ms di ritardo, quindi un filtraggio a 100 Hz può andare bene.

Però se fai le cose serie ,non puoi accettare che un hardware abbia una Vriferimento che balla del 10 %,
senza almeno tentare di aggiungere un condensatore ceramico da 10 nF !! .
Sei poi sicuro che non sia un falso disturbo indotto captato dalla sonda dell'oscilloscopio?
oppure dovuto a una infelice connessione della massa della sonda ?
O_/
Avatar utente
Foto UtenteMarcoD
9.167 4 9 13
Master EY
Master EY
 
Messaggi: 4329
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[5] Re: Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 17:56

Il componente che genera la reference è settato in modo corretto come da datasheet, inoltre è già presente il condensatore. Questo accade solo quando il componente arriva intorno ai 92°, inoltre questo comportamento non si replica nemmeno su tutte le schede.

Comunque quello che io vorrei ottenere è che se prima che si presenti questo ripple io leggo sulla can ad esempio 80° vorrei che anche con questo disturbo sulla reference continuni a leggere più o meno 80, disposto anche ad accettare una tolleranza.

Cosa intendi con "Per me la frequenza di taglio deve essere leggermente superiore dell'inverso della costante di tempo dominante del sistema fisico." ?

La temperatura è un'informazione importante per il sistema.

E' gestita da un task di FreeRTOS, che va a leggere un campione ogni 100ms

Ok i 100hz essendo il dobbio di 50 per il teorema, ma non bisogna considerare anche la freq di 1000ksps ?

Quando genero i campioni con quel programma come freq di campionamento quindi tu dici di metterci 100 Hz ?
Tu però cosi è come se stessi filtrando il campione già convertito in base al findo scala.

Io invece, con il filtro di cui ti parlavo prima, ho provato a filtrare il valore estratto dall'xadc senza ancora convertito con il valore di fondo scala, va bene uguale ?

Molte grazie
Ultima modifica di Foto Utentelorenrus il 22 lug 2021, 18:08, modificato 1 volta in totale.
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

1
voti

[6] Re: Filtro FIR

Messaggioda Foto UtenteMarcoD » 22 lug 2021, 18:08

Cosa intendi con "Per me la frequenza di taglio deve essere leggermente superiore dell'inverso della costante di tempo dominante del sistema fisico." ?


Fisicamente deve esserci del calore che scalda la materia, la quale ha un capacità termica.
La materia presente una resistenza termica rispetto l'ambiente circostante, per cui il calore si dissipa all'esterno.
Ora non so spiegarmi bene, Il tutto, si si suppone dimensioni trascurabili ( non tempo di propagazione della temperatura) si traduce in una equazione differenziale del primo ordine, la quale è caratterizzata da una costante di tempo.
Detto in altre parole:
quando accendi l'apparato (calore costante viene generato ), la temperatura sale dal valore ambiente a quello finale con una costante di tempo.
Avatar utente
Foto UtenteMarcoD
9.167 4 9 13
Master EY
Master EY
 
Messaggi: 4329
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[7] Re: Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 18:09

Quando genero i campioni con quel programma come freq di campionamento quindi tu dici di metterci 50Hz ?
Tu però cosi è come se stessi filtrando il campione già convertito in base al findo scala.

Io invece, con il filtro di cui ti parlavo prima, ho provato a filtrare il valore estratto dall'xadc senza ancora convertirlo con il valore di fondo scala, va bene uguale ?
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[8] Re: Filtro FIR

Messaggioda Foto UtenteMarcoD » 22 lug 2021, 18:16

va bene uguale ?
Penso di si.
Filtrare numeri che rappresentano tensioni oppure temperature è la stessa cosa, almeno finché non si raggiungono valori di fondo scala.
Operi su numeri interi a 16 bit o su numeri in floating point?
Avatar utente
Foto UtenteMarcoD
9.167 4 9 13
Master EY
Master EY
 
Messaggi: 4329
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[9] Re: Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 18:22

Sto usando floatin point. di seguito il codice che ho usato prima:

Codice: Seleziona tutto

int j;
double output_signal;
double tmp;

int Sample_Count = 0;
int Coeff_Count = 0;
int Limit = 1;

typedef struct {

  double sample_buff[FILTER_TAP_NUM];
  uint8_t index;
}FIR_Filter;

FIR_Filter *Fir_Xadc;

void FIR_Filter_Init(FIR_Filter* p) {

  int i;

  printf("FIR Filter Initialization \r\n");

  for(i=0; i<FILTER_TAP_NUM; i++) {

    p->sample_buff[i] = 0;
  }

  p->index = 0;
}

double FIR_Filter_Calc(FIR_Filter* p, double input_signal, double* coeff) {


  if(Sample_Count==0) {

    p->sample_buff[p->index] = input_signal;

    printf("Scrivo il primo campione nella posizione %d del buffer\r\n", p->index);
    printf("\r\n");
    printf("PRIMO CAMPIONE SCRITTO--> %6.5f\r\n", p->sample_buff[p->index]);
  }
  else {
    printf("\r\n");
    printf("VALORE SAMPLE COUNT --> %d \r\n", Sample_Count);
    printf("\r\n");

    for(j=(FILTER_TAP_NUM-1); j>0; j--) {

       p->sample_buff[j] = p->sample_buff[j-1];

       printf("BUFFER IN POSIZIONE j--> %d -- CONTENUTO --> %6.5f \r\n", j, p->sample_buff[j]);
    }

    p->sample_buff[p->index] = input_signal;
    printf("BUFFER IN POSIZIONE j--> %d -- CONTENUTO --> %6.5f \r\n", p->index, p->sample_buff[p->index]);
  }

//  if(Sample_Count>=0) {
//
//    if(Sample_Count<=FILTER_TAP_NUM) {
//
//      for(Coeff_Count=0; Coeff_Count<Limit; Coeff_Count++) {
//
//        tmp += coeff[Coeff_Count]*p->sample_buff[Sample_Count-Coeff_Count];
//      }
//
//      Limit++;
//    }
//    else {
//
//      for(Coeff_Count=0; Coeff_Count<FILTER_TAP_NUM; Coeff_Count++) {
//
//       tmp += coeff[Coeff_Count]*p->sample_buff[Sample_Count-Coeff_Count];
//      }
//    }
//  }


  if(Sample_Count>=0) {

    if(Sample_Count-Coeff_Count >= 0) {

      for(Coeff_Count=0; Coeff_Count<FILTER_TAP_NUM; Coeff_Count++) {

        tmp += coeff[Coeff_Count]*p->sample_buff[Coeff_Count];
      }
    }
  }

  Sample_Count++;

  return output_signal = tmp;
}


Il problema che ho riscontrato con questo codice è che facendo passare i campioni discreti all'interno del filtro è che i valori delle temperatura mi vanno a variare moltissimo.

Se invece sul segnale di uscita gli imposto un cast a unit16_t invece i valori mi vengono tutti zero.

Però i coefficienti che ho usato li ho generati impostando una freq di campionamento pari 1Mh, che sarebbe quello che dicevo sopra, e poi impostando una freq di taglio pari a quella del ripple che vedevo sull'uscita della reference. So che queest'ultima cosa può non essere corretta ma non sapevo cosa metterci.
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[10] Re: Filtro FIR

Messaggioda Foto Utentelorenrus » 22 lug 2021, 18:27

MarcoD ha scritto:
Cosa intendi con "Per me la frequenza di taglio deve essere leggermente superiore dell'inverso della costante di tempo dominante del sistema fisico." ?


Fisicamente deve esserci del calore che scalda la materia, la quale ha un capacità termica.
La materia presente una resistenza termica rispetto l'ambiente circostante, per cui il calore si dissipa all'esterno.
Ora non so spiegarmi bene, Il tutto, si si suppone dimensioni trascurabili ( non tempo di propagazione della temperatura) si traduce in una equazione differenziale del primo ordine, la quale è caratterizzata da una costante di tempo.
Detto in altre parole:
quando accendi l'apparato (calore costante viene generato ), la temperatura sale dal valore ambiente a quello finale con una costante di tempo.


Secondo me questa cosa non credo sia inerente, almeno al mio caso.

Io cerco anche di farmi un paragone nei casi in cui l' ho utilizzato su segnali aanalogici, di cui io so la freq con cui sono campionati e la freq del segnale. Di conseguenza posso creare un filtro in base alle mire necessità.

Essendo che io qui non sto filtrato un segnale analogico ma i campioni discreti di esso non riesco a farmi un 'idea su come scegliere i parametri che mi permettono di modellizzare il filtro.

Grazie
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti