[Aporte] Mezclador de luz RGB

Gracias ahora mismo estoy bajando los correspondientes archivos, la verdad lo que requiero esque mediante una tarjeta de adquisición de datos controlar un brazo robotico, pensaba en utilizar moto reductores pero la verdad da mucha lata tener que poner etapas de potencia puentes h el doble de salidas, tu sabes un relajo total, así que me decidí por servos pero nunca e manejado servos con el método que tu haces es decir PWM por software y me tenia que limitar a los 2 módulos que traen los pic comunes pero este método que tu realizaste me parece magnifico, te cuento que la tarjeta ya la tengo, maneja el estándar de comunicación USB- BULK mediante labview la dote con 8 OUT digitales 5 IN digitales 3 In análogas y 2 PWM como veras las 8 salidas quedan mas que perfectas para controlar servos, el diseño del brazo robotico lo are en solid edge ya que es el que me están enseñando en la escuela y si para ese tiempo averiguo como incluir la animación en labview la incluire para que se asimile al brazo en al vida real, o tal-vez una cámara la verdad este proyecto es a largo plazo ya que planeo entregarlo como proyecto final para ingeniería en mecatrónica... iré posteando los avances que tenga contigo ya que me serviría de mucha ayuda tu asesoria ya que por lo que veo eres un genio con pic c y labview, y pues no sabre mucho de esto pero si algun dia requieres mi ayuda o nesesitas algo ya sabes en lo que podamos ayudar aquí estamos.
 
Última edición por un moderador:
Hola amigo otra vez por aquí estuve analizando tu código de la librería lo probé con unos leds y un motor ya en la vida real con el pic 18f2550 y funciona perfecta pero me metí a la hoja de datos de los servos y veo que funcionan con un tiempo de 20 ms es decir utilizando la formula f=1/t nos daría como resultado 50 hz crees que tu librería sea capas de generar esos 50 para controlar servos?? algo mas veo que tu librería PWM controla 3 salidas es posible modificarla para controlar 5 salidas es decir 5 servos? un saludo amigo y disculpa las molestias. de antemano gracias

http://www.roboticapy.com/servo.asp

ahí es donde revise la información de los servos y sus posiciones
 
Última edición por un moderador:
Hola amigo otra vez por aki estube analizando tu codigo de la libreria lo probe con unos leds y un motor ya en la vida real con el pic 18f2550 y funciona perfecta pero me meti a la hoja de datos de los servos y veo que funcionan con un tiempo de 20 ms es decir utilizando la formula f=1/t nos daria como resultado 50 hz cres q tu libreria sea capas de generar esos 50 para controlar servos?? algo mas veo q tu libreria PWM controla 3 salidas es posible modificarla para controlar 5 salidas es decir 5 servos?? un saludo amigo y disculpa las molestias.... de antemano gracias

http://www.roboticapy.com/servo.asp

ahi es donde revise la info de los servos y sus pociciones

Hola GNM, la libreria puede ser configurada para generar ondas cuya frecuencia esta entre 0 y 180Hz, asi que trabajara perfecto con lo servos de 50Hz.
desde luego puedes modificar para que funcione con mas ondas PWM... uno de estos días me pongo a la tarea, cuidate
 

Adjuntos

  • USO DE LA LIBRERIA PWM.pdf
    319.7 KB · Visitas: 111
Última edición:
si amigo me di cuenta de eso y logre modificar la libreria para que me diera 50hz en proteus anda de maravilla pongo el indicador de hz y me da de 47 a 46 hz y el servo se mueve de maravilla el problema es cuando lo paso al circuito mi servo no responde no hace nada y pues le conecte un led.... pero no me hace el efecto de cambio de brillo tan solo parpadea muy lentamente..... y es raro ya que con frecuencias mas altas como el primer ejemplo que tu pusiste me jalaba perfecto el cambio de brillo pero era una frecuencia muy alta para el servo.... Saludos amigos y gracias por tus consejos y apoyos con estos programas me han sido de gran utilidad
 

Adjuntos

  • PWMSERVOS.rar
    51.4 KB · Visitas: 70
Última edición:
si amigo me di cuenta de eso y logre modificar la libreria para que me diera 50hz en proteus anda de maravilla pongo el indicador de hz y me da de 47 a 46 hz y el servo se mueve de maravilla el problema es cuando lo paso al circuito mi servo no responde no hace nada y pues le conecte un led.... pero no me hace el efecto de cambio de brillo tan solo parpadea muy lentamente..... y es raro ya que con frecuencias mas altas como el primer ejemplo que tu pusiste me jalaba perfecto el cambio de brillo pero era una frecuencia muy alta para el servo.... Saludos amigos y gracias por tus consejos y apoyos con estos programas me han sido de gran utilidad


