Paso 11: Control y problemas del Motor Servo
Teoría de control y mi aplicación
¿Cómo sabemos cómo controlar algo? Miramos la hoja de datos. Eso es exactamente lo que hice (hace tiempo) con este servo y descubrí que necesitaba una señal de 50Hz de ciclo de trabajo variable. Que es un poco lento para un módulo de PWM por hardware que de todos modos estamos en corto con (necesitamos para los motores de conducción por pista), esta señal del servo debe ser poco golpeado - software generado.
Sabiendo esto, calculé un temporizador para generar una interrupción cada 20ms. Para ello utilicé el módulo libre del Timer3 del microcontrolador. Sabiendo que:
FOSC = 48 [MHz], encontramos que Fosc / 4 = 12 [MHz], y de aquí calculamos Tinstruction = 83.33 [ns]
Este es el tiempo necesario para que una instrucción completar en el PIC y la base de tiempo para todos los módulos de temporizador interno. También sabemos que Timer3 es un temporizador/contador de 16 bits, por lo que se puede contar hasta 65535 y desbordamiento + dar una interrupción en el siguiente incremento. Tenemos que configurarlo para que le da a esta interrupción cada 20 [ms]. Para ello, calculé el número de incrementos de contador de tiempo que se necesitan para 20 [ms] que transcurran:
20 [ms] / 83.33 [ns] = 240096
Este es un valor que no cabe en la cadena de contador de 16 bits, por lo que tendremos que frenar la velocidad de incremento de alguna manera: esto es fácil de hacer mediante el uso de prescalers. Asignando un prescaler de 1:4 para este temporizador, decimos el PIC se incrementa el contador de tiempo registro de valor a un ritmo cuatro veces más lento que este reloj interno de 83.33 [ns].
240096 / 4 = 60024
Esto se traduce en: con la velocidad de recuento disminuida a 332.33 [ns], el contador tendrá que tomar 60024 pasos hasta que transcurre nuestro 20 [ms]. ¿Tenemos que provocar una interrupción, cuando esto sucede, y cuando ocurren las interrupciones? Cuando el timer se desborda. Dicho esto, nos reste este valor del desbordamiento de 65536:
65536 - 60024 = 5512 = 0x1588
Si ponemos esto en la cadena de TMR3 contador cada vez que la bandera de interrupción se establece por el evento de desbordamiento, obtenemos un bonito 20 [ms] interrumpir ritmo que puede ser utilizado para este algoritmo de servo.
A continuación, tenemos que lidiar con cambiar el ciclo de deber. Esto habría sido muy fácil de hacer si tenía un módulo de comparación disponible, pero desafortunadamente no lo hice. Para superar esto, definido una variable que enciende cada vez que una interrupción del vino. El valor de esta variable me permitió distinguir entre dos diferentes interrrupts: que ha disparado un flanco ascendente al principio de los años 20 [ms] período y que desencadenó el flanco descendente basada en el ciclo de trabajo requiere. Porque el borde de levantamiento es obligatorio, cada vez que la interrupción se activa, una nuestra variable es '0', enviamos el pin IO al estado alto. Basado en el tiempo requerido en (por ahora vamos a echar 1 [ms]), calculamos un nuevo valor de init temporizador contador rápidamente para que el timer se desborda otra vez después de este período de tiempo. 1 [ms] este cálculo es el siguiente:
1 [ms] / 333.3 [ns] = 3000
Así que registro de contador de TMR3:
TMR3 = 65536-3000 = 62536
y espere a la próxima interrupción. Cuando se produce, enviamos el pin IO bajo estado y configurar la cadena de la contador de TMR3 otra vez con el número 20 [ms]. Tenemos que tener en cuenta, que 1 [ms] de 20 [ms] ya pasado, por lo que las matemáticas se ven algo como esto para la segunda actualización de TMR3:
TMR3 = 5512 + 3000
Después hemos terminado con esto, que cambiar nuestra variable otra vez y esperar una interrupción. Esto desencadenará un flanco ascendente y el 20 [ms] período comienza. Entonces otra vez calculamos el nuevo TMR3, y esto va en y en y en, en un bucle sin fin. Mirando en la hoja de datos que te platiqué anteriormente, podemos encontrar la longitud máxima de este ciclo de trabajo, límites de software pueden ser escritos para evitar que el servo de golpear los extremos y que luchan por ir más allá (y consumir 650mA...).
Retroalimentación del servo no tan bueno, por lo que el servo hará temblar incluso cuando se sigue haciendo el mismo deber para siempre - esto debe ser resuelto de alguna manera. Le puse un contador de software que aumenta cuando la 20 [ms] período comienza y agregar algo de código que sólo permite una señal con un cierto deber enviar una cantidad limitada de veces. Después de 20 ciclos, supongo que el eje está en la posición deseada, y dejar de enviar señales = el motor no se agite o buzz.
Problemas
Ocurrieron varios problemas hasta que finalmente me puse a mover el servo en una manera repetible. Yo utiliza servomotores antes sin problemas, sabía qué tipo de señales de control debe ser siempre, pero sólo fue capaz de convertir el servo cada ahora y entonces, al azar. Encienda un trabajó, en los próximos cinco que no. Sospeché la inclinación de la tensión de entrada, 5 [V] buck inclinación de voltaje de salida y hace todo tipo de pruebas para eliminarlos uno por uno. Finalmente, después de probar varios tipos de batería, acabé poniendo un condensador de [uF] 3300 voluminosas muy cerca del jefe del pin de servo - y voilá, finalmente llegó a ser más obediente.
En este punto es bueno cambiar a un laboratorio de fuente de alimentación, si está disponible
¿Qué puede hacer para solucionar el problema en situaciones como ésta? Si se sospecha, que hay algún tipo de subida de tensión en el circuito, hay algunos trucos que puede utilizar para rastrear el error. En primer lugar, ayuda mucho si tienes un laboratorio de alimentación con función de límite vigente, esto evitará que la voladura de las cosas. Simplemente utiliza las pilas (lo he probado con Li-Ion así) es un poco peligroso ya que las dará tanto como pueden, en caso de un cortocircuito y probablemente se quema todo en su camino.
Prueba de 1.
Esta fue la serie de la prueba obvia: pruebas de continuidad, pruebas contra cortocircuitos, material estándar. Los LEDs se parpadea, por lo que el riel de 5V buck tuvo que aceptar, todavía hice estos para asegurarse. También doble comprobé que la señal de control está hecho con el conector amarillo del servo - lo hizo. Teoría de malas conexiones fue arrestado.
Prueba 2.
Hubo un momento en creía que las baterías simplemente no pueden dar suficiente jugo para mover el servo. Para confirmar/busto esto, acabé mirando de SG90 lista de parámetrosy encontró que la pérdida actual es 650 [mA]! Pensé, que esto va a ser el problema, y las baterías no pueden garantizar la misma corriente como mi PSU - esto necesita una prueba.
Tuvo una resistencia de 1,2 ohmios y ponerlo en serie con el cable de entrada negativo de robots. La medida tuvo que ser lado de baja presión, porque la sonda de tierra de alcance y el suelo de la PSU fueron conectados a través de la tierra. Por medición voltaje a través de un resistor de la serie de valor conocido, se puede calcular la corriente que fluye a través de ella, el consumo actual del robot en este caso. Tomó dos medidas, una con el paquete de baterías de iones de litio y uno con la fuente de alimentación, usted puede ver estos a este paso. El uno con el voltaje / la división en 1 [V] es la prueba con la batería, el otro con 500 [mV] por división es la fuente de alimentación. La batería tenía un voltaje menor que el valor de la PSU, y los convertidores DC-DC dibujar extra actual para mantener sus salidas reguladas: se puede ver un punto de [A] 4!
Esto significa que la batería puede proporcionar suficiente para todo el circuito poner en marcha, incluyendo la sobrecarga inicial en el servo cuando empiece a girar el eje. Así que esta teoría fue pillada así.
Prueba 3.
Después de pensar de cuánto el 5 [V] son rastros y cómo el colmo el puesto actual de este servo es, me di cuenta, que un condensador voluminoso local sería una buena idea. Esto ayudaría a con local espontánea actual dibuja. Ya que esta perforación y montaje de una tapa nueva, estaba un poco contra él. Sin embargo, cuando vino un amigo inteligente con esta sugerencia muy sin que yo siquiera mencionar esta teoría, decidí morder la bala y Dale una oportunidad a esto. Tomé una calidad alta (rescatada de una motherboard) 3300 [uF] 6.3 capacitor [V], algunos agujeros perforados para él muy cerca del jefe del pin de salida servo, y soldar la cosa. Encendí el poder y funcionó!!!!!! Esta teoría se confirma para ser verdad, y va a través con él demostrado funciona como un encanto.
Conclusión y terminar esta serie de la prueba
Después vi este trabajo con la batería de iones de litio, y la prueba era repetible, comencé a pensar acerca de cómo montar las enormes pilas en el robot. He intentado poner en la parte posterior, pero que resultó en el robot que desequilibrado - así que decidí darle otra oportunidad a las baterías de Ni-MH y utilizar los robots 4 x soporte de celular de AA para fuente de energía. He hecho las modificaciones necesarias, conectado las baterías y otra vez: me funcionó! Problema resuelto, y la mirada del bot es serio mejor!