Algo más sencillo que se puede hacer (tengo tendencia a las cosas elaboradas de gusto, lo admito) es cambiar solo un pin del pic a pwm, sin meterse a PID y ver que sale.
Entonces vas a tener un pin de pwm, y otro que es una salida común (llamémoslo pin de dirección). El único cambio de hardware sería reconectar uno de los pines que manejan el puente H a una salida CCP/pwm.
Entonces lo que te propongo es hacer algo como:
Código:
error = lectura potenciómetro referencia - lectura potenciómetro motor
si error > 0
pin dirección = 1
else
pin dirección = 0
fin si
si abs(error) > umbral
CTPWM=100% (ciclo trabajo pwm)
else
si abs(error) > tolerancia
CTPWM = error x factor_escala + umbral_arranque
else
CTPWM=0%
fin si
fin si
La idea sería, ir bajando el ciclo de trabajo pwm a medida que más pequeño es el error -> tensión aplicada al motor más baja cuanto menor es el error -> se mueve más lento -> menor sobrepaso en la respuesta (menor oscilación).
Lo de umbral (si abs(error) > umbral) bueno, si el error es grande (qué tan grande lo tendrás que definir vos en función de la velocidad de tu motor) es bueno darle a fondo al motor para ganar en velocidad de respuesta.
factor_escala está para adaptar las distintas resoluciones del CAD y del pwm (CCP).
umbral_arranque sería el valor de ciclo de trabajo a partir del cual el motor se empieza a mover. No empezará a moverse con 0,001 V (por decir algo) sino a un determinado umbral de tensión que dará la corriente (y proporcionalmente la cupla) necesaria para empezar a mover la carga acoplada al eje del motor.
tolerancia es como te decía antes el umbral en el que vas a considerar que el motor ya alcanzó la posición comandada. Como te decía antes, buscar la coincidencia exacta del valor de tensión del potenciómetro del motor y del potenciómetro de referencia puede ser una fuente de oscilación, y a su vez marca la precisión del posicionamiento. Debería lo más bajo posible sin hacer que el sistema entre en oscilación.
Me gustaría probarlo en el proteus a ver como anda (cuando tenga otro rato libre) (no hay nada para ver en la TV, jaja), con qué herramienta programás?.
Saludos.