hola a todos me llamo marco soy estudiante de ingenieria mecatronica en mexico.
la idea de este post es que he estado muy relacionado con arduino y hace tiempo entre a programar PIC en CCS ya habia manejado anteriormente emsanblador y realmente utilizar servos en pic se convierte tedioso, conosco los diferentes metodos para utilizar servos en pic ya se por PWM, TIMER1 ,(empleando desvordamientos) ect , y los calculos nesesario que intervienen en ello.
y bueno dejandonos de rollos estoy a un paso de completar una funcion que nos ayude a simplificar el uso de servos asi de sencillo como la programacion en arduino.
ademas de que como los servos se rigen de un solo timer podremos meter N cantidades de servos bajo nuestro mando.
solo que me queda un pequeño gran detalle en mi programacion relacionada con la operacion y que unas son de tipo punto decimal y fraccion.
osea ya sirve solo me falta ese detalle con las variables ya probe cambiando int16,float,float32,long ect y por el momento no le he encontrado solucion.
LES DEJARE MI PROGRAMACION PARA VER SI JUNTOS PODEMOS HECHAR A ANDAR ESTE MINIPROYECTO QUE SIN LUGAR A DUDA NOS PODRA SERVIR A CADA UNO DE NOSOTROS.
A) LA PROGRAMACION ESTA EXPLICADA DETALLE A DETALLE
B) LES ADJUNTO LA PROGRAMACION Y EL SIMULADO EN PROTEUS 8.0
C) LES ADJUNTO MIS CALCULOS DE LA FUNCION
PROGRAMACION
[/size]
#include <18f4550.h>
#fuses XT,NOWDT,NOMCLR,PUT
#Use delay(clock= 4000000) // osc de 4Mhz
#use standard_io(b)
#include <math.h>
int contservo1=0; //Contadores que me ayudan a controlar pulsos a los servos
int contservo2=0;
int contservo3=0;
int controlservo1=15; //Variables que mandan señal de posicion al servo (1ms-2ms)
int controlservo2=15; // 15 serian 1.5ms osease 15/10 segun como yo utilize mi timer
int controlservo3=15; //entonces 10 = 0grados y 20 = 180 grados en el servo
//osea que inicialmente iniciaran en 90grados por que asi lo quise :)
// todo esto por que ise unos calculos utilizando el timer1 de 16bits
// ise que mi overflow fuera cada 50us abajo con mas detalles
#Define SERVO1 PIN_B1 // salidas de mis pines que van a controlar al servo
#Define SERVO2 PIN_B2
#Define SERVO3 PIN_B3
#Define BSERVO1_A PIN_C0 //botones que controlan servo 1 (podremos moverlos a 2 angulos deseados)
#Define BSERVO1_B PIN_C1
#Define BSERVO2_A PIN_C2 //botones que controlan servo 2 (podremos moverlos a 2 angulos deseados)
#Define BSERVO2_B PIN_C4
#Define BSERVO3_A PIN_C5 //botones que controlan servo 3 (podremos moverlos a 2 angulos deseados)
#Define BSERVO3_B PIN_C6
#Define LED2 PIN_B7 //este boton enciende un led en ciclo while (TRUE)
#Define BOTON PIN_B6 //no tiene nada que ver con los servos es para simular
//que ando corriendo una programacion en otro plano del timer1
float32 servoangulo(float32 grados){ //mi funcion servo les subo mis imagenes explicando mis calculos
float32 pulso;
float32 m;
float32 pulsomin=1000; //microsegundos
float32 pulsomax=2000; //microsegundos
float pulsosalida;
m=(180/(pulsomax-pulsomin));
pulso=((grados + (m*pulsomin))/m);
pulsosalida=(pulso/100);
return (pulsosalida);
}
#int_TIMER1 //interrupcion por TIMER1
void temp1s(){
set_timer1(65508); //coloco mi overflow cada 50us
// si uso un osc de 4mhz, prescaler de 2, quiero que overflow sea de 50us, se que mi Timer1 es de 16bits
// (2^16)-(0.000050/(4/(4mhz/2)) = 65511 y se que puse ahi 65508 solo es un ajuste y cheque que exacto ahi mi overflow es de 50us
//realmente quiero que mi overflow sea de 50us ya que se va poder tener control de variadades de servos
if (contservo1==controlservo1){ output_toggle(SERVO1); contservo1=0;} //50 us x controlservo1 x Kinventada =ms Kinventada es 2 lo encontr a base de pruebas
contservo1++; //incrementa contador
if (contservo2==controlservo2){ output_toggle(SERVO2); contservo2=0;} //50 us x controlservo2 x Kinventada =ms Kinventada es 2 lo encontr a base de pruebas
contservo2++; //incrementa contador
if (contservo3==controlservo3){ output_toggle(SERVO3); contservo3=0;} //50 us x controlservo3 x Kinventada =ms Kinventada es 2 lo encontr a base de pruebas
contservo3++; //incrementa contador
}
// osea que suponiendo que si yo tengo 50us x controlservo1=20 x 2 = 2 milisegundo suponiendo, señal que le llegara a dicho servo y me daria un ang de 180
void main(){
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); // Config del TIMER1
enable_interrupts(INT_TIMER1); // Habilita Interrupcion por timer1
enable_interrupts(global); //Habilita Interrupcion Global nesesario ponerlo ojo
while(TRUE){
/////////////////////////////////////////////////// ZONA BOTON QUE ENCIENDE LED (NADA QUE VER CON SERVOS)
if(input(BOTON)==1){output_HIGH(LED2);}
else{output_low(LED2);}
/////////////////////////////////////////////////// ZONA SERVOS
if(input(BSERVO1_A)==1){controlservo1=servoangulo(30);} //Pruebas a diferentes angulos
if(input(BSERVO1_B)==1){controlservo1=servoangulo(150);} //se que si realiza bien el proceso pero los
//decimales en la funcion me producen error
if(input(BSERVO2_A)==1){controlservo2=servoangulo(60);}
if(input(BSERVO2_B)==1){controlservo2=servoangulo(120);}
if(input(BSERVO3_A)==1){controlservo3=servoangulo(5);}
if(input(BSERVO3_B)==1){controlservo3=servoangulo(175);}
}
}
SIMULADO EN PROTEUS CON EL CSS
(http://www.subeimagenes.com/img/marco-diagrama-1585068.png)
DESCARGAR
http://www.mediafire.com/download/lt4g4le8d7lcd3a/MUCHOS+SERVOS+CONTROLADOS+TIMER+CON+FUNCION+SERVO.rar
CALCULOS
(http://www.subeimagenes.com/img/20151231-002730-copia-1585080.jpg)
bueno antetodo espero tengan un excelente fin de año y que todos sus sueños para este proximo 2016 se cumplan saludos!!!!!