Autor Tema: Problema servos  (Leído 3415 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado metuskale

  • PIC10
  • *
  • Mensajes: 5
Problema servos
« en: 07 de Mayo de 2011, 17:36:25 »
Hola a todos, estoy intentando probar unos servos con mi PIC18F4321 pero no consigo que haga nada, expongo mis problemas:
  • Si conecto el servo pin masa a un pin pic puesto a cero y el vcc a otro puesto a 1, el voltage del pin del pic baja hasta 3V...
  • No consigo que el servo se mueva, les pongo mi codigo aqui abajo, en teoria deberia de poner el servo hasta el final y volverlo al principio...
Se agradece la ayuda!
Código: [Seleccionar]

#include <p18f4321.h>
#include <delays.h>

#pragma config PBADEN = DIG
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void HighInterruptRSI(void);
void configure_timer (void);
void configure_interrupts (void);
void configure_ports (void);
void int_timer (void);
void main(void);
void delay_01 (unsigned int times);

static unsigned int compts = 0;
static unsigned int pos = 1;

//configuracio de interrupcio
#pragma code HIGH_INTERRUPT_VECTOR=0x08

void high_RSI(void) {

_asm

goto  HighInterruptRSI

_endasm
}

#pragma interrupt HighInterruptRSI
//fi configuracio de interrupcio

void HighInterruptRSI(void) {

if (INTCONbits.TMR0IF == 1) {

INTCONbits.TMR0IF = 0;
configure_timer();
configure_interrupts();

compts++;

}

}

void configure_interrupts (void) {

//INTCON: GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCON = 0b11100000;
//RBPU INTEDG0 INTEDG1 INTEDG2 — TMR0IP — RBIP
INTCON2 = 0b10000100;

}

void configure_ports (void) {

TRISD = 0x00;
LATD = 0x00;
PORTD = 0x00;

TRISC = 0x00;
LATC = 0x00;
PORTC = 0x00;

}

void configure_timer (void) {

//TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
T0CON = 0xC8;
//T0CON = 0x88;
TMR0L = 0x9C; //0.1ms interrupcion
TMR0H = 0x00;

}

void delay_01 (unsigned int times) {

compts = 0;
while (compts < times) {

_asm
nop
_endasm

}

}

void main (void) {

pos = 1;
compts = 0;
configure_ports();
configure_interrupts();
configure_timer();

while (1) {

LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;

while (pos < 24) {

LATCbits.LATC4 = 1;
delay_01(pos + 1);
LATCbits.LATC4 = 0;
delay_01(24-pos);
pos++;

}

pos = 1;
}

}

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema servos
« Respuesta #1 en: 07 de Mayo de 2011, 17:51:13 »
 ;-)Hola metuskale, deberias de mirarte algun manual de servos para ver como trabajan ya que esta no es la forma correcta de conectarlo.
El servo tiene tres cable de diferentes colores:

negro---->Vcc
amarillo o blanco----->Pulso para pòsicionar el servo (PWM)
rojo------>Vdd

Tienes que tener en cuenta que el pulso que metes por el cable amarillo no excedera de 20ms contando el tiempo que esta en alto mas el que esta en bajo.

Un pulso de 0.5ms situa el servo a -90º, un pulso de 1.5ms situa el servo a 0º, un pulso de 2.3 o 2.5 depende del modelo de servo lo situa a +90º.

etc.etc.....

Saludos
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado metuskale

  • PIC10
  • *
  • Mensajes: 5
Re: Problema servos
« Respuesta #2 en: 07 de Mayo de 2011, 18:09:16 »
Si, la verdad he leido varios y finalmente escribi el codigo, lo cimentare para que sea mas facil de entender
La alimentacion del servo proviene de un pic puesto a 0 y de otroa 1 lo que teoricamente deberia ser suficiente para alikentar al.servo.
el pin pwm esta conectado a un tercer pin.
El funcionamento basico es el siguiente, como genero una interrupci de timer cada 0.1ms necesito 24 para que el servo vaya desde 0 hadta 180 grados con un pequeño incremento. Lo que hago es poner el pin pwm a 1 durante X ms y luego a 0 durante 20-Xms con lo que tengo el pulso cada 50hz, esto lo hago hasta que el tiempo que esta a 1 es de 2,3ms. Llegados a ese punto vuelvo a empezar con lo que el servo deberia volver al principio no?
La duda es si el metodo es correcto con sus tiempos y demas y porque el pin vcc del servo baja a 3 cuando lo conecto, si esta desconectado tengo 5... saludos y gracias!!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema servos
« Respuesta #3 en: 08 de Mayo de 2011, 04:47:33 »
Hola de nuevo, lo primero te aconsejo que alimentes el servo de forma separada para evitar problemas de interferencias y tener 5V al servo y lo segundo veo que dices:
Lo que hago es poner el pin pwm a 1 durante X ms y luego a 0 durante 20-Xms asi no es correcto, no puedes exceder de 20ms incluyendo el tiempo que esta a 1 y a 0.
Por ejemplo para 1.5ms tendras el pulso a nivel bajo 1.5ms - 20ms = 18.5ms que sumados a los 1.5ms tienes los 20ms que es lo que necesitas.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado metuskale

  • PIC10
  • *
  • Mensajes: 5
Re: Problema servos
« Respuesta #4 en: 08 de Mayo de 2011, 05:05:26 »
Si, lo de la alimentación por separado es lo que havia pensado, pero puedo usar la misma alimentacion del pic, sin pasar por el se entiende, no?
Respecto a la duracion del pulso hago lo que tu dices, si tengo que hago que el pulso esté a 1 durante 2ms (=X), estará a 0 durante 20-X (2ms) = 18ms.

Desconectado metuskale

  • PIC10
  • *
  • Mensajes: 5
Re: Problema servos
« Respuesta #5 en: 08 de Mayo de 2011, 06:27:42 »
Bueno, comento mis progresos: apartir de ahora todo lo voy a ir simulando antes de probar porque para alimentar por separado necesito unos cables que estan aun para llegar...
He conseguido que el servo se muevo desde el principio hasta el final pero no que retroceda, no se si tenga que dejar algun tiempo para que vuelva o si tengo que mandar el pulso de 1ms (posicion -90) varias veces...
Alguna idea? Si no tampoco me importaria que el servo volviera poco a poco, lo que pasa es que parece que el pulso a 1 corto no retrocede...
Saludos y gracias a todos!

Desconectado metuskale

  • PIC10
  • *
  • Mensajes: 5
Re: Problema servos
« Respuesta #6 en: 08 de Mayo de 2011, 10:26:59 »
Muy buenas, despues de un buen rato de tratar con el codigo he conseguido que funcione, adelante y atras todo el tiempo, pongo el codigo por si alguien le interesa:
Código: [Seleccionar]

#include <p18f4321.h>
#include <delays.h>

#pragma config PBADEN = DIG
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void HighInterruptRSI(void);
void configure_timer (void);
void configure_interrupts (void);
void configure_ports (void);
void int_timer (void);
void main(void);
void delay_01 (unsigned int times);

static unsigned int compts = 0;
static unsigned int pos = 1;

#define VALOR_INICIAL 10

//configuracio de interrupcio
#pragma code HIGH_INTERRUPT_VECTOR=0x08

void high_RSI(void) {

_asm

goto  HighInterruptRSI

_endasm
}

#pragma interrupt HighInterruptRSI
//fi configuracio de interrupcio

void HighInterruptRSI(void) {

if (INTCONbits.TMR0IF == 1) {

INTCONbits.TMR0IF = 0;
configure_timer();
configure_interrupts();

compts++;

}

}

void configure_interrupts (void) {

//INTCON: GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCON = 0b11100000;
//RBPU INTEDG0 INTEDG1 INTEDG2 — TMR0IP — RBIP
INTCON2 = 0b10000100;

}

void configure_ports (void) {

TRISD = 0x00;
LATD = 0x00;
PORTD = 0x00;

TRISC = 0x00;
LATC = 0x00;
PORTC = 0x00;

}

void configure_timer (void) {

//TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
T0CON = 0xC8;
//T0CON = 0x88;
TMR0L = 0x9C; //0.1ms interrupcion
TMR0H = 0x00;

}

void delay_01 (unsigned int times) {

compts = 0;
while (compts < times) {

_asm
nop
_endasm

}

}

void restore_position (void) {

pos = VALOR_INICIAL;

}

void main (void) {

compts = 0;
restore_position();
configure_ports();
configure_interrupts();
configure_timer();

while (1) {

LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;

while (pos < 20) {

LATCbits.LATC4 = 1;
delay_01(pos);
LATCbits.LATC4 = 0;
delay_01(200-pos);
pos++;

}

while (pos > VALOR_INICIAL) {

LATCbits.LATC4 = 1;
delay_01(3);
LATCbits.LATC4 = 0;
delay_01(197);
pos--;

}

restore_position();

}

}



 

anything