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
pines_dac = [2,3,4,5,6,7,8,9,10,11]
for i in range(10):
pines_dac.append(machine.Pin(i, machine.Pin.OUT))
# 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
# Desplazamos y extraemos bit por bit para asignarlo a cada GPIO
for bit in range(10):
estado = (y_out_convertido >> bit) & 1
pines_dac[bit].value(estado)
# 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
Osciloscopio