TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vasconinicolas en 11 de Julio de 2008, 10:40:04
-
Hola muchachis, tengo una duda mas que puntual yo diría general. El tema es que quiro sacar por pwm una señal para controlar el contraste de mi lcd y no sabiendo usar mucho el pwm....... lo he logrado pero poniendo la instrucción dentro de un bucle while.
La pregunta es: hay alguna manera de definir el pwm y que éste queda funcionando para siempre? o sea, largando la señal modulada siempre independientemente que haga mi programa?
Un abrazo.
vasco
-
Por supuesto, para eso muchos PICs tienen módulos PWM hardware, que los configuras y listo, por una pata determinada del PIC te sacan la señal PWM, sólo tienes que preocuparte de cambiar el registro de ciclo útil cuando quieras más o menos tiempo en estado alto la salida PWM.
Lee en el datasheet por los módulos de captura y comparación/PWM (CCP/PWM), por ejemplo el 16F877 tiene dos CCP, el 16F628 un CCP y así, aparecen distintas configuraciones. Te comento estos dos uC porque ahora mismo tengo abiertos estos datasheets, pero hay montones de PICs con PWM.
Saludos
Reinier
-
Si el datasheet lo tengo pero habla en asm, yo quería algo en C. Lo he logrado poniendo
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 127, 1);
al configurar los puertos y luego
set_pwm1_duty(30); // prendo la luz del display en intesidad alta
o
set_pwm1_duty(10); // prendo la luz del display en intesidad baja
seún la necesidad. Uso cristal de 20Mhz y anda al pelo.. De la salida (PIN_C2) voy a la base de un transistor BD137 a travez de una resistencia de 1K. El transistor tiene el emisor a masa y el colector a la pata K del LCD. La pata A del LCD a Vcc 5V.
De esta forma controlo la luz trasera del LCD (luz verde en mi caso) y usando uno u otro valor lo ilumino mas o menos... Los valores cerca de 0 atenuan el LCD, a medida que vamos hacia arriba prende mas y mas hasta el maximo en 127.
Es notable como baja el consumo alimentando la luz del LCD con tensiones pwm o simplemente con una resistencia a diferencia de alimentarlo directamente de la VCC.
Bueno espero que les sirva a otros-
Saludos.....
-
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 127, 1);
Aquí configuras al PWM para que trabaje, así que lo hará siempre a no ser que se resetee el PIC o por software lo deshabilites. Esta parte fuera del while
set_pwm1_duty(30); // prendo la luz del display en intesidad alta
o
set_pwm1_duty(10); // prendo la luz del display en intesidad baja
Una vez que el PWM trabaja, con estas dos instrucciones basta para cambiar el ciclo útil. Esta parte tembién puede ir fuera de cualquier while, por ejemplo en una función que lo único que hace es cambiar el valor del PWM ante la necesidad de iluminar más o menos la LCD.
Saludos
Reinier
-
Perdon que me prenda en este post, pero tengo una duda.
El PWM solo se puede usar en los pines especificos de cada pic o se puede armar algo con soft para utilizarlo en cualquier pin?
Muchas gracias.
-
claro que se puede hacer por software el pwm y en cualquier pin, lo que pasa es las funciones mencionadas arriba configuran registros que solo los micros con esta opcion por hardware tienen, esto lo especifica "This function is only available on devices with CCP/PWM hardware." ahora por software por supuesto que se puede, saludos
-
Ok, muchas gracias.