Ejemplo de Control de Un Servo Motor PIC16F690

Ver el tema anterior Ver el tema siguiente Ir abajo

Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Risanti el Dom 28 Jun 2009 - 3:37

Hola Todos :

He estado un poco alejado de Foro, pero para
acercarme un poco mas el mundo de los pic aqui dejo un ejemplo para
realizar el control de un servo motor (180º), usando un interrupción de
Tmr0 para generar pulsos de ancho variable para mover el servo desde 0º
a 180º ,según la si se pulsa un Sw para aumentar posición o disminuir
posición,aunque aun me falta mejorar la exactitud de la duración de los
pulsos ( osea si genero un pulso que yo aproxime que durara 1ms
realmente dure 1ms). pero con algunas pruebas un empíricas he logrado
que funcione. les dejo el Codigo fuente sobre el control. y un Video .



Código:


/*************************************************************************** */
/* Test Servo      24 Junio del  2009                            */
/*---------------------------------------------------------------------------*/
/* Prueba de Accionamiento servo motor con pic16f690-------------------------*/
/*  Ricardo Santibañez                                */
/*---------------------------------------------------------------------------*/
/* Desarrolado con SDCC.                                                    */
/*****************************************************************************/


#include  <pic16f690.h>
#include  <delay.h>

/* ----------------------------------------------------------------------- */
/* Bits de configuración: */
typedef unsigned int word;
word
at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON
& _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON &
_IESO_OFF & _FCMEN_ON;

unsigned char valor=100;
unsigned char time;

void isr() interrupt 0{
if (RA3==0)
  {
    if (valor <250) {valor=valor +4;}
      RC2=1;
    }
  else {RC2=0;}

if (RA2==0)
  {
    if (valor >80) {valor=valor -4;}
      RC3=1;
    }
 else {RC3=0;}

RC1=1;
//Tiempo de Activacion
time=valor;
while (-- time)
  {
  _asm
    nop
_endasm;
      }
RC1=0;
TMR0=100;  // cargo valor en TMR0
T0IF=0; // Borro Bandera de Desborde
}

void main() {
//Configuracion Oscilador Interno
IRCF0=0;
IRCF1=1;
IRCF2=1;
//Declaracion de Puertos
ANSEL=0;
TRISA=12;
TRISB=0;
TRISC=0;
PORTC=0;
// Configuracion de TMR0
OPTION_REG=6;    //Tmro Con Preescaler 128
TMR0=100;
T0IE=1;        // activo Int. por Tmr0
GIE=1;
while (1)
{
RC0=1;
delay_ms(500);
RC0=0;
delay_ms(500);
}
}





Aqui el un Video sobre esto.



Esperando Sus comentarios.. Twisted Evil Twisted Evil Twisted Evil Twisted Evil Twisted Evil
Risanti
avatar
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 32
Localización : La Serena Chile

http://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Pikitin el Dom 28 Jun 2009 - 21:51

Ey Risanti... que tal?

Me alegro de que estés dándole a los PICs de nuevo... Smile

Tengo un par de preguntillas:

- Cual es la librería delay.h que usas?... alguien también preguntó por eso hace poco.

- Como grabas con PicKit2 directamente en el circuito? a mi me dá problemas con Vdd si tengo el PIC conectado a algo que consuma corriente, por ejemplo haciendo algunas cosillas con leds, cuando programo el PIC los leds se empizan a encender y apagar y me da error de Vdd; también me pasa si tengo algún condensador electrolítico de filtro en la linea de alimentación.

Y una sugerencia:
Supongo que ese código está calculado para una determinada velocidad de reloj, entonces estaría bién algo para que pueda funcionar con cualquier velocidad de reloj, por ejemplo algo de este estilo:

#define FREQ 20000 //frecuencia en KHz, a configurar según cada caso
...........
.........
........


//parte común a todos los casos:
#define const FREQ/lo-que-sea
.......
.......
//Tiempo de Activacion
time=valor*const;


No sé si será posible, pero bueno, solo es una sugerencia.. Smile


Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Risanti el Dom 28 Jun 2009 - 22:05

Gracias Piktin..
En las pruebas que realizado con pickit 2, con no he tenido problemas con Vdd, aunque no tengo nada en la alimentación del pic, desde la fuente de alimentación hacia el pic. yo pensé que iba tener un problema como el que comentas pero tras la pruebas resulto bien.
Sobre la libreria delay.h es similar a la que usan en las rutinas de LCD como la que tu respondiste, sin embargo y este circuito esta hecho para trabajar a 4mhz y la libreria delay.h igual por eso que no defino el la velocidad de trabajo pero ahora voy. usar esa libreria que tu dices ya que es mas completa que la que uso y asi porder operar con otros cristales. y realizar temporizaciones en funcion de numeros de ciclos.

Ademas dejo el segundo codigo fuente del ejemplo del servo motor para controlarlo desde un potenciometro. leyendo desde RA0 el valor de tension (0-5V) con 8 bit de resolusion.

se los dejo.


Código:

/*************************************************************************** */
/* Test Servo      24 Junio del  2009                            */
/*---------------------------------------------------------------------------*/
/* Prueba de Accionamiento servo motor con pic16f690 a traves de la lectura de ra0---------*/
/*  Ricardo Santibañez                                */
/*---------------------------------------------------------------------------*/
/* Desarrolado con SDCC.                                                    */
/*****************************************************************************/

#include
#include

/* ----------------------------------------------------------------------- */
/* Bits de configuración: */
typedef unsigned int word;
word at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_ON;


unsigned int time;
unsigned int medida;

void isr() interrupt 0{

medida=adc_read();

if (medida >250) {
  RC2=1;
  RC3=0;}
else
{
  RC2=0;
  RC3=1;
}
time=medida;
RC1=1;
while (-- time)
  {
  _asm
    nop
_endasm;
      }
RC1=0;
TMR0=100;  // cargo valor en TMR0
T0IF=0; // Borro Bandera de Desborde
}

void main() {

//Configuracion Oscilador Interno
IRCF0=0;
IRCF1=1;
IRCF2=1;
//Declaracion de Puertos
TRISA=1;
ANSEL=1;
TRISB=0;
TRISC=0;
PORTC=0;
ADCON1=64;
// Configuracion de TMR0
OPTION_REG=6;    //Tmro Con Preescaler 128
TMR0=100;
T0IE=1;        // activo Int. por Tmr0
GIE=1;
while (1)
{
RC0=1;
delay_ms(500);
RC0=0;
delay_ms(500);
}
}
unsigned int  adc_read()
{
    unsigned int valor;
   
    ADCON0 =1;        // establecer canal RA0 seleccionado,
                    //Justificacion Izq. Para leer 8Bit.
    GO = 1;                    // iniciar conversión
    while (GO);                // esperar que termine
    valor =  ADRESH;        // leer valor solo 8Bit
    return valor;           
}




Twisted Evil Twisted Evil Twisted Evil Twisted Evil Risanti Twisted Evil Twisted Evil Twisted Evil
avatar
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 32
Localización : La Serena Chile

http://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Pikitin el Mar 30 Jun 2009 - 21:17

En las pruebas que realizado con pickit 2, con no he tenido problemas
con Vdd, aunque no tengo nada en la alimentación del pic, desde la
fuente de alimentación hacia el pic. yo pensé que iba tener un problema
como el que comentas pero tras la pruebas resulto bien.
Supongo que dependerá del circuito.
Pero se supone que cuando el PIC entra en modo programación, todos los pines escepto los de programación se deberían poner en alta impedancia... aunque ahora que lo pienso esto me ha pasado controlando 64 leds con registros de desplazamiento, entonces si a estos les llega alimentación se pondrán a encender y apagar los leds a lo loco, ya que sus entradas están conectadas a salidas del PIC que están en alta impedancia y entonces supongo que se pondrán a oscilar o cosas de esas.... no sé... creo recordar que también me ha pasado conectando leds directamente al PIC, pero quizás sean solo imaginaciones mías.

Posiblemente si el PicKit2 le tiene que dar corriente a 64 leds, entonces si que podría dar error de Vdd...

Aunue... una cosa: cuando programas desconectas la alimentación del circuito?

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Risanti el Jue 2 Jul 2009 - 2:44

Hola..
Piktin cuando programo con pickit 2 no quito la alimentacion al circuito solo lo conecto, eso con la placa de venia con pickit, ademas he montado algunos circuitos en protoboard en los cuales no cableo el vdd desde el programador al Circuito (Solo RB7,RB6,MCLR,GND). y no me presenta problemas al programar , ademas cuando conecto el programador automaticamente se detine la ejecucion del programa (Reset MCLR -->0).por lo cual una vez que retiro el progrmador comienza otra vez

Por fin yo encontre un programador que sea facil de usar y rapido .



Twisted Evil Twisted Evil Risanti Twisted Evil Twisted Evil
avatar
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 32
Localización : La Serena Chile

http://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Pikitin el Jue 2 Jul 2009 - 19:46

Ok... ese era mi fallo, yo siempre desconectaba la alimentación; entonces supongo que si el PicKit2 tiene que alimentar a todo del circuito pues dará errores de Vdd.

Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Geo el Jue 2 Jul 2009 - 23:00

Yo he usado el PICkit2 directo en circuito, pero también como Risanti, no hago uso de la línea de alimentación de este, sino de la alimentación del circuito. Tengo una placa de pruebas para el 18f2550, la placa se alimenta del puerto USB y puedo tenerla conectada junto con el PICkit2.

Geo
Participante Activo
Participante Activo

Mensajes : 92
Fecha de inscripción : 16/12/2008
Localización : México

http://hsblog.mexchip.com

Volver arriba Ir abajo

Re: Ejemplo de Control de Un Servo Motor PIC16F690

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.