promedia varias lecturas pic10f220

1

Quiero hacer un dispositivo electrónico que mida la velocidad del viento en Beaufort. La definición de la escala de Beaufort requiere el cálculo de un promedio en un período de 10 minutos. Elegimos hacer esto usando el siguiente principio (promedio con olvido): filtre-passe-bas2.gif

Por razones económicas y de espacio, elegimos realizar el filtro RC mediante simulación numérica en el microcontrolador.

Fuente de alimentación: tensión de salida analógica de 3V proporcional a la escala de Beaufort con 0 correspondiente a 0V Beaufort, 3V correspondiente a 9 Beaufort (no mostrará valores superiores a 9 Beaufort) Interfaz para el módulo LCD: SPI (SPIdatas y SPI clk) Velocidad del viento codificada en 8 bits

Creo que
Puedo tomar lecturas una vez por segundo (la velocidad del viento es relativamente lenta para cambiar, por lo que no es necesario hacerlo más rápido). Agregue la lectura a la anterior y reduzca a la mitad el resultado para obtener un promedio de ejecución. Cada 10 segundos envía la velocidad escalada de 0 a 9 a la pantalla LCD.

¡Es posible almacenar y promediar varias lecturas pero con solo 16 bytes de RAM y algunas de las necesarias para el software SPI! Para mí es difícil de codificar. El código está altamente optimizado. Por eso vengo a pedirle su ayuda: fs: y conocimientos. Cualquier idea es bienvenida!

Empiezo a codificar, pero tengo dificultades para almacenar y promediar varias lecturas con solo 16 bytes de RAM y algunas de las necesarias para el software SPI ¿Alguien puede ayudarme por favor?

movlw           b'00001001'     ;sets GP1 and GP2 as Outputs
    TRIS            GPIO
    movlw           0x41
    movwf           ADCON0

    movlw 0xC7
    option
;****************************************************************************   
;***** VARIABLE DEFINITIONS**************************************************
;****************************************************************************
    cblock    0x09

    Delay         ;variable for the delay ,to make delays
    Counter       ;variable to count how many measurements
    LCD_data      ;hold the data to be sent to the LCD 
    Counter_data   ; hold the counter for the bits as they are sent to the LCD

    endc
;**********************************************************************
;******************* coding begins*************************************
;**********************************************************************
    ORG     0x000             ; coding begins here
    movwf   OSCCAL         ; update register with factory cal value

start
    clrf LCD_data
    clrf Counter_data
    clrf Counter
    clrf Delay

;***********************************************************************
;                       remaining code goes here
;***********************************************************************
Wait
    movlw .15           ;reload 'Delay' again
    movwf Delay
    movlw 1         ;give TMR0 a start value
    movwf TMR0
Wait1
    movf TMR0,f     ;set Z in STATUS if TMR0 = 0
    btfss STATUS,Z      ;bit test the Z bit, skip if set (= Zero)
    goto Wait1          ;not zero yet so keep checking

    decfsz Delay,f      ;subtract 1 from Delay and see if zero
    goto Wait1          ;not reached zero yet so keep checking
    return
;********************************************************************
; read the voltage on the analog input pin, return result in W
;********************************************************************

ReadADC
    bsf ADCON0,GO_NOT_DONE  ;start measuring the voltage
ADC_Wait
    btfsc ADCON0,GO_NOT_DONE ;skip next instruction if GO/-DONE is zero
    goto ADC_Wait       ;not finished yet!
    movf ADRES,W        ;copy the result to W
    return
    
pregunta thierryneuch

2 respuestas

1

Esto se hace fácilmente usando solo 2 bytes de RAM si implementa un filtro de sobre muestreo de 256 veces.

Usted asigna 2 bytes de RAM para formar un contador de 16 bits. Si observa con atención, observará que el byte superior contiene el valor completo del contador de 16 bits / 256.

Es esta propiedad la que hace que este filtro sea tan fácil.

No estoy en mi computadora, así que intentaré describir lo que quiero decir en pseudo código. Llamemos a los dos bytes que forman el contador CntrH & CntrL. Como se describió anteriormente, el valor de 8 bits para la salida final está contenido en CntrH.

Primero, resta el valor del filtro anterior del contador.

CntrH: CntrL - CntrH

Ahora agregue el valor de 8 bits del convertidor a / d al contador de 16 bits.

A2D + CntrH: CntrL

La salida filtrada está contenida en CntrH.

Este es un filtro muy lento. Por lo tanto, desea inicializar el filtro durante la inicialización tomando una muestra a / d y cargándola en CntrH.

Este filtro lento significa que desea agregar muestras nuevas con bastante rapidez. Una aproximación aproximada es que su período de filtro deseado toma 256 muestras.

En otras palabras, agregue nuevas muestras al filtro a una velocidad de 10 minutos / 256.

[Editar]

Esto es extensible yendo a un acumulador de 24 bits si desea adquirir las muestras a un ritmo más rápido. Esto le daría un filtro de sobre muestreo de 2 ^ 16 (65536) veces.

La misma técnica que la anterior pero usando 3 bytes: CntrH: CntrM: CntrL. Como antes, la salida filtrada de 8 bits está contenida en CntrH.

Dado que desea que el período sea de aproximadamente 10 minutos (600 segundos), acumularía sus muestras a 600 / (2 ^ 16) = ~ 9.1ms

    
respondido por el Dwayne Reid
0

Es posible que lo sea, aunque con el costo de los controladores modernos podría no ser prudente hacerlo, excepto por razones académicas (es decir, de aprendizaje) ... Aún así, es un desafío :-)

Un truco simple, que no desperdicia memoria y no necesita división, es el siguiente:

  1. Establezca un registro en 0
  2. tomar una medida
  3. Divídelo entre 8 (= cambia a la derecha 3 veces)
  4. Agregue el valor al registro
  5. Vuelve a 1. siete veces más.

Después de esto, tienes la media de 8 mediciones en el registro. No es del todo correcto (has redondeado 8 veces) pero es simple ... Puedes mejorar un poco agregando un paso 1.a. donde agregas 4 a la medida.

    
respondido por el jcoppens

Lea otras preguntas en las etiquetas