Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

20/05/2012 #1


PIC16F887 y servos...
Buen dia, espero que me puedan ayudar... estoy construyendo un robot esferico o polar, tengo que controlar 3 servos y un actuador rotativo neumatico (Requisitos necesarios) mi duda es con los servos.

Esta es la pregunta que mire:

generar pulso cada 100 us y de 1 uf de ancho

Vegetal Digital dijo: Ver Mensaje
bien en C podes hacer algo bien simple como esto

Código:
[configuarcion del micro, puertos, reloj, etc, etc]

void main (void)
	{
	while(1)                      //lo repite por siempre(bucle infinito)
		{
		SALIDA=1;          //pone en estado alto(1) el pin de salida
		delay_us(1);	      //espera durante 1uS
		SALIDA=0;          //pone en bajo (0) la salida
		delay_us(100);          //pausa de 100uS
		}
	}
Te recomendaria usar el pic16f84 porque seguro querran que uses este por ser tan famoso, si me esperas te lo puedo compilar y simular en proteus.

...y se me vino a la mente una idea no se si muy alocada, te comento que necesito controlar 3 servos, como son acciones repetitivas las que van a realizar, debo usar 2 señales de salida para cada servo es decir una señal para que el servo se posicione en P1 o otra para P2.

De esta manera necesitaría generar 6 señales diferentes con el oscilador (2 por servo)

Mi idea es utilizar este código para asignar esos pulsos a una variable, y cuanto sea necesario utilizarlas, solamente las mando llamar... se puede hacer eso?? es valido y si es asi esas variables de que tipo serian? que me aconsejan?

Estoy utilizando un PIC16f887 y lenguaje C... Saludos
20/05/2012 #2


mucho lio para manejar 3 servos(PWM) con ese tipo de codigo pero bueno para empezar si quieres que el servo te funcione, osease te vaya a una posicion pongamosle 90º sera un tiempo de aproximadamente 1ms.

Si no me equivoco los servos andan con una señal a 50hz y la anchura del pulso debe de ser entre 0,3ms para 0º y 2ms para 180º.

Con lo que prueba a poner en tu codigo el primer tiempo de espera en ms envez de en us 1ms y 19ms en el segundo delay.

Sabes como van los 3 cables del servo?
20/05/2012 #3


Claro si, tiene 2 para la alimentacion (+,-) y un tercero para la señal de pulso que le indica hacia donde moverse según el pulso. Lo que dices es verdad comúnmente los servos trabajan con pulsos en ms..... en lo que no tengo experiencia es en la generación de esos pulsos con micros, del los tiempos,

Existe una forma mas sencilla de hacer eso en C?
21/05/2012 #4


Por q no configuras el timer para q cuente microsegundos e incrementas la una variable cada microsegundo y en funcion del valor de la variable haces lo q quieras es q eso de delay no te lo aconsejan poner (por lo menos mi universidad)
21/05/2012 #5


OK... habia escuchado hablar del "timer", pero en realidad no lo he utilizado... por lo que veo si es posible utilizar variables variantes en el tiempo por así decirlo, es complicado implementarlo? tendras algun ejemplo para analizarlo... gracias por sus respuestas !
23/05/2012 #6


void main (void)
{
while(1)
{
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
delay_us(19);
}
}
23/05/2012 #7


Aqui tienes varios ejemplos para tu micro.

http://www.mikroe.com/eng/chapters/v...ic16f887/#c3v4.

te viene de todo bien explicado si sigues teniendo dudas avisa.

Antes de nada,sabes lo que es una interrupcion?
23/05/2012 #8


Es un momento de espera en que el micro deja de hacer una tarea para atender cierta situación, a diferencia del delay en una interrupcion el micro no deja de trabajar (PAUSA)... eso es lo que me han dicho. Por lo que veo el timer trabaja con interrupciones.

Este ejemplo me parece interesante, aqui aparece la variable que mencione mas arriba:
// En este ejemplo, Timer0 se configura como un temporizador y se le asigna un pre-escalador.

unsigned cnt; // Declarar la variable cnt

void interrupt() { // Rutina de interrupción
cnt++; // Interrupción causa el incremento de cnt por 1
TMR0 = 155; // Temporizador (o contador) Timer0 devuelve su valor inicial
INTCON = 0x20; // Bit T0IE está a 1, bit T0IF está a 0
}

void main() {
OPTION_REG = 0x04; // Pre-escalador (1:32) se le asigna al temporizador Timer0
TMR0 = 155; // Temporizador T0 cuenta de 155 a 255
INTCON = 0xA0; // Habilitada la generación de interrupción para el
// temporizador Timer0
Ahora, como configuro las 3 salidas para los 3 servos?
23/05/2012 #9


pues cuando acabe de contar los 100microsegundos activas la salida lo configuras para contar 1 microsegundo cuando acabe pones la salida 0.

Otra cosa son tiempos muy pequeño el del microsegundo ten en cuenta el tiepo ktarda el micro en hacer un ciclo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.