Eliminare offset ADC
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':
poi vedo che c'è questa routine:
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
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

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.