import machine
# 1. Configuración de Hardware
# ADC en el Pin 26 (Canal 0)
adc = machine.ADC(26)
# Configuración de 10 pines GPIO para el DAC R-2R (Pines GP0 al GP9)
# LSB = Pin 0, MSB = Pin 9
# Usamos una tupla (estructura inmutable) para mayor seguridad y velocidad en la ISR
pines_dac = tuple(machine.Pin(i, machine.Pin.OUT) for i in range(2,11))
# Variable global para evitar reserva de memoria en la ISR
y_out_convertido = 0
# 2. Rutina de Servicio de Interrupción (ISR) por Temporizador
def isr_muestreo(timer):
global y_out_convertido
# 2.1 Adquisición de la señal
# MicroPython lee el ADC a 16 bits (0 a 65535).
# El offset de 1.65V equivale a ~32768. Lo restamos para centrar en cero.
x_n = adc.read_u16() - 32768.0
# ---------------------------------------------------------
# 2.2 ESPACIO PARA PROCESAR LA SEÑAL (Ej. Filtro FIR)
# (En este ejemplo base, la salida es igual a la entrada)
y_n = x_n
# ---------------------------------------------------------
# 2.3 Reconstrucción de la señal: Y en 10 bits para la red R-2R
# Sumamos el offset nuevamente y dividimos por 64
# para escalar de 16 bits (65536) a 10 bits (1024)
y_out_convertido = int((y_n + 32768.0) / 64)
# Protecciones contra desbordamiento (Saturación)
if y_out_convertido > 1023:
y_out_convertido = 1023
elif y_out_convertido < 0:
y_out_convertido = 0
# Escritura paralela en la red R-2R (Optimizado para ISR)
# Iteramos directamente sobre los objetos Pin de la tupla
for bit, pin in enumerate(pines_dac):
pin.value((y_out_convertido >> bit) & 1)
# 3. Inicialización
def main():
print("Iniciando sistema PDS con DAC R-2R de 10 bits...")
# Se configura el Timer, emulando la frecuencia original (ej. 1291 Hz)
frec_muestreo = 1291
timer_muestreo = machine.Timer()
timer_muestreo.init(freq=frec_muestreo, mode=machine.Timer.PERIODIC, callback=isr_muestreo)
# Bucle infinito principal (el procesador queda libre para otras tareas)
while True:
pass
# Ejecutar programa
main()Loading
pi-pico-w
pi-pico-w
Loading
ssd1306
ssd1306