Certa vez eu fiz um medidor de pressão que usava sensores 4-20ma e então fiz algo simples e foi funcional.
Como já dito, defini um número de medidas como já sugerido para assim calcular a média quando o valor adquirido for mostrado. Não usei buffer...
pseudo code:
- Código: Selecionar todos
#define ADC_FIM_ESCALA (3300) // mV
#define ADC_RESOL_MAX (1U<<9) // 9 bits
#define ADC_RESOL_MIN (ADC_FIM_ESCALA/ADC_RESOL_MAX) // ~6,44mV
#define ADC_QTD_MED_MAX (1U<<23) // 23 bits, 2^32 / 2^9 = 2^32 / ADC_RESOL_MAX
1- Aquisição:
A cada INT, lê o valor do ADC, retira o bit LSB e acumula;
Se a quantidade de medidas máxima para a medida já tiver sido atingida, subtraia a metade do valor da resolução do ADC.
- Código: Selecionar todos
static void p_adc_isr (void) __irq
{
if ( ADSTAT & (1U<<4) )
{
u32_adc_1 += ((ADDR4>>7) & 0x1FF);
if ( u32_count_med_adc_1 == ADC_QTD_MED_MAX )
u32_adc_1 -= (ADC_RESOL_MAX>>1);
else
++u32_count_med_adc_1;
}
//Dummy
VICVectAddr = 0x00000000;
}
2 - Impressão:
Quando for imprimir, calcule a média e prepare para nova sequencia:
- Código: Selecionar todos
U32 p_adc_read_adc (U8 u8_adc)
{
U32 u32_adc;
if ( u8_adc == 1 )
{
// Efetue o calculo da média
u32_adc = (u32_adc_1 / u32_count_med_adc_1);
// Prepare para nova serie de medidas
u32_adc_1 = u32_count_med_adc_1 = 0;
}
return u32_adc;
}
A quantidade de medidas deve ser igual ou maior a quantidade MAX para a média a cada vez que o resultado for mostrado.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.