Ejemplo de Control de Un Servo Motor PIC16F690
3 participantes
Página 1 de 1.
Ejemplo de Control de Un Servo Motor PIC16F690
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 .
Aqui el un Video sobre esto.
Esperando Sus comentarios..
Risanti
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..
Risanti
Re: Ejemplo de Control de Un Servo Motor PIC16F690
Ey Risanti... que tal?
Me alegro de que estés dándole a los PICs de nuevo...
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..
Saludos.
Me alegro de que estés dándole a los PICs de nuevo...
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..
Saludos.
Re: Ejemplo de Control de Un Servo Motor PIC16F690
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.
Risanti
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;
}
Risanti
Re: Ejemplo de Control de Un Servo Motor PIC16F690
Supongo que dependerá del circuito.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.
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?
Re: Ejemplo de Control de Un Servo Motor PIC16F690
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 .
Risanti
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 .
Risanti
Re: Ejemplo de Control de Un Servo Motor PIC16F690
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.
Saludos.
Re: Ejemplo de Control de Un Servo Motor PIC16F690
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.
Temas similares
» Control de motor por PWM timer 0 en AVR-GCC y control de sentido de giro usando interrupciones externas en ATmega32U4
» Control servo por USB Pinguino + PyGTK
» CONTROL PID DE UN MOTOR DC CON MICROCONTROLADOR CON INGRESO DEL SETPOINT POR teclado
» Interfaz de E/S de USB a TTL con PL-2303HX & PIC16F690
» [Resuelto] Entrada digital de PIC16F690 falla en gpsim
» Control servo por USB Pinguino + PyGTK
» CONTROL PID DE UN MOTOR DC CON MICROCONTROLADOR CON INGRESO DEL SETPOINT POR teclado
» Interfaz de E/S de USB a TTL con PL-2303HX & PIC16F690
» [Resuelto] Entrada digital de PIC16F690 falla en gpsim
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.