Duda con diseño de un servo analogico con pic.

Hola .Llevo tiempo detras de crear un servo a partir de un motor DC.Pero me surgio el problema d q los C.I del servo eran ilocalizables por ejemplo el M51664L y alguno mas por lo q decidi hacerme yo uno . El motivo de esto es q los servos q venden no tienen un motor precisamente bueno. :(
Comenze hace unos dias a hacerlo y aunque aun no lo he pasado a la practica tengo dudas de q funcione bien,primero parece muy inestable y segundo me da q el motor se va a calentar.
Voy a subiros el proyecto ,esta programado en PBP con un pic16f876a y admito otras alternativas en la forma de programar para mejorar el resultado.
gracias
 

Adjuntos

  • sevo_analogico_808.rar
    18.4 KB · Visitas: 55
Estuve ojeando el código fuente, y veo que usas un algoritmo on/off para controlar el motor, es decir, si la posición medida es menor a la deseada le mandas 12 V al motor, y sino le aplicás -12V.
Creo que de eso se explica que no sea estable, hasta que el programa mide que el motor se pasó de largo e invierte la tensión en el motor, se vuelve a pasar de largo, etc...

El único momento en que no se aplica tensión al motor es cuando la posición medida es exactamente igual a la deseada, cosa que tal vez nunca llegue a darse por la misma resolución porque se tendría que medir en el momento exacto en que la posición del motor es igual a la deseada.
En todo caso si lo querés hacer on/off tendrías que manejar un rango de posición para que cuando el eje del motor esté cerca del valor objetivo se deje de aplicar tensión.

Lo recomendable sería usar un algoritmo de control PID, usando PWM (veo que tenes CCP2 y CCP1 libres) para hacer el control de posición.

En ésta dirección tenés notas de aplicación de microchip de las que podés sacar código para implementar el control.

Saludos
 
Podria ser q utilizando los modulos PWM la cosa funcionara mejor ,aunque creo q me va a costar dar con el modo de programar.
Lo que voy a hacer (cuando tenga tiempo) es llevarlo a la practica ,pero le voy a cambiar los pines de salida por los de CCP0 y CCP1 para asi no modificar el hardware
en caso de q el algoritmo on/off no de resultado y tenerlo preparado para pwm.


Salu2
 
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.
 
Bueno el algoritmo q me has propuesto lo tendre q mirar mas detenidamente,todos modos no me termina de cuadrar poner un pin en "modo direccion" ya q en un sentido
giraria p-ejm hacia la derecha, y cambiando ese bit giraria a la izquierda pero invirtiendo el ciclo PWM ,creo .
Tal vez sea mejor solucion un algoritmo PWM en ambos canales ,aunque ando un poco verde en el tema de programar con motores. Se te ocurre como hacerlo?
Aqui en mi pais la TV es de autentiko asko. es mucho mas divertida la electronica DDD.



Saludos
 
Atrás
Arriba