from machine import Pin
import utime
import math
pines = [2, 3, 4, 5, 6, 7, 8, 9, 10]
def GPIO_SALP(valor, listagpio):
pines_gpio = [Pin(pin, Pin.OUT) for pin in listagpio]
ii = 1
for i in range(8):
pines_gpio[i].value(1 if (valor & ii) else 0)
ii = ii << 1
def SerieFourier_Ej2(nmax):
"""
Funcion definida en [-2, 2) con periodo T = 4:
f(x) = 0 para -2 <= x < -1
f(x) = -2 para -1 <= x < 0
f(x) = 1 para 0 <= x < 1
f(x) = 0 para 1 <= x < 2
Frecuencia angular fundamental: w0 = 2pi / T = pi/2
Coeficientes (verificados termino a termino):
a0 = -1/2
an = -(1 / (n*pi)) * sin(n*pi/2)
bn = (3 / (n*pi)) * (1 - cos(n*pi/2))
Serie resultante:
f(x) = a0/2 + SUM[ an*cos(n*w0*x) + bn*sin(n*w0*x) ]
= -1/4 + SUM[ an*cos(n*pi/2*x) + bn*sin(n*pi/2*x) ]
"""
T = 4.0 # periodo real
w0 = math.pi / 2.0 # frecuencia angular fundamental = 2pi/T = pi/2
a0 = -0.5 # = -1/2
xmin = 0.0
xmax = T # un periodo completo
delta = T / 120.0 # 120 muestras por periodo
x = xmin
while x < xmax:
sum_val = 0.0
for n in range(1, nmax + 1):
npi2 = n * math.pi / 2.0 # n*pi/2
sin_h = math.sin(npi2) # sin(n*pi/2)
cos_h = math.cos(npi2) # cos(n*pi/2)
# --- Coeficiente an ---
an = -(1.0 / (n * math.pi)) * sin_h
# --- Coeficiente bn ---
bn = (3.0 / (n * math.pi)) * (1.0 - cos_h)
sum_val += an * math.cos(n * w0 * x) + bn * math.sin(n * w0 * x)
fx = a0 / 2.0 + sum_val # = -1/4 + suma armonicos
print(fx)
# --- Mapeo a 8 bits ---
# Rango de f(x): [-2, 1] -> se mapea a [0, 255]
f_min = -2.5
f_max = 1.5
val_dac = int((fx - f_min) / (f_max - f_min) * 255.0)
val_dac = max(0, min(255, val_dac))
GPIO_SALP(val_dac, pines)
x += delta
# Bucle principal: barre el numero de armonicos de 1 a 49
while True:
for narmonicos in range(1, 50, 1):
SerieFourier_Ej2(narmonicos)