Inconveniente: Control de servomotor con ATMEGA32

Hola que tal

Buscando en varios foros se me complico encontrar una respuesta a mi pregunta. Espero alguien pueda ayudarme o simplemente opinar sobre el problema que tengo. Seria bueno escuchar los problemas comunes que se tienen con el control de servos y sus soluciones.

Tengo algunos servos, he intentado hacerlos funcionar con un micro ATMEGA32A, estoy utilizando el timer1 y puedo controlar sin problema un par de pequeños servos pero no he tenido éxito con el resto que son de tamaño estándar y uno a 1/4 de escala.

Es como si no hubiera señal, simplemente no se mueven; pero cuando separo las tierras del ATMEL y la del servo este se se mueve hacia un extremo y ahí se queda, al volver a unir las tierras el servo se apaga como si no hubiera señal. Suena como si fuera un problema de conexión, pero todo esta bien conectado y eso me pasa con todos mis servos salvo con los pequeños. Uno de ellos es completamente nuevo de hecho.

La señal pwm que envío tiene 50Hz y vario la duración del pulso de 1 a 2ms, los servos son Hitec y parallax y la alimentación es 5V y 3A max.

Me agradaría escuchar opiniones, gracias.
 
Todo suena a problema de alimentaciones. ¿Puedes dar más detalles sobre las alimentaciones, desacoplos, conexiones, circuito, esquema?
 
Hola, muchas gracias por responder

Puede que se trate de la alimentación, pues las conexiones están bien ya que no tengo problemas controlando servomotores pequeños. Anexo la imagen del esquema.

Es la conexión que todo mundo conoce. Al unir ambas tierras mediante el cable rojo, el servo no responde, pero al retirar el cable (dejando OC1A flotando) el servo se mueve hacia un extremo. He usado otras alimentaciones para el micro ademas de la del puerto USB. El código es este, el cual corre con un cristal de 4MHz.

//TIMER 1 CONFIGURATION

/***TCCR1A: Timer/Counter 1 control register A

COM1A1:0 10 Non inverting mode
COM1B1:0 10 Non inverting mode
FOC1A:B 00 Just clear it
WGM11:0 10 Fast PWM ICR1 (Check TCCR1B also)
*/
TCCR1A = 0b10100010;

/***TCCR1B: Timer/Counter 1 control register B

WGM13:2 11 Fast PWM ICR1 (Check TCCR1A also)
CS12:0 011 Clock/64 from prescaler
*/
TCCR1B = 0b00011011;

/***TIMSK: Timer/Counter interruot mask register

OCIE1A:B 0 Timer/Compare match interrupt disabled
TOIE1A/B 0 Timer/Compare overflow interrupt disable
*/
TIMSK =0;

/***ICR1 Input Capture Register
*/
ICR1 = 1249;

Esa configuración permite obtener un PWM a 50Hz, con un ancho de pulso positivo de 2ms. Como dije puedo controlar servomotores pequeños pero no puedo con servos de mayor tamaño. puede que parezca que algo anda mal con la alimentacion pero estoy usando una fuente de 5V capaz de entregar 3A. En fin, no se si haz tenido problemas similares.
 

Adjuntos

  • Dibujoxx.jpg
    Dibujoxx.jpg
    7.5 KB · Visitas: 29
El simple hecho de que te falle cuando conectas el cable rojo ya dice mucho, y confirma que tienes un problema de alimentaciones. Me atrevería a decir que de masas.

¿Porqué no mides, sin el cable rojo, la tensión que hay entre las dos masas?

El mero hecho de que con servos pequeños (y por tanto, de menor consumo) te funcione, pero con servos más granes (y por tanto, mayor consumo) te falle, indica que tienes un problema de consumos. Presumiblemente, se deba a que la masa del USB y la de la fuente no sean la misma y por ahí circule una corriente indeseable... Prueba a alimentar los servos con pilas o una batería.
 
Hola de nuevo

Probé lo que sugeriste, no había pensado en eso como la causa. Medí el voltaje entre ambas tierras, indicaba 1.2V lo cual no es poco. Sin embargo aunque coloqué unas baterías nuevas en lugar de la fuente el problema no se corrige: al unir las masas (que es como debe ser) el servo no responde, al separarlas se mueve a un extremo. pasa con todos los servos salvo con los pequeños.

¿Crees que tener esa diferencia de potencial entre tierras pudo haber dañado algo?.

Gracias
 
Bien, Beamspot tienes razón, el problema esta asociado a las tierras. Coloque un optocoupler para transmitir la señal PWM al servo sin que este tenga que compartir la tierra con el micro y funcionó.

Colocar optocouplers no me parece mala idea pues es hace mas robusto al circuito y elimina el problema de la diferencia de voltajes entre masas.

En fin gracias Beamspot tu diagnostico me ayudo a resolver el problema por ahora. Aunque aun debo saber la causa real de porque los servos fallan al compartir tierras aun usando baterías. Si tienes alguna opinión o alguien mas, me agradaría escucharla.
 
Hola, gracias por preguntar

También creo que el problema se asocia con el ruido que hay en tierra, pero cuando corro el micro paso a paso o por tramos de código mediante el debugger (un AVR Dragon) no se indica desconexión del dispositivo ni ningún otro problema en el puerto USB, es como si el ruido solo afectara la señal de control que llega al servo. Ademas los otros periféricos trabajan bien mientras que los servos no.

Tras unas pruebas he llegado a pensar que el problema esta en el circuito del micro, este se encuentra en un protoboard (¡nuevo!), alimentado por el puerto USB. Las terminales del USB indican 5.1v sin carga, al conectar el micro el voltaje cae a 4.85, no hay sobredemanda de corriente pues el mismo circuito alimentado con fuente indica 6mA de consumo. Quizá se deba a una resistencia parásita en alguna conexión del protoboard que causa un voltaje indeseado donde debería haber 0V. Pero eso ya no lo probare por ahora (...).

En fin gracias por sus comentarios. Se debe tomar en cuenta el ruido de tierra o ground loop al acoplar dos circuitos (http://focus.ti.com/lit/an/slla268/slla268.pdf). Gracias Verogirl parece que el problema si esta en el circuito del micro.
 
Atrás
Arriba