Para no percibir el parpadeo del led debes generar una onda PWM con frecuencia minima de 60Hz. Frecuencias menores a 60Hz el ojo humano ya es capas de percibir.

si el fabricante de los servos que tu compraste te recomienda trabajar con 40hz , hazlo, aunque el led sea intermitente...
 
Saludos dino gracias a tu libreria PWM ya pude cotrolar 8 salidas PWM desde labview ahora mi pregunta es la siguiente: en la libreria que tu creaste esta esta linea de codigo

void PWM_init(load)
{
if (load >240) load=240;
Reload = load;
setup_timer_0(RTCC_INTERNAL|RTCC_8_BIT);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}

que me imagino que es donde tu configuras que frecuencua quieres para el PWM no me podrias orientar para poder hacer los calculos para una frecuencia a 50hz con un cristal de 20Mhz pero bien sabemos que el modulo USB trabaja a 48Mhz de antemano gracias por tu colaboracion :D


O si fueras tan amable de explicarme como generar PWM por software asi como tu lo hiciste en tu libreria PWM.


Me interesa saber como calcular la frecuencia exacta ya que los servos son muy delicados ase rato conecte uno y se barrieron los engranes y al simularlo en proteus no me da el valor exacto ya que se sobresatura el CPU y da mensajes erroneos.... por eso me interesaria saber como calcularlo y despues medirlo en un osiloscopio para ya no echarme otro servo gracias amigo.

PIC18f2550
cristal 20mhz
pero con la configuracion a usb queda a 48Mhz
Servos a controlar 8
 
Última edición:
con una simple regla de tres lo solucionas

con 255 -------- 170Hz
con X -------- 50Hz

de donde resulta que; X=(255*50)/170> 75



PWM_init(75);

te dejo un programa generando una onda de 50Hz para que lo revices
 

Adjuntos

  • PWM 50Hz.rar
    352.4 KB · Visitas: 133
Última edición:
Gracias por tu pronta respuesta anteriormente ya lo habia realizado asi pero con un cristal de 20 pero sin conexion a USB pero ahora mi pregunta es la siguiente que no se supone que los calculos estan basados en la frecuencia del cristal pero ya ves que el modulo USB trabaja asta 48Mhz o nadamas se toma la frecuencia del cristal externo sin tomar en cuenta el PLL del pic modulo USB???
 
Gracias por tu pronta respuesta anteriormente ya lo habia realizado asi pero con un cristal de 20 pero sin conexion a USB pero ahora mi pregunta es la siguiente que no se supone que los calculos estan basados en la frecuencia del cristal pero ya ves que el modulo USB trabaja asta 48Mhz o nadamas se toma la frecuencia del cristal externo sin tomar en cuenta el PLL del pic modulo USB???

los 48Mhz son para el USB nada mas.. el timer trabajara con los 20Mhz del cristal externo, saludos!!
 
Última edición:
Muchas gracias por aclararme esa duda en el transcurso de la semana lo pruebo y te comento que tal jala, oye amigo una pregunta mas influye el numero de salidas pwm que tengo es decir es la misma frecuencia para 3 salidas que para 8???

Esque pude modificar tu libreria para que me diera 8 salidas pwm y me las da sin ningun problema pero mi pregunta es si no afecta en la frecuencia que era para 3??
 
Última edición:
Muchas gracias por aclararme esa duda en el transcurso de la semana lo pruebo y te comento que tal jala, oye amigo una pregunta mas influye el numero de salidas pwm que tengo es decir es la misma frecuencia para 3 salidas que para 8???

Esque pude modificar tu libreria para que me diera 8 salidas pwm y me las da sin ningun problema pero mi pregunta es si no afecta en la frecuencia que era para 3??

no creo que influya, ya que 40 Hz es una frecuencia despreciable frente a los 20Mhz con la que trabaja el PICmicro.
 
Hola que tal dino ya pudo calarlo, es que acá es difícil conseguir servos y tuve que ir a otro estado por el, lo cale y funciona bien bueno se siente un poco de vibración pero es mínimo, ahora el problema que surgió es que al momento de comandar 8 salidas PWM desde labview estas funcionan de maravilla gracias al apoyo de tu librería PWM pero las entradas análogas no funcionan, no se si falte alguna interrupción para las entradas análogas o para la conexión a usb espero puedas darle una checada a mi código y decirme en que estoy fallando de antemano gracias....

Código:
#include <18F2550.h>                                                            //pic utilizado en este caso el 18f2550 
#DEVICE ADC=8                                                                   //Bits del modulo convertidor analógico
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      //Fuses utilizados para este proyecto
                                                                                /*
                                                                                  HSPLL: utilizamos un cristal HS de alta velocidad, 
                                                                                  en conjunto con el PLL para generar los 48Mhz.
                                                                                  MCLR: Utilizamos reset por Hadware.
                                                                                  NOWDT: No utilizamos el perro guardían.
                                                                                  NOPROTECT: Desactivamos la protección de código.
                                                                                  NOLVP: Desactivamos la programación a bajo voltaje.
                                                                                  NODEBUG: No entramos al modo debug.
                                                                                  USBDIV: signfica que el clock del usb se tomará del 
                                                                                          PLL/2 = 96Mhz/2 = 48Mhz.
                                                                                  PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia 
                                                                                        del cristal. para HS = 20Mhz/5 = 4Mhz.
                                                                                  CPUDIV1: El PLL postscaler decide la división en 2 de la 
                                                                                           frecuencia de salida del PLL de 96MHZ, si queremos 
                                                                                           48MHZ, lo dejamos como está.
                                                                                  VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
                                                                                */
#use delay(clock=48000000)                                                      //Frecuencia de relog a 48MHz
#define USB_HID_DEVICE     FALSE                                                //Desactivamos el modulo HID ya que trabajaremos en modo Bulk
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK                                      //Habilitamos el modo TX en Bulk
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK                                      //Habilitamos el modo RX en Bulk
#define USB_EP1_TX_SIZE    4                                                    //Tamaño del TX para nuestro Bulk
#define USB_EP1_RX_SIZE    8                                                    //Tamaño del RX para nuestro Bulk
#Define CH0 PIN_C0                                                              //Asignación del canal 0 para el PWM
#Define CH1 PIN_C6                                                              //Asignación del canal 1 para el PWM
#Define CH2 PIN_C7                                                              //Asignación del canal 2 para el PWM
#Define CH3 PIN_B0                                                              //Asignación del canal 3 para el PWM
#Define CH4 PIN_B1                                                              //Asignación del canal 4 para el PWM
#Define CH5 PIN_B2                                                              //Asignación del canal 5 para el PWM
#Define CH6 PIN_B3                                                              //Asignación del canal 6 para el PWM
#Define CH7 PIN_B4                                                              //Asignación del canal 7 para el PWM
#include <pic18_usb.h>                                                          //Mandamos llamar a la librería para poder controlar este pic
#include "daqDescriptor.h"                                                      /*Mandamos llamar la librería para que esta informe a la computadora 
                                                                                  sobre el vendedor y producto esta librería es llamada como 
                                                                                  descriptores y es la que conecta a la pc con el pic*/
#include "PWM.h"                                                                //Mandamos llamar la libreria del PWM por software
#include <usb.c>                                                                //Mandamos llamar la librería de las funciones del modulo USB
#use fast_io(b)
#use fast_io(c)

int8 datoRX[8], datoTX[4];                                                      //Variables del programa
int8 count=0;


void main( void )                                                               //Programa principal
{ 
 PWM_init(80);                                                                  //Numero de conteo del timer para esta librería en base a la frecuencia
 setup_port_a(AN0_TO_AN2);                                                      //Configuramos las entradas análogas
 setup_adc(ADC_CLOCK_INTERNAL);                                                 //Con una señal de reloj interna
 set_tris_a(0xFF);                                                              //Puerto A de la siguiente manera(11111111) 1=entradas, 0=salidas     
 set_tris_b(0xE0);                                                              //Puerto B de la siguiente manera(11100000) "                   " 
 set_tris_c(0x00);                                                              //Puerto C de la siguiente manera(00000000) "                   "    
 output_a(0); output_b(0); output_c(0);                                         //Reseteamos el puerto A,B,C
 write_duty0(255);                                                              //Reseteamos las salidas PWM
 write_duty1(255);
 write_duty2(255);
 write_duty3(255);
 write_duty4(255);
 write_duty5(255);
 write_duty6(255);
 write_duty7(255);

 usb_init();                                                                    //Iniciamos el modulo USB
 usb_task();
 output_low(PIN_A3);                                                            //Led indicador de estado
 usb_wait_for_enumeration();                                                    //Espera a que el USB sea enumerado por la PC
 output_high(PIN_A3);                                                           //Led indicador de estado
 delay_ms(100);                                                                 //Milipausa para estabilidad
                                                        
 While(TRUE)                                                                    //Bucle infinito para envió y recepción de datos al buffer 
 {
  if(usb_enumerated())                                                          //Si el dispositivo a sido enumerado
  {  
   if (usb_kbhit(1))                                                            //Si llegan nuevos caracteres en el buffer de recepcion
   { 
    usb_get_packet(1,datoRX,8);                                                 //Leer buffer de ingreso
    write_duty0(datoRX[0]);                                                     //El valor del write duty x es igual a el dato que llega del vector datoRX[x]
    write_duty1(datoRX[1]);
    write_duty2(datoRX[2]);
    write_duty3(datoRX[3]);
    write_duty4(datoRX[4]);
    write_duty5(datoRX[5]);
    write_duty6(datoRX[6]);
    write_duty7(datoRX[7]);
   }
   for(count=0;count<=2;count++)                                                //Ciclo for para enviar datos de entradas analogicas 
   {
    set_adc_channel(count);                                                     //Lee los valores de ADC según sea el contador
    delay_us(80);                                                               //Micro pausa para estabilidad en la lectura
    datoTX[count]=read_adc();                                                   /*Igualamos nuestro buffer de salida a la lectura  
                                                                                  adc mediante el vector que indique nuestro for*/                  
   }
   usb_put_packet(1,datoTX,4,USB_DTS_TOGGLE);                                   /*Enviamos nuestro paquete de datos almacenados en nuestros 
                                                                                  vectores a la PC*/
  }
 }
}
Te explico un poco el problema la primer entrada si me da todos los bits pero no concuerdan es decir a 5v serían 255 bits y se supone que a 2.5v serian 127bits pero no concuerdan, la segunda entrada no jala solo da uno o cero, y el tercero jala como el primero aparte tienen mucho ruido, a ver si podrías orientarme con ese problema gracias
 
Última edición por un moderador:
Te explico un poco el problema la primer entrada si me da todos los bits pero no concuerdan es decir a 5v serian 255 bits y se supone que a 2.5v serian 127bits pero no concuerdan, la segunda entrada no jala solo da uno o cero, y el tercero jala como el primero aparte tienen mucho ruido, a ver si podrías orientarme con ese problema gracias

talves estes algo confundido, el microcontrolador siempre mandara un numero de 8 bits (entre 0 y 255).

voy ha revisar tu codigo y quiza para la tarde tenga una resuesta, saludos!!
 
De eso si entiendo pero mira el problema es el siguiente que las entradas analogas no responden bien y pienso que es por las interrupciones del Timer para la libreria de PWM tal ves el usb ocupe alguna interrupcion, o alamejor ocupe alguna interrupcion la entrada analoga.
 
yo uso el pic16f877 y logre mover 4 servo motores para hacer una especie de brazo robot y todo bien. pero ahora quiero usar el pwm para controlar un led rgb, aun no empieso con los 3 solo e intentado con uno pero el led solo se pone a parpadear creo que es mas dificil que los servos. el codigo es el siguiente, solo para ver si puedes decirme que esta mal o alguna forma de hacerlo mejor me tiene loco esto

Código:
	AllDigital
	Dim pwm1 As Word
	Dim contador As Word
	Dim x As Word
	OPTION_REG = %10000000  'pre 128 (110) - 2 (000)
	INTCON = %10100000  'Activa int globales(bit7) e int Tmr0(bit5)
	T1CON = %00000000  'Activa Tmr1(bit0)
	PIE1 = %00000000  'Activa int de Tmr1 (bit0)
	TRISB = %01111111
	PORTB.7 = 0
	contador = 0
	pwm1 = 0
	TMR0 = 0
	
ciclo:
	If pwm1 = 0 Then PORTB.7 = 0

	pwm1 = 0
	x = 0
While x < 255
	x = x + 1
	pwm1 = pwm1 + 1
	WaitMs 20
Wend
	pwm1 = 255
	x = 0
While x < 255
	x = x + 1
	pwm1 = pwm1 - 1
	WaitMs 20
Wend

	Goto ciclo

End                                               

	On Interrupt

	contador = contador + 1

	If pwm1 >= contador Then
	PORTB.7 = 1
	Else
	PORTB.7 = 0
	Endif

	If contador = 255 Then
	contador = 0
	Endif

	INTCON.2 = 0  'borro bandera int tmr0
	Resume
 
ya resolvi lo del parpadeo estatico los comandos "WaitMs" de basic creo utilizan el Tmr0 para los retrasos elimine esos comandos y el led comenso a cambiar de brillo pero parpadea un poco, ahora para eso cada interrupcion llenaba el Tmr0 a mas de la mitad asi aumente la frecuencia del ciclo a mas del doble y ya no noto parpadeos. aun asi me gustaria probar tu codigo que programa usas para compilarlo ? y que tengo que cambiar para usarlo con el 16f877 tengo un cristal de 12Mhz no e encontrado mas
 
hola quetzal, la frecuencia ideal para eliminar el parpadeo de los LED es 50Hz... (revisa el programa que subi anteriormete PWM 50Hz)...- yo programo en PIC CCS 4.1

Cambia #include <p16F877.h> y #use delay(clock =12000)


suerte!
 
Hola dino que tal ya mucho sin pasar por aqui oye una pregunta abra alguna forma de crear esta misma libreria pero para 376Hz ya que esta solo da como maximo 180Hz verdad bueno espero puedas ayudarme gracias :D
 
Atrás
Arriba