TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: chacruna en 10 de Febrero de 2009, 00:56:41
-
Hola a todos, soy nuevo en el foro y en el mundo de los pics.
Estoy con un problema, tengo unos servos Tower Pro SG90 y me arme un programita para probarlos.
El problema es que los servos nisiquiera responden.
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
#DEFINE INTS_PER_SECOND 250 // (4000000/(4*4*250))
int int_count,milisegundos,segundos;
#INT_RTCC
Interrupcion_RTCC() {
set_timer0(0);
if(--int_count==0) {
milisegundos++;
if(milisegundos==1000) {
segundos++;
milisegundos==0;
}
int_count=INTS_PER_SECOND;
}
}
void main() {
int_count=INTS_PER_SECOND;
milisegundos = 0;
segundos = 0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_timer0(0);
while(1) {
if(segundos==2 || segundos==3) { // IR A 90°
output_high(PIN_B1);
delay_us(1500);
output_low(PIN_B1);
delay_us(18500);
}
if(segundos==4 || segundos==5) { // IR A 180°
output_high(PIN_B1);
delay_us(2100);
output_low(PIN_B1);
delay_us(17900);
}
if(segundos==6 || segundos==7) { // IR A 0°
output_high(PIN_B1);
delay_us(900);
output_low(PIN_B1);
delay_us(19100);
}
if(segundos==8) {
segundos = 0;
}
}
}
-
Hola chacruna, se bienvenido al foro:
Has mirado con un osciloscopio que realmente te está sacando el PWM requerido para tu servo. Has probado algo tan sencillo como esto para ver si responde.
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
void main() {
while(1) {
output_high(PIN_B1);
delay_us(1500);
output_low(PIN_B1);
delay_us(18500);
}
}
Un saludete.
-
No he mirado en el osciloscopio basicamente porque no cuento con uno. De todos modos simule el programa con el PIC Simulator IDE, pero el problema es que lo simula demasiado lento, entonses puedo ver cuando se pone en 1 la salida, pero ese estado dura entre 900us y 2000us que parece que es MUUUUUCHO para la velocidad de la simulacion, entonses "nunca" baja a 0, cuanto cambio a valores como 5us se puede ver el PWM.
Saludos
-
Agrego un detalle:
Para que el PIC Simulator IDE funcione tuve que agregar "set_tris_b(0);". Sin esto no alteraba el estado de la salida.
-
Escribi un codigo para simularlo con el PC IDE Simulator. Dividi por 100 los tiempos para que se pueda visualizar mejor.
Los resultados parecen estar bien, sin embargo el servo sigue sin funcionar :shock:
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
void main() {
set_tris_b(0);
while(1) {
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
delay_us(9);
output_low(PIN_B0);
delay_us(6);
output_low(PIN_B1);
delay_us(6);
output_low(PIN_B2);
delay_us(179);
}
}
(http://img11.imageshack.us/img11/893/simulacionev2.jpg)
-
Pues ocurren varias cosas, no le estas metiendo la señal al servo por la patilla adecuda, por norma el cable blanco y por supuesto tener la alimentación 5V al rojo y la masa al negro, además de tener conectadas entre sí las masas del pic y del servo sino vamos mal.
El servo esté roto, con lo que la única manera de asegurarte es con un osciloscopio para mirar si la señal es la adecuada, por otro lado mira el datasheet del servo a ver si va a tener un rango de tiempos distintos.
Vamos que no debería de darte tantos quebraderos de cabeza algo tan sencillo.
Ya me comentarás haciendo todo lo que te comento.
-
Los cables estan bien conectados (Naranja = Datos, Rojo = Vcc, Marron = Gnd)
Quizas los servos esten rotos, hoy voy a probar con un servo nuevo.
(http://www.pencenaroundrc.com/store/images/SG90.jpg)
"Tower Pro SG90 Micro Servo"
It fit for most brands of radio equipment including Hitec, Futaba, GWS, JR, Sanwa ….
Specification :
* Weight : 9 g
* Size : 22 x 11.5 x 27 mm
* Operating Speed (4.8V no load): 0.12sec/60 degrees
* Stall Torque (4.8V): 17.5oz/in (1.2 kg/cm)
* Temperature Range: -30 to +60 Degree C
* Dead Band Width: 7usec
Operating Voltage:3.0-7.2 Volts
Encontre estos "TowerPro SG90 Test Programs" y por lo que veo las señales son las correctas.
*** Seeeduino & Towerpro SG90 Test Program - TL Fong 2009jan08
/******************************************************************************
* Hello Servo - Turn TowerPro SG90 servo to middle position
* Created - 2009jan07, Last update - 2008jan07
* Function - Turn servo to middle position
* MPU/Programming language - Seeeduino v1.1/Arduino v12.0
* Author - TL Fong (tlfong01, TaoBao)
* Copyright - Creative Commons Attribution - ShareAlike 3.0 Licence
*
* Test procedure
* (1) FIRST run the program,
* (2) Manually turn servo clockwise or counterclock to limit,
* (3) Connect 5V power and MPU signal to servo,
* (4) WARNING - Disconnect 5V power before stopping program,
*
* TowerPro SG90 Spec
* CCW end 900uS, CW end 2100uS, middle 1500uS, 3.0 to 6.0V,
* 9g, 22 * 11.5 * 27mm, 0.12sec/60 degrees (4.8V no load),
* stall torque 17.5ozin/1.2 kgcm) (4.8V), dead band 7usec,
* coreless motor, all nylon gear, RMB30 (TaoBao).
*
* Notes
* 1. To turn counter clockwise limit, change pulse width from 1500 to 900.
* 2. To turn clockwise limit, change pulse width from to 2100.
******************************************************************************/
int signalPin = 8; //servo signal pin
void setup()
{
pinMode(signalPin, OUTPUT);
}
void loop()
{
digitalWrite(signalPin, HIGH); // control signal high
delayMicroseconds(1500); // for 1500 uS
digitalWrite(signalPin, LOW); // control signal low
delay(20); // wait 20mS
}
/* End of program */
/******************************************************************************
* Hello Servo - v2.0
* Created - 2009jan07, Last update - 2008jan07
* Function - Repeatedly position servo to one end, middle, and the other end
* Servo - Towerpro SG90
* MPU/Programming language - Seeeduino v1.1/Arduino v12.0
* Author - TL Fong (tlfong01, TaoBao)
* Copyright - Creative Commons Attribution - ShareAlike 3.0 Licence
*
* Test procedure
* (1) FIRST run the program,
* (2) Manually turn servo clockwise or counterclock to limit,
* (3) Connect 5V power and MPU signal to servo,
* (4) WARNING - Disconnect 5V power before stopping program.
*
* TowerPro SG90 Spec
* CCW end 900uS, CW end 2100uS, middle 1500uS, 3.0 to 6.0V,
* 9g, 22 * 11.5 * 27mm, 0.12sec/60 degrees (4.8V no load),
* stall torque 17.5ozin/1.2 kgcm) (4.8V), dead band 7usec,
* coreless motor, all nylon gear, RMB30 (TaoBao).
*
* Notes
* Hold time = 100 * 20mS = 2 seconds
*
* Disclaimer
* Use the program at your own risk. This program is written by a servo newie.
* There is no guarantee that the program will not damage your servo.
******************************************************************************/
int signalPin = 8; //servo signal pin
void setup()
{
pinMode(signalPin, OUTPUT);
}
void loop()
{
for (int i=0; i <= 100; i++) // turn to CCW end, hold 2 seconds
{
digitalWrite(signalPin, HIGH); // control signal high
delayMicroseconds(900); // for 900 uS
digitalWrite(signalPin, LOW); // control signal low
delay(20); // wait 20mS
}
for (int i=0; i <= 100; i++) // turn to middle, hold 2 seconds
{
digitalWrite(signalPin, HIGH); // control signal high
delayMicroseconds(1500); // for 1500 uS
digitalWrite(signalPin, LOW); // control signal low
delay(20); // wait 20mS
}
for (int i=0; i <= 100; i++) // turn to CW end, hold 2 seconds
{
digitalWrite(signalPin, HIGH); // control signal high
delayMicroseconds(2100); // for 1500 uS
digitalWrite(signalPin, LOW); // control signal low
delay(20); // wait 20mS
}
for (int i=0; i <= 100; i++) // turn to middle, hold 2 seconds
{
digitalWrite(signalPin, HIGH); // control signal high
delayMicroseconds(1500); // for 1500 uS
digitalWrite(signalPin, LOW); // control signal low
delay(20); // wait 20mS
}
}
/* End of program */
[ENDS]
-
Emmm porqué tiene tanto cable en la foto....
En vez de ponerle un periodo de 20ms ponselo de 30ms y sino de 40 y sino de 50 y nada más porque de ahí nunca he visto que funcione bien ningún servo. Aunque arriba usa 20 ms.
Tambien prueba a poner delay_ms(20) en vez de delay_us(20000), por si acaso en us es mucho delay aunque he visto en el compilador que debería de funcionar pero nunca se sabe.
Un saludete.
-
Pfff tenes razon, no se porque tantos cables :S
Una foto mas acertada.
(http://www.rcmdirect.co.uk/store/images/SG91R.jpg)
-
Acabo de probar con un servo nuevo, varios codigos diferentes, pero nada.
Cuando lo prendo el servo se va a una posicion determinada, si lo muevo (desenchufado) cuando lo vuelvo a conectar vuelve a la posicion anterior.
Pero todavia no responde a ninguna de las 3 señales.
Alguien alguna idea???
-
Probe con 15ms, 20ms, 30ms, 35ms, 40ms y 50ms y NADA!!!
Cuando lo conecto a la señal se siente una vibracion en el servo (como la oscilacion, que prende y apaga).
Dependiendo en que estado se encuentre el servo al conectarlo se mueve erraticamente hasta que queda fijo en un punto del cual no se mueve mas.
El codigo que estoy usando para probar es el siguiente:
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
void main() {
int i;
set_tris_b(0);
i=0;
output_high(PIN_B3);
while(1) {
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
delay_us(900);
output_low(PIN_B0);
delay_us(600);
output_low(PIN_B1);
delay_us(600);
output_low(PIN_B2);
delay_ms(20);
i++;
if(i==25) { // LED CONTROL
output_toggle(PIN_B3);
i=0;
}
}
}
-
Baje un software (Scope) que me transformo la placa de sonido en un osciloscopio :).
Las señales estan bien, por lo tanto el problema son los servos, pero 2 son casi nuevos y 1 es nuevo nuevo.
Los cables supuestamente estan bien, ya lei en varios sitios como son los colores.
(http://www.postimage.org/aV1Hk_j0-ebb968f2e6a75c25f7eeafb58382beaf.jpg)
-
Por lo que me estas diciendo el servo funciona bien.
Es decir si lo conectas a B0 este se irá a uno de los extremos siempre.
Si lo conectas a B1 este se irá al centro siempre.
Si lo conectas a B2 este se irá al otro extremos siempre.
Y siempre en puntos fijos ya que le estas metiendo el mismo PWM. No veo el error que me comentas.
Un saludete.
-
El codigo anterior no funciona bien, es decir, solo en el PIN_B2 hay una señal consistente, en el B0 y B1 no hay señal consistente. No tengo idea porque.
Con este nuevo codigo el osciloscopio me muestra perfecto el cambio entre las señales y los tiempos son correctos.
Pero los servos no se mueven!!!!
#INCLUDE <16F84A.h>
#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
void main() {
int i,segundos;
i = 0;
set_tris_b(0);
segundos = 0;
while(1) {
if(segundos>=0 && segundos<=4) {
output_high(PIN_B4);
delay_us(1500);
output_low(PIN_B4);
delay_us(18500);
i++;
if(i==50) {
segundos++;
i=0;
}
}
if(segundos>=5 && segundos<=10) {
output_high(PIN_B4);
delay_us(2100);
output_low(PIN_B4);
delay_us(17900);
i++;
if(i==50) {
segundos++;
i=0;
}
}
if(segundos>=11 && segundos<=16) {
output_high(PIN_B4);
delay_us(900);
output_low(PIN_B4);
delay_us(19100);
i++;
if(i==50) {
segundos++;
i=0;
}
}
if(segundos==17) {
segundos = 0;
i=0;
}
}
}
(http://img239.imageshack.us/img239/3441/13062690gm1.jpg)
(http://img18.imageshack.us/img18/5756/75834516nc6.jpg)
(http://img6.imageshack.us/img6/4470/69180914us4.jpg)
-
Si has medido con el osciloscopio y la señal de pic es la que pone en el datasheet de cada servo (que casi siempre suele ser la misma), es que no queda otra que tengas algo mal a nivel de hardware.
Que tengas mal conectada la señal del pic al servo o la alimentación y masa, que por lo que veo por ahí no van las cosas.
Que no le estarás dando la tensión suficiente, entre 5 y 6 voltios o lo que ponga el datasheet del servo, o tendrás limitada la corriente de la fuente de alimentación o la fuente no te da suficiente corriente para darle al servo si usas una pila. ¿¿¿Estas usando una fuente de alimentación que te asegure el consumo del servo (intensidad) y la tensión que le estas dando???.
Por otro lado estas seguro que has conectado la masa del servo, la masa del pic y la masa de la fuente de alimentación entre sí.
Si estas seguro que todo esto está bien, amigo mio, a mi se me han acabado las ideas :D :D :D :D por lo que espero que sea algo de lo comentado anteriormente.
Un saludete y suerte.
-
Hola c4_esp_VR, muchas gracias por la respuesta.
Las masas estan todas conectadas entre si (de hecho se siente que el servo se prende)
La fuente que uso para el servo es un transformador de celular de 5 voltios (el tester me tira 6.25v).
creo que voy a tener que empezas a preguntar si alguien me presta un revolver :(
----
Un problema que encuentro que no se si es del osciloscopio (placa de sonido) o del circuito.
El grafico del osciloscopio esta perfecto, pero aveces me dice que son 50hz y a a veces 100hz (pero la imagen no cambia).
Miren.....
(http://www.postimage.org/gxS3Jai-ebb968f2e6a75c25f7eeafb58382beaf.jpg)
(http://www.postimage.org/Pq1TkpX9-ebb968f2e6a75c25f7eeafb58382beaf.jpg)
-
Por último, no tendrás puesto un cristal distinto de 4Mhz...
-
Al parecer las señales son correctas. Por lo general los cargadores de celulares no entregan mucha corriente. verifica que cuando el servo trata de funcionar, no se te caiga el voltaje de la fuente. Es decir mide la tensión de salida del trafo del celular cuando lo tienes conectado al servo en funcionamiento. Y trata de darle más variación a los anchos de pulso así es más visible el cambio.
-
Otra cosa, no te olvides de colocar un capacitor de alrededor de 100nf muy cerca de los terminales Vcc y gnd del pic para filtrar el ruido que se pueda inducir a éste por la conmutación de las escobillas del motor.
-
Acabo de poner un capacitor de 100nF entre Vcc y masa pero sigue sin funcionar.
Los tiempos que se generan son: el minimo, medio y el maximo, o sea, ALGO deberia hacer.
El trafo le lo suficiente al servo ya que con algunos codigos depronto hacia movimientos erraticos y con bastante fuerza.
-
Es muy raro lo que está pasando, con el último código que posteaste debería funcionar. comprobaste que tienes el servo conectado al PIN_B4 del pic (pin 10)
-
Es muy raro lo que está pasando, con el último código que posteaste debería funcionar. comprobaste que tienes el servo conectado al PIN_B4 del pic (pin 10)
Hola pablo, la verdad que todabia no logro entender que sucede.
Alguien puede probar el codigo con un servo futaba, hitec o algo compatible con esos tiempos?
de todos modos voy a ver si consigo otro servo para probar.
Saludos.
pd: el servo estaba conectado al PIN_4 obviamente :D
-
Descubri algo muy loco (estoy mas cerca!!)
El servo va solo para un lado, es decir: si estoy 2ms va a 1.5ms y despues a 1ms. (hasta ahi todo bien).
El tema es que cuando vuelve la señal a 2ms el servo no vuelve para atras (pero desbloquea la posicion anterior y me deja llevarlo con la mano hasta la posicion en la que este).
Todo esto lo chequie con el osciloscopio.
Algun idea de porque pasa esto? la fuente del servo?
-
Yo creo que con ese cristal no tienes precision.
A 4 MHZ tienes 1000000 de instrucciones por segundo, equivalente a 1 microsegundo por instruccion.
Como hacer para mantener esa precision cuando estas al mismo nivel de precision??
Y el resto de las instrucciones cuando se ejecuta??
Ponle un cristal de 10 o 20 Mhz y declaralo en Use_Delay correctamente y luego cuentas... :mrgreen: :mrgreen:
-
Yo creo que con ese cristal no tienes precision.
A 4 MHZ tienes 1000000 de instrucciones por segundo, equivalente a 1 microsegundo por instruccion.
Como hacer para mantener esa precision cuando estas al mismo nivel de precision??
Y el resto de las instrucciones cuando se ejecuta??
Ponle un cristal de 10 o 20 Mhz y declaralo en Use_Delay correctamente y luego cuentas... :mrgreen: :mrgreen:
Hola MGLSOFT, gracias por la respuesta.
Te hago una pregunta: porque decis que estoy trabajando al mismo nivel de precision cuando el MINIMO delay_us que hago son de 900us (900 ciclos).
PD: puedo ponerle un cristal de 10 o 20 Mhz al 16F84A?? no se me va a sobrecalentar?
Saludos!!!
-
Uppsss!!
Olvide la frecuencia de ese micro.
Yo probe mover el servo a 4 MHz y obtenia un funcionamiento erratico.
Cambie de cristal y el mismo software en un PIC16F876 funciono de primera.
La explicacion es la que te hice en el otro post...
-
Uppsss!!
Olvide la frecuencia de ese micro.
Yo probe mover el servo a 4 MHz y obtenia un funcionamiento erratico.
Cambie de cristal y el mismo software en un PIC16F876 funciono de primera.
La explicacion es la que te hice en el otro post...
Hola MGLSOFT, entonses decis que no puedo subirle ni a 10MHZ con este micro??:
Como hacer para mantener esa precision cuando estas al mismo nivel de precision??
Me podrias explicar esto de nuevo?, todabia no entiendo porque 4 Mhz es poco.
-
Probaste de medir la salida del pwm con el servo conectado o siempre sin conexión. Otra cosa, configura el puerto A todo como salida pues se te puede inducir ruido en estos pines y hacer que el micro se pierda.
Realicé unas simulaciones con el MPLAB con el código que posteaste con la salida en el pin_B4 y los tiempos que me dieron fueron los siguientes:
el período para un ancho de pulso de 1.5 ms:
período: 20,055ms
pulso en alto: 1,514ms
para un ancho de pulso de 2,100ms
período: 20,062ms
pulso en alto:2,111ms
para un ancho de pulso de 900us
período: 20,056ms
pulso en alto:911us
Desgraciadamente no tengo un servo para probar.
-
Cada ciclo de clock mide un microsegundo a 4 MHz.
Una instruccion de Delay lo que hace es un loop de X veces para hacer una demora como la solicitada.
Como haces para anular el consumo de microsegundos del resto de las instrucciones??
Probaste con Delay_ms ??
Esto que dice Pablo es parte la diferencia normal del cristal y parte el resto de instrucciones del programa.
Prueba asi como esta a ver si bajando a casi 19,5 mseg el periodo te funciona.
Los servos esperan un pulso de periodo ANTES de los 20 mseg...
A lo mejor es lo que me pasaba a mi tambien.. :mrgreen:
-
Probaste de medir la salida del pwm con el servo conectado o siempre sin conexión.
La salida la medí de las dos maneras y siempre obtuve la señal "pseudo-correcta".
Otra cosa, configura el puerto A todo como salida pues se te puede inducir ruido en estos pines y hacer que el micro se pierda.
Buen dato :idea:
Probaste con Delay_ms ??
Esto que dice Pablo es parte la diferencia normal del cristal y parte el resto de instrucciones del programa.
Prueba asi como esta a ver si bajando a casi 19,5 mseg el periodo te funciona.
Los servos esperan un pulso de periodo ANTES de los 20 mseg...
Tambien probe con delay_ms pero era lo mismo.
El tema de que los servos esperen ANTES el pulso puede ser un tema, voy a probar variando esos valores un poco.
De todos modos voy a comprar un micro servo de otra marca para ver que onda.
Muchas a gracias a los dos!!!
-
Yo creo que con ese cristal no tienes precision.
A 4 MHZ tienes 1000000 de instrucciones por segundo, equivalente a 1 microsegundo por instruccion.
Como hacer para mantener esa precision cuando estas al mismo nivel de precision??
Y el resto de las instrucciones cuando se ejecuta??
Ponle un cristal de 10 o 20 Mhz y declaralo en Use_Delay correctamente y luego cuentas... :mrgreen: :mrgreen:
MGLOSFT, me parece que te has confundido con las unidades, el servo necesita pulsos de 1- 1.5 - 2 ms (milisegundos) y a 4Mhz (1,000,000 instrucciones por segundo) el micro hace una instrucción cada 1us. A mi me suele pasar tambien que a veces confundo y leo (mentalmente) "microsegundos" cuando veo "ms", ya que empieza por la misma letra, cuando en verdad "ms" significa "milisegundos". Así que el problema no creo que sea por precisión. Los errores mas absurdos son los que mas dolores de cabeza dan, a ver si damos con la solución ....
Salu2.
-
Gente, no lo van a poder creer.
Hoy me pegue una escapada y compré un micro servo Hextronik de 5gr.
Lo probe con el codigo "tradicional" y funcionó PERFECTO.
Conclusión: no compren servos Tower Pro
Mil gracias a todos!!!
PD: luego (si es que lo termino) les muestro el "micro helicoptero 16f84" jajajaja.
(http://www.mercadolibre.com.ar/jm/img?s=MLA&f=pp_27_19719279_1.jpg&v=O)
Size : 22.9x11.4x22 mm / 0.9x0.45x0.87 in
Voltage : 3v ~ 6v
Weight: 5g / 0.18oz
Speed : 0.10 sec/60(4.8V)
Torque : 0.8 kg-cm
Working Temp : -30C~60C
Teflon Bushing, 15cm wire, coreless motor
-
Por favor, prueba lo que te comentó MGLSOF de disminuir el período del PWM a 19,5ms o 19ms, así descartamos o no estos servos. Y nos sacamos la duda. Gracias
-
Hola pablo, probe con 15ms, 17ms, 18ms, 19ms, 20ms, 21ms jajajaja (ENSERIO) probe de todo y tomando nota de lo que probaba (el tema es que anote todo NO FUNCIONA).
A mi me parece que yo queme los servos en algun que otro momento, ya que recien abri uno y tenia ese dulce olor a electronica quemada :P.
Dato: este Hextronik HXT500 lo controlo con tiempos de entre 500us y 2500us, con 1500us en el centro.
-
Ah, ese es otro tema, tal vez están quemados. Bueno suerte y que puedas terminar tu minicóptero. Espero ansioso que postees los resultados que vas obteniendo.
Un saludo
Pablo