A / D 10 bits en Silicon Laboratories C8051Fxxx, interrupción

0

Estoy leyendo el código en C para convertir de analógico a digital y no entendí esta parte. No publiqué todo el código pero esto es suficiente para entender el punto de mis preguntas ya que mis preguntas son un poco generales.

void ad_isr (void) interrupt 10     /*I didnt understand when does the program calls the interrupt and why do we need an interrupt?*/
{
    lowbytevoltage = ADC0L;     highbytevoltage = ADC0H;
    voltage = highbytevoltage*256 + lowbytevoltage;
    array [b] =voltage; 

        if (b == 31)
        {
            for (c=0; c!=32; c++)
            {
                Voltage = Voltage + array[c]; 
            }
                voltage = voltage/32;

¿Por qué necesitamos sumar 32 voltajes consecutivos y luego dividir por 32? También vi en un código de ejemplo de internet

for(i=0;i<16;i++)
{
    ConvertADC();
    while(BusyADC());   
    ADCResult += (unsigned int) ReadADC();
}
ADCResult /= 16;

Así que pensé que pueden tener algo entre ellos ya que 32 es el doble de 16

    
pregunta whyyoucare

2 respuestas

1

Es un filtrado digital simple. Se toma el promedio de 32 conversiones (generalmente las últimas 32 conversiones) para reducir los efectos del ruido de entrada ADC en el resultado final convertido.

Si el ruido eléctrico u otras interferencias pueden afectar el voltaje que va a su ADC, el valor convertido también se verá afectado y no obtendrá el valor verdadero que desea. Al tomar varias lecturas y promediar, el efecto del ruido temporal o del ruido blanco se puede disminuir o eliminar en gran medida.

Los filtros digitales son un tema en sí mismos y los parámetros reales del promedio, como la frecuencia de muestreo, el intervalo entre las muestras y el algoritmo para combinarlos, contra el rango de frecuencia de entrada del ADC y el tipo de señal son profundos e involucrados.

Pero para señales básicas, de baja frecuencia y que cambian lentamente, como lecturas de sensores de sensores o fotodetectores, un filtro simple como este puede ser fácil de implementar para evitar que se realicen acciones sobre conversiones falsas.

    
respondido por el TonyM
0

Como no sabemos qué hacen las funciones ConvertADC y BusyADC, no podemos decir nada sobre por qué usted (o no) necesitaría una interrupción. Supongo que ConvertADC comienza la adquisición al habilitar el ADC. Su función principal luego espera hasta que se establezca un indicador en la interrupción (que BusyADC lee y espera).

En cuanto a 16 y 32: realmente no los necesitas. Esto es solo para crear el valor medio de más de 32 o 16 muestras (básicamente un filtro de paso bajo digital). Depende de su aplicación decidir si y cuántas muestras medias desea (también puede salirse fácilmente con 1).

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas