Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata

Eliminare offset ADC

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Eliminare offset ADC

Messaggioda Foto Utentepeppe855 » 9 ago 2017, 10:47

Salve, spero di essere nella sezione più appropriata innanzitutto. Spiego il problema, tramite dsp devo leggere da sensore di corrente LEM le correnti nelle fasi A e B del motore a cadenza regolare pari al loop di corrente cioè 14,4kHz, tralasciando inizialmente l'interfacciamento di tale sensore con l'adc del mio dsp vorrei capire come eliminare l'offset del Lem e dell'ADC per non falsare le misure di corrente (e tutti i calcoli da esse discendenti).
Nella mia ignoranza credevo bastasse acquisire un certo numero di campioni sul canale ADC quando il lem non fosse percorso da corrente, farne diciamo una media e registrare questo dato come offset da utilizzare durante l'esecuzione vera e propria della mia applicazione pero' osservando due application note (una di casa Microchip l'altra Texsas) ho scoperto che loro affrontano questo problema in maniera diversa dalla mia e 'forse' anche tra loro, spiego:
AN908 Microchip fa cosi:
Description:
Read Channels 1 & 2 of ADC, scale them as signed fractional values using qKa, qKb and put the results qIa and qIb of ParkParm.
Running average value of ADC-Ave is maintained and subtracted from ADC value before scaling.
Specifically the offset is accumulated as a 32 bit signed integer iOffset += (ADC-Offset) and is used to correct the raw ADC by CorrADC = ADCBUFn - iOffset/2^16 which gives an offset time constant of
~MeasurementPeriod*2^16
Do not call this routine until conversion is completed.

Texsas fa cosi':

Prima definisce i due parametri K1 e K2 cosi':
Codice: Seleziona tutto
_iq K1=_IQ(0.998);      //Offset filter coefficient K1: 0.05/(T+0.05);
_iq K2=_IQ(0.001999);   //Offset filter coefficient K2: T/(T+0.05);

poi vedo che c'è questa routine:

Codice: Seleziona tutto
/* Offset Compensation */
interrupt void OffsetISR(void) {
   EINT;

   // Verifying the ISR
   IsrTicker++;

   // DC offset measurement for ADC
   if (IsrTicker >= 5000) {
      offsetA = _IQmpy(K1,offsetA) + _IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
      offsetB = _IQmpy(K1,offsetB) + _IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
      offsetC = _IQmpy(K1,offsetC) + _IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset
   }

   if (IsrTicker > 20000) {
      EALLOW;
      PieVectTable.ADCINT2 = &MotorInvISR;
      EDIS;
   }

   // Enable more interrupts from this timer
   AdcRegs.ADCINTFLG.bit.ADCINT2 = 1;

   // Acknowledge interrupt to receive more interrupts from PIE group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
} // End of Offset Compensation


quindi poi nella routine principale corregge la misura dell'ADC con il valore di offset calcolato appena sopra.
Praticamente nelle due AN hanno realizzato un filtro passa basso?
Come pensate dovrei comportarmi?
Un ringraziamento per chi ha avuto il coraggio di leggere fin qui O_/
Ultima modifica di Foto Utentexyz il 9 ago 2017, 12:43, modificato 1 volta in totale.
Motivazione: Usa i tag "code" per rendere più comprensibile il codice.
Avatar utente
Foto Utentepeppe855
20 2 6
Frequentatore
Frequentatore
 
Messaggi: 143
Iscritto il: 13 mar 2012, 18:40

0
voti

[2] Re: Eliminare offset ADC

Messaggioda Foto Utenteharpefalcata » 9 ago 2017, 14:35

Se queste letture hanno un'offset che è costante o, quantomeno limitato in un intervallo finito di valori, invece che cercare di compensarlo attraverso sovracampionature ed, in genere, attraverso codice supplementare per il controller, hai pensato di usare il classico circuito di clampaggio, tipico dell'elettronica digitale?

I normali circuiti di clampImmagine sono infallibili, e sebbene vale sempre la legge che "Meno componenti ci sono, meno se ne guastano", a volte lasciar fare ad un set di componenti discreti potrebbe essere una scelta migliore.

Detto questo, gli algoritmi che hai postato mi sembra che facciano grossomodo la medesima cosa, ovvero una media pesata sui campioni presi, quindi non credo ci sia molto da dissertare, complice anche il fatto che, se sono stati pubblicati da due vendor di tale rango, godono di un'ottima affidabilità.

Saluti.
Avatar utente
Foto Utenteharpefalcata
179 2 5
Frequentatore
Frequentatore
 
Messaggi: 187
Iscritto il: 28 lug 2015, 20:03

0
voti

[3] Re: Eliminare offset ADC

Messaggioda Foto Utentevenexian » 9 ago 2017, 14:41

harpefalcata ha scritto:... a volte lasciar fare ad un set di componenti discreti potrebbe essere una scelta migliore.

Dovrebbero essere quelli giusti, però.
La tua soluzione non è per nulla una buona idea dato che lascia flottante l'ingresso del convertitore.
Entrambe le soluzioni nelle AN sono invece funzionali.
Avatar utente
Foto Utentevenexian
999 1 4
Stabilizzato
Stabilizzato
 
Messaggi: 333
Iscritto il: 13 mag 2017, 9:07

0
voti

[4] Re: Eliminare offset ADC

Messaggioda Foto Utenteharpefalcata » 9 ago 2017, 14:46

venexian ha scritto:Dovrebbero essere quelli giusti, però.


Questo è il minimo.

venexian ha scritto:La tua soluzione non è per nulla una buona idea dato che lascia flottante l'ingresso del convertitore.


Mi sembrava scontato che il circuito che ho postato fosse solo un'idea di massima, in quanto non è minimamente dimensionato per le esigenze dell'autore del thread.

Il gruppo di ingresso al pin del controller, dovrebbe essere opportunamente dimensionato.
Avatar utente
Foto Utenteharpefalcata
179 2 5
Frequentatore
Frequentatore
 
Messaggi: 187
Iscritto il: 28 lug 2015, 20:03

1
voti

[5] Re: Eliminare offset ADC

Messaggioda Foto Utentevenexian » 9 ago 2017, 14:57

Dopo il condensatore bisognerebbe inserire un partitore per stabilire lo zero, che a sua volta avrebbe il suo offset dovuto alla tolleranza dei componenti e alla variabilità del riferimento positivo.
Oltre a questo, introdurrebbe anche un errore di misura a causa dell'impedenza di carico e anche una variazione della risposta in frequenza.
Dopo tutto questo, il diodo non servirebbe più a nulla.
Continua a non sembrarmi un'idea migliore dell'eliminazione via firmware.
Avatar utente
Foto Utentevenexian
999 1 4
Stabilizzato
Stabilizzato
 
Messaggi: 333
Iscritto il: 13 mag 2017, 9:07

0
voti

[6] Re: Eliminare offset ADC

Messaggioda Foto Utentepeppe855 » 10 ago 2017, 18:30

Grazie per le risposte. Al momento ho implementato l'algoritmo della Texsas (il secondo) che mi pare di capire sia un filtro con una frequenza di taglio fc=3Hz in cui T=1/Fpwm (con Fpwm=10kHz) ed una Tau=0.05s pero' non ho ben capito cosa volesse fare con quegli if su IsrTicker, avete qualche idea?
Mentre per quanto riguarda l'algoritmo di Microchip non ci ho capito praticamente nulla, nel senso che non riesco a comprendere nella formula iOffset += (ADC-Offset) la differenza tra Offset e iOffset.
Comunque perché non va bene misurare l'offset del Lem quando questo non è percorso da nessuna corrente, quindi ad esempio fare questa operazione in una fase iniziale di setting, ed invece implementare questo filtro come fanno Texsas e Micochip?
Grazie O_/
Avatar utente
Foto Utentepeppe855
20 2 6
Frequentatore
Frequentatore
 
Messaggi: 143
Iscritto il: 13 mar 2012, 18:40

0
voti

[7] Re: Eliminare offset ADC

Messaggioda Foto Utentevenexian » 10 ago 2017, 18:41

Il filtro corregge l'offset in modo dinamico.
Se per qualsiasi motivo questo dovesse variare, come ad esempio a causa della temperatura, il filtro adeguerebbe la correzione al nuovo valore.
Se invece fai un azzeramento iniziale hai due problemi:
. Assicurarti che la corrente sia effettivamente a zero mentre fai l'azzeramento.
. La necessità di ripetere questo azzeramento ad intervalli regolari per adeguarlo alle variazioni del sistema.
Avatar utente
Foto Utentevenexian
999 1 4
Stabilizzato
Stabilizzato
 
Messaggi: 333
Iscritto il: 13 mag 2017, 9:07

0
voti

[8] Re: Eliminare offset ADC

Messaggioda Foto Utentepeppe855 » 10 ago 2017, 19:11

Ciao venexian chiarissimo. Quindi al piu' posso utilizzare l'offset misurato senza corrente nel LEM come valore di primo tentativo per far convergere piu' rapidamente i calcoli del filtro o è un cazzata?
Se posso approfittare del tuo sapere (e pazienza) vorrei chiederti, nel pdf del datasheet del LEM a pagina 14 (http://www.totemelectro.com/public/pdfs ... series.pdf) alla voce Supply voltage UC dice che si rileva un forte ripple in uscita dal Lem è perché si sta' utilizzando un alimentatore ad alta impedenza, quindi alimentando io il Lem con un alimentatore stabilizzato da banco rientro in questo caso e quindi devo provvedere ad inserire un condensatore di disaccoppiamento da 100nF (o piu').
Invece alla voce Output Vout non ho capito cosa fare, al momento ho collegato direttamente l'uscita del Lem all'ingresso della mia scheda di prototipazione, la quale interpone un piccolissimo filtro tra l'ingresso del LEM e il pin dell' ADC ( R=2K C=220pF), c'è qualcosa di scorretto secondo te?
Grazie davvero per il disturbo che stai prendendo
Avatar utente
Foto Utentepeppe855
20 2 6
Frequentatore
Frequentatore
 
Messaggi: 143
Iscritto il: 13 mar 2012, 18:40

0
voti

[9] Re: Eliminare offset ADC

Messaggioda Foto Utentevenexian » 10 ago 2017, 21:26

Ciò che è scritto nel punto che fai notare è che l'assorbimento del LEM non è costante, ma impulsivo.
Questo particolare può generare ripple all'alimentazione del LEM se l'alimentazione ha un'alta impedenza. E questa non è una bella cosa. Pertanto bisogna alimentare con una sorgente a bassa impedenza.
Un alimentatore stabilizzato da banco ha una bassa impedenza di uscita non alta. Ma se dall'alimentatore al LEM la distanza non è breve, l'impedenza dei fili e le tracce si somma a quella dell'alimentatore, alzandola.
Mettendo un condensatore vicino al LEM, si abbassa nuovamente l'impedenza a valori accettabili.
Visto che quel condensatore non crea comunque problemi, è di sicuro buona cosa mettercelo.

L'uscita è ottimale, bassa impedenza.
Il condizionamento del segnale con un filtro RC è adatto all'uso che stai facendo, ma i valori non mi sembrano ottimali. La frequenza di taglio è attorno ai 360 kHz che è molto alta. Dovresti metterla a circa un decimo della frequenza di campionamento, così da stare tranquillo di non sottocampionare. Fissa la R a 10 kohm e trova il C adatto. Questi valori non sono critici.

Nessun disturbo. Mentre si scrive, si impara.
Avatar utente
Foto Utentevenexian
999 1 4
Stabilizzato
Stabilizzato
 
Messaggi: 333
Iscritto il: 13 mag 2017, 9:07

0
voti

[10] Re: Eliminare offset ADC

Messaggioda Foto Utentepeppe855 » 11 ago 2017, 10:59

Capisco, quindi per avere una frequenza di taglio da Fc=1.44kHz e fissando la resistenza a R=10kohm il parametro libero C=11nF.
Il piccolo filtro RC di cui parlavo ieri con Fc=361kHz è integrato nella scheda di prototipazione quindi non posso escluderlo, alla luce di cio' lascio R=10kOhm C=11nf?
Mi hai lasciato come parametro libero la scelta di C fissando R=10kohm come mai? (fissare la R cosi alta è per limitare l'assorbimento della corrente?)
Ti chiedo questo perché leggendo la frase:

"The output Vout has a very low output impedance of typically 2 ohm; it can drive 100 pF directly. Adding series Rf = 100 ohm allows much larger capacitive loads. Empirical evaluation may be necessary to obtain optimum results"

parla di una Rf=100ohm quindi perché non si è calcolato C partendo da Fc=1.44kHz e Rcirca=50ohm?
Ultimissima domanda promesso :D la frase " The minimum load resistance on Vout is 1 kohm" è riferita al mio ADC oppure al carico comprensivo dei 2 filtri piu' l'impedenza di ingresso dell'ADC?
O_/
Avatar utente
Foto Utentepeppe855
20 2 6
Frequentatore
Frequentatore
 
Messaggi: 143
Iscritto il: 13 mar 2012, 18:40

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite