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


Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

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.


