import machine
# 1. Configuración de Hardware
adc = machine.ADC(26) # Canal 0 analógico
pines_dac = tuple(machine.Pin(i, machine.Pin.OUT) for i in range(2, 12))
# 2. Coeficientes del Filtro IIR Pasa Bajas (Fc=100Hz, Fs=1291Hz)
b0 = 0.0436286852600961
b1 = 0.0872573705201923
b2 = 0.0436286852600961
a1 = -1.32843480532316
a2 = 0.502949546363549
# 3. Variables de Memoria (Retardos / Delays)
x1 = 0.0; x2 = 0.0
y1 = 0.0; y2 = 0.0
y_out_convertido = 0
# 4. Rutina de Interrupción (Muestreo a 1291.32 Hz)
def isr_muestreo(timer):
global x1, x2, y1, y2, y_out_convertido
# Adquisición de muestra y centrado en cero
x0 = adc.read_u16() - 32768.0
# Implementación de la Ecuación de Diferencias
# Nota: Los signos de a1 y a2 se invierten matemáticamente en la ecuación de diferencias
# y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2]
y0 = (b0 * x0) + (b1 * x1) + (b2 * x2) - (a1 * y1) - (a2 * y2)
# Corrimiento de los valores históricos (Shift Register en Cascada)
x2 = x1
x1 = x0
y2 = y1
y1 = y0
# Reconstrucción de la señal: Y en 10 bits
y_out_convertido = int((y0 + 32768.0) / 64)
if y_out_convertido > 1023:
y_out_convertido = 1023
elif y_out_convertido < 0:
y_out_convertido = 0
for bit, pin in enumerate(pines_dac):
pin.value((y_out_convertido >> bit) & 1)
print(x0,y_out_convertido)
# 5. Inicialización Principal
def main():
print("Iniciando Filtro IIR Pasa Bajas...")
timer_muestreo = machine.Timer()
timer_muestreo.init(freq=1291, mode=machine.Timer.PERIODIC, callback=isr_muestreo)
while True:
pass
main()
Loading
pi-pico-w
pi-pico-w
Osciloscopio