This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 2 voto(s) - 2 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Control 8 servos pic 16f628 - CCS - MPLABX
#1
adjunto un enlace a un ejemplo para el control de 8 servos, con una aplicación de PC
Pic 16f628 y CCS utilizando el entorno de MPLABX

https://www.dropbox.com/sh/9syipx78rjcmb...oC7ua?dl=0

la filosofía es calcular los tiempos en alto de cada uno de los servos según su posición, y activar un servo detrás de otro, con lo cual, si cada 20ms se tiene que repetir la trama, y suponiendo que como máximo cada servo se activa 2ms en su peor de los casos, podemos ampliarlo hasta unos 10 servos fácilmente.....

es decir, configuramos timer0 para 20 ms, activamos el primer servo, ponemos a 1 su salida y escribimos en Writetimer0() el tiempo en alto de este servo, cuando desborda, ponemos a 0 su salida, ahora ponemos a 1 la salida del siguiente servo y escribimos en Writetimer0() el tiempo en alto de este servo... y así hasta llegar al final.... la limitación radica en que antes de 20 ms tenemos que haber activado todos los servos para volver a repetir la trama.
  Responder
#2
Interesante, gracias por compartir. Hace tiempo vi algo parecido para hacer PWM en distintas salidas.

Mirando el código hay algo que no me queda claro, quizá sean las horas XDD
- Qué le indicas por consola? el modo y los servos que quieres mover? (veo sólo que capturas un caracter)
- El array de pos en teoría son los grados, pero si sólo le pasas un caracter, cómo le indicas los grados?
- Y por último, me pierdo en los cálculos con los valores constantes Sisi3 Imagino que es la forma de calcular el tiempo del periodo en el que la salida permanece en alto para girar lo indicado...
  Responder
#3
1) la primer vez envió un carácter, que es el modo, luego según el modo envió mas o menos caracteres; el modo donde inicializo envió 8 datos más el control de modo, uno detrás de otros; si quiero leer un un motor, envió solo un dato más el modo; para escribir solo un servo envió el numero del servo y la posición más el modo, y así siempre... Mira la rutina de interrupción de recepción y lo comprenderás mejor.

2) el array de pos son las posiciones, pero si te fijas si lo envió todo junto, no hace falta decir el motor que es, ya que el primero es para el primero, el segundo para el segundo y así sucesivamente. Pero si es otro modelo, por ejemplo en escribir solo un servo, si que paso el numero del modo más el numero del servo a escribir más la posición del servo.

3) para calcular los tiempos en alto es una regla de 3-> el servo se mueve entre 1ms para 0 grados y 2ms para 180 grados, 1,5ms será para 90 grados (el rango de 1ms a 2ms depende del servo), con estos datos m=(180-0)/(2ms-1ms), con esto tengo la pendiente de la recta y=m*x+b
  Responder
#4
Los puntos 1 y 2 sí los tenía claros, me descolocaba pos2[] (grados[] en la función), que son enteros y leías un caracter. Supongo que CCS hace casting del valor ASCII (no sabía si la comunicación era en binario) y entonces enviando el caracter correspondiente a los grados que quieres moverlo, se consigue. Estoy en lo cierto o ando aún equivocado?

El punto 3 con los números no lo relacioné con la pendiente de una recta, pero después de comentarlo, se ve mucho más claro Sisi1 Por curiosidad, el 5000000.0 de qué es? La linea la entiendo (o creo), para calcular el valor inicial del timer1, pero el número que comento, ni idea.

Gracias por la respuesta y sorry por preguntar, con os PICs llevo poca chicha...
  Responder
#5
Hola illusionista_86 !

Para manejar muchos servos no es conveniente utilizar un micro, es mejor utilizar integrados especializados para su manejo y reservar el micro para otras tareas mas importantes. El PCA 9685 es muy barato y puede manejar 16 servos.

http://www.todopic.com.ar/foros/index.php?topic=42930.0

Saludos,

Miquel
  Responder
#6
Sip, lo se, pero nunca esta demás saber que también se puede con un pic, es solo un ejemplo

Gracias Miquel!
  Responder
#7
WeSo escribió:Los puntos 1 y 2 sí los tenía claros, me descolocaba pos2[] (grados[] en la función), que son enteros y leías un caracter. Supongo que CCS hace casting del valor ASCII (no sabía si la comunicación era en binario) y entonces enviando el caracter correspondiente a los grados que quieres moverlo, se consigue. Estoy en lo cierto o ando aún equivocado?

El punto 3 con los números no lo relacioné con la pendiente de una recta, pero después de comentarlo, se ve mucho más claro Sisi1 Por curiosidad, el 5000000.0 de qué es? La linea la entiendo (o creo), para calcular el valor inicial del timer1, pero el número que comento, ni idea.

Gracias por la respuesta y sorry por preguntar, con os PICs llevo poca chicha...


Sip, enviando directamente el valor del servo, al recibirlo es dicho valor, no hace falta nada mas, si no recuerdo mal, en XC8 debería comértelo a string para enviarlo y convertirlo a entero al recibirlo, pero aquí es tal cual

El 5000000 es la frecuencia/4, 20000000/4=5000000, toda la formula es la forma de calcular el valor a cargar en el timer para hacer la interrupción según la posición del servo.

No pasa nada, preguntando se entiende la gente, para eso estamos, para ayudar unos a los otros,

Y ten en cuenta también lo que ha dicho Miquel, es otra forma de hacerlo, y tal vez para control de algún robot con muchos servos y que el movimiento de este sea critico, tal vez interese... Pero creo que si es algo para "andar por casa" o aprender las interrupciones de los timers, sirve..
  Responder
#8
Perfecto, aclarado entonces, gracias!!

Lo de los drivers está claro, pero me parece interesante poder hacer PWM con PICs sin esas salidas o con menos de las necesarias Confundidois1:
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Reloj/cronometro PIC 16F84A axisgar 16 7,602 23-06-2020, 09:11 PM
Último mensaje: richarddamian
  [INFO+TUTO] Programador USB PIC K150 cansi22 30 38,538 08-12-2018, 02:06 PM
Último mensaje: Shellmer
  Placa de evaluación gratis pic 8 bits Jorge 24 6,851 21-11-2018, 01:11 AM
Último mensaje: Shellmer
  DUDA bootloader para pic OtreblaCU 7 3,615 29-11-2017, 04:17 PM
Último mensaje: OtreblaCU
  Iniciarse programación Pic (USB PIC K150) Kvothe 4 4,419 12-03-2017, 09:33 PM
Último mensaje: Shellmer