❤️ Curso de PIC: goo.gl/5riyKn 💙Curso de ARDUINO: bit.ly/2q7Ln1c 💜 Descargar Código en ➡️ wp.me/p5P46A-iT 💛Servo Motor PWM (CCP) ➡️ bit.ly/2FSjTY5 😱 Como ser Experto en PIC en 7 Días 👉 bit.ly/2OTkNry
Que tal Sergio he adquirido el PIC16F887 y funciona bien tu código con dos servos pero para un tercer caso no funciona y hago lo mismo que comentas de agregar solo un caso 3 con sus respectivos cambios y no pasa nada incluso agregue esa variable para el puerto c usando el puerto c cero y también el puerto c tres y nada que hay que cambiar o agregar al código para poder hacer trabajar mas de dos servos ya que quiero hacer funcionar 5 servos, gracias y saludos.
@@coki3677 te has fijado si la variable servo se carga con 3 para efectuar el caso 3?? porque como está el código con el IF/ELSE esa variable nunca será 3, hay que hacer un IF/ELSE convencional o hacer un contador. Con contador sería algo como: servo++; if(servo>3) servo=1;
Aunque el programa funciona, no esta controlando correctamente los servomotores porque con la sentencia if(servo) en la interrupción de TMR0 solo esta enviado un pwm (o señal astable) al servomotor seleccionado. Al otro esta enviando una señal en BAJO. Cuando debería a ambos enviar sus PWM y en la rutina solo hacer los cambios a la señal correspondientes si es que se indicaron. RobotyPIC si lo hace bien.
Buenas ,tengo una duda amigo sabes si el código me sirve para un servomotor de 360 grados ??? Hice la prueba con el servo motor de 180 y funciona muy bien pero cuando le pongo el de 360 gira a lo loco 😢 Y gracias por tus vídeos me ayudan bastante espero sigas creciendo
me sirvio demasiado tu trabajo, lo use como ejemplo para controlar la alarma de un medidor de temperatura, especificamente para el buzzer, para que sonara y dejara de hacerlo, (el int_RTCC). Gracias
Muy buena informacion, sabras si es posible usar el timer0 para controlar un brushless y al mismo tiempo usar los ccp para controlar por pwm motores dc pero a una mayor frecuencia ? por ejemplo el controlador del brushless trabaja igual que un servo (50hz) y los motores dc con una frecuencia de unos 1000hz, todo esto usando el oscilador interno con un pic16f1938, gracias por tu informacion
Aunque el programa funciona, no esta controlando correctamente los servomotores porque con la sentencia if(servo) en la interrupción de TMR0 solo esta enviado un pwm (o señal astable) al servomotor seleccionado. Al otro esta enviando una señal en BAJO. Cuando debería a ambos enviar sus PWM y en la rutina solo hacer los cambios a la señal correspondientes si es que se indicaron. RobotyPIC si lo hace bien.
Se me ocurre usar al tmr0 para que mande la interrucion cada 20ms y con el tmr 1 o el trm2 medir un tiempo desde 1ms hasta los 2 ms. quise hacerlo todo con el tmr0 pero no pude, conbinando dos timers si se puede. yo trabajo en assembler.
Hola Emmanuel gracias por el comentario. Si, debo sacar el tiempo para grabar el del TIMER, ahora estoy grabando otros videos del curso de PIC, pronto los publicaré. Saludos!
@@SergioACGiraldo que bien, este mundo es fascinante, estos últimos vídeos me han estado ayudando mucho , en la universidad, para mis proyectos de PICS, de antemano muchas gracias por la explicación detallada, y el tiempo en hacerlo.... los esperare gracias ;)
Bueno, me he visto todos los vídeos de micro-controladores, me parece un trabajo impresionante y ademas, bien explicados, es cierto que con los últimos y tanta matemática me pierdo un poco, pero sera cuestión de poner mas empeño. Gracias y enhorabuena. Subscrito quedo al canal, aunque no se si de este tema publicaras mas. Eso si, lo de los bloqueos, como que no me gusta nada, pero bueno, se que tenéis que hacer algo para tener mas audiencia.
Hola Jacinto gracias por el comentário me alegra que te haya servido el curso y lo más importante que hayas aprendido. Este curso de PIC ya está bastante avanzado, sin enbargo iré montando algunos otros videos explicando otros perifericos o otras aplicaciones. Lo de los códigos es justamente para poder llegar a más audiencia. Saludos y te desejo el mejor de los éxitos.
explora esta la pagina de Microchip www.microchip.com/ParamChartSearch/Chart.aspx?branchID=30048 Ai puedes seleccionar el numero de PWMs que necesites y otras caracteristicas y te va a mostrar que PIC se adapta a tu aplicación.
compañero, disculpa la molestia, te comento que si pude cargar el código a un PIC16F877A y realice la conexiones pertinentes incluso la recomendación de conectar los comunes en un solo punto y alimentar por separado al pic (por medio de un cargador de 5v a 1A) y pulsadores y servos a una fuente regulable, cristal de cuarzo de 4mhz y sus respectivos capacitares 22pf, resistencia de 10 kohms en el pin 1 del micro y conectado a 5v del cargador, también sus resistencias de 10 kohms a los pulsadores (uso pulsadores de los mismos que usted usa) y el común del pin 31 del pic y el pin 32 a 5v a la conexión del cargador , dicho lo anterior y que realice el cambio de librería para el PIC16F877A y de acuerdo a las conexiones del pic16f887 al 877A en lo que respecta a los servos son las mismas en el puerto C (pines 16 y 17) y los pulsadores en el puerto A (pines 2, 3 y 4), finalmente alimente el circuito y solo me funciona un servo para el pin 17 y el servo del pin 16 no se mueve al realizar el cambio con el pulsador conectado al pin 4 (change), ademas el pulsador que realiza la disminución del pulso también se activa para mas y para menos con un solo botón pero el que esta diseñado para aumentar el pulso funciona bien y no realiza otra cosa de acuerdo a la asignación de puertos para el pic de este tutorial en mi caso por ser otro pic la sintaxis debe ser diferente o que debo corregir te agradezco las atenciones, saludos
Hola Coki, la sintaxis no cambia para nada, es solo cambiar la librería, además porque los dos pics son prácticamente el mismo, el 887 es la evolución del 877a. Puedes hacer la prueba en el proteus y ver que funciona normalmente con el 16F877A. Debes verificar tus conexiones, usa un multimetro para ver que todo esté bien conectado. También verifica los pulsadores (ya que tienen 4 pines) y es fácil confundir su conexión, verificando que efectivamente se tomó los dos pines adecuados del pulsador, que siempre esté abierto y solo de continuidad cuando se apreta. Saludos.
Gracias por compartir tus conocimientos me fue de mucha ayuda tu video te ganaste un sub y un like, tengo una duda para usar un oscilador externo de 20Mhz tendria que usar el timer1? gracias de antemano
Depende de los motores que uses. Debes mirar el datasheet de tus motores. Para el motor mostrado en el video (5v - 900mA) necesitaría una fuente de 5v a 10A
No, el TIMER 0 es mucho más preciso que simplemente hacer un delay_ms, dado que este último solo coloca el PIC a hacer nada, mientras el timer0 activa la interrupción en el intervalo de tiempo establecido correctamente.
Hola una duda,para agregar un 3er servomotor que se tendria que poner en el codigo? le añadi otro case con el ang3 y no me lo detecta,sin embargo si modifico el case 2 con ang3 si sirve ese pn,por lo que veo no detecta 3 case,sabes porque se da esto? saludos
Si, es porque debes modificar la variable entera Servo que está dentro del switch/case switch(servo) El código está hecho para que esa variable únicamente tome el valor de 1 y 2, por eso no te va a aceptar otros casos, debes modificar eso en la linea 86 del código, borras esa linea y haces tu lógica.
Claro,pero mi problema es que no inicializa el servo3,no lo estoy incluyendo en el cambio de servo,aún así eso afecta? Elimine esa parte de cambio del servo,los estoy usando individualmente, Saludos y muchas gracias por la ayuda
Buenas noches, disculpe la molestia, lo que ocurre es que ya modifique el código para que funcione con 4 servos, sin embargo no logra funcionar, queria ver si podría darme un consejo, agradezco su tiempo. #include #device ADC=8 #fuses XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP #use delay(clock=4000000) //Dirección de los puertos para PIC 16F #byte porta=5 #byte portc=7 #define change porta,0 #define minus porta,1 #define plus porta,2 #define servo2 portc,1 #define servo1 portc,2 #define servo4 portc,3 #define servo3 portc,4 unsigned char ang1,ang2,ang3,ang4,cont=1; int i,servo=1; //Rutina de interrupción por RTCC (TIMER) #INT_RTCC void pulse() { switch(servo){ case 1: if(bit_test(servo1)) //La salida del servo 1 está en alto? { set_rtcc(ang1); bit_clear(servo1); } else { set_rtcc(255-ang1); bit_set(servo1); } break; case 2: if(bit_test(servo2)) //La salida del servo 2 está en alto? { set_rtcc(ang2); bit_clear(servo2); } else { set_rtcc(255-ang2); bit_set(servo2); } break; case 3: if(bit_test(servo3)) //La salida del servo 3 está en alto? { set_rtcc(ang3); bit_clear(servo3); } else { set_rtcc(255-ang3); bit_set(servo3); } break; case 4: if(bit_test(servo4)) //La salida del servo 4 está en alto? { set_rtcc(ang4); bit_clear(servo4); } else { set_rtcc(255-ang4); bit_set(servo4); } break; } } void main() { //6 y 36 int lmin=14,lmax=32; //Limites max y min en 100us set_tris_a(0x07); //Define RA0, RA1, RA2 como entradas set_tris_c(0); //Define puerto C como salida portc=0; //SET_RTCC(246); //Cargo valor inicial del timer para ejecutarse cada 100us setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit); //Configura interrupcion del timer ENABLE_INTERRUPTS(INT_RTCC); //Activa interrupcion del timer ENABLE_INTERRUPTS(GLOBAL); //Activa las interrupciones globales ang1=1min; ang2=1min; ang3=1min; ang4=1min; while(TRUE) { //Pregunta si se desea controlar el otro servo if(bit_test(change)){ delay_ms(200); //Anti-Rebote while(bit_test(change)) //Espera hasta dejar de presionar el botón {} servo= (servo==1) ? 2 : 3; servo= (servo==3) ? 4 : 1; } if(bit_test(plus)){ delay_ms(200); switch(servo){ case1: ang1++; //Aumenta el angulo en el servo 1 case2: ang2++; //Aumenta el angulo en el servo 2 case3: ang3++; //Aumenta el angulo en el servo 3 case4: ang4++; //Aumenta el angulo en el servo 4 } if(bit_test(minus)){ delay_ms(200); switch(servo) { case1: ang1--; //Decrementa el angulo en el servo 1 case2: ang2--; //Decrementa el angulo en el servo 2 case3: ang3--; // Decrementa el angulo en el servo 3 case4: ang4--; //Decrementa el angulo en el servo 4 } ang1= (ang1lmax) ? lmax : ang1; ang2= (ang2lmax) ? lmax : ang2; ang3= (ang31max) ? 1max : ang3; ang4= (ang41max) ? 1max : ang4; } } }
Pero mi. Pregunta es de cómo puedo controlar 2 servos paralelos uno q este 0° y el otro 180° y que con un pulsador ambos giren a 90°.ayudenme con eso porfavor.
Disculpa, una pregunta ya hice el programa y funciona bien en proteus pero cuando lo hice en fisico lo unico q hace es mover el servo a la posicion 0 y cuando presiono los botones no gira ni nada, puse un led a la salida y si se ve q el ancho del puso aumenta y disminuye pero alumbra muy poco y cuando retiro el servo alumbra mas, q puedo hacer ahi?
Verifica que el Servo este funcionando correctamente. Verifica que tu fuente de alimentación sea capaz de mover el servo. Verifica que el GND de tu fuente este conectado con el GND del PIC. Abrazos!!
@@SergioACGiraldo cale el servo con un arduino y funciona bien, y mi fuente es de 12 v a 1Amp y lo conecte a un 7805 para obtener los 5 v pero aun asi sigue sin funcionar hace la misma funcion solo lo mueve a la posicion 0 pero cuando presiono los botones no hace nada y las variables si se decrementan e incrementan
Si Quiero que el servomotor gire de un lado a otro como se muestra en el video, que vuelva a repetirse varias veces y que se quede enclavado un swich o boton que le tengo que agregar?
Puedes hacer la lógica dentro de un ciclo, por ejemplo un ciclo for, y determinarlas veces que deseas repetir la secuencia. Dentro del ciclo debes enviar los ángulos a los que deseas que se mueva el Servo. Aquí en el video están las bases para que lo hagas. Éxitos.