closed_loop_speed_pid.py

Unidad de control de motor con encoder M5Stack (DRV8837DSGR) · Archivo : closed_loop_speed_pid.py · Lenguaje : MicroPython · Uso : Régulation de vitesse en boucle fermée via PID pour maintenir une consigne stable malgré les charges variables.

Implementación de un controlador PID de software para mantener una velocidad constante leyendo el codificador y ajustando el PWM.

Utiliza la interfaz I2C para leer datos del codificador y escribir la consigna PWM. El código asume direcciones de registro genéricas (0x10 para velocidad, 0x01 para PWM) que deben adaptarse a la hoja de datos del firmware de M5Stack. Requiere una fuente de alimentación del motor externa estable para evitar caídas de tensión que perturben las lecturas del codificador.

closed_loop_speed_pid.py

import time
from m5stack import i2c

# Adresse I2C par défaut du driver
ADDR = 0x2F
bus = i2c.I2C(1)

# Configuration PID simple
Kp, Ki, Kd = 2.0, 0.5, 0.1
setpoint = 150  # Vitesse cible (unités arbitraires ou RPM selon config)
integral = 0
last_error = 0

while True:
    # Lecture de la vitesse actuelle depuis le registre de l'encoder (ex: reg 0x10)
    # Note: Les registres exacts dépendent du firmware M5Stack spécifique
    current_speed = bus.readfrom_mem(ADDR, 0x10, 2)
    speed_val = int.from_bytes(current_speed, 'little')
    
    error = setpoint - speed_val
    integral += error
    derivative = error - last_error
    
    output = Kp * error + Ki * integral + Kd * derivative
    
    # Limitation de la sortie PWM (0-255)
    pwm_val = max(0, min(255, int(output)))
    
    # Écriture du duty cycle PWM (ex: reg 0x01)
    bus.writeto_mem(ADDR, 0x01, bytes([pwm_val]))
    
    last_error = error
    time.sleep(0.05)

← Volver a la ficha