Contraste de LCD por PWM y un filtro RC

Hola! Estoy usando un PIC18F4550 y quiero variar el contraste de la LCD por pwm y un filtro RC. Ahora vienen los problemas, ya que necesito el PWM hardware para otra acción prioritaria y como ambos usan el registro PR2 y el timer TMR0 como base de tiempos, la frecuencia programada va a ser la misma para los dos modulos CCP.

Por tanto, esto me fastidia el cálculo del circuito RC ya que se necesita una frecuencia fija, y ésta va a ser modificada constantemente. ¿Hay alguna solución que pueda hacer por hardware? Aclarar que lo único que necesitaría es modificar el ancho de pulso de "pwm contraste" pero claro, el circuito RC no vale para todas las frecuencias.


Por otro lado, he pensado que la solución puede ser hacer PWM por solftware, y aún sin saber programarlo, la principal duda que tengo es cómo voy a tener un bucle produciendo el pwm y a la vez mi programa principal, pero supongo que esta duda viene de no saber como se hace el de software. Si me pueden ayudar a entenderlo y solucionar mi problema me ayudarán mucho.

un saludo y gracias a todos
 
Última edición:
para hacerlo por software se usa la interrupción del timer y las cuentas se "hacen a mano" en lugar del registro que se llena y compara solo.
 
Este circuito te ira de maravilla (el amplificador operacional puede ser cualquiera, LM358, TL081, LM741, etc).
Dibujo2.bmp


El valor de RC se calcula con la siguiente ecuación:
R = 1 / 2*PI*Fc*C ---> el valor de C lo eliges, generalmente un valor comercial.
C = 1 / 2*PI*Fc*R ---> el valor de R lo eliges, generalmente un valor comercial.

Supongamos que tienes una frecuencia de trabajo de entre 1kHz a 100kHz. Necesitas escoger una frecuencia de corte (Fc) menor a la de trabajo. Si elegimos una Fc = 1.6Hz y una C = 10µF, el valor de R es de 10kΩ. Como el amplificador operacional funciona como seguidor de voltaje (Vin = Vout) la resistencia Rf igual es de 10kΩ.
 
Última edición:
Hola! Estoy usando un PIC18F4550 y quiero variar el contraste de la LCD por pwm y un filtro RC. Ahora vienen los problemas, ya que necesito el PWM hardware para otra acción prioritaria y como ambos usan el registro PR2 y el timer TMR0 como base de tiempos, la frecuencia programada va a ser la misma para los dos modulos CCP.

Por tanto, esto me fastidia el cálculo del circuito RC ya que se necesita una frecuencia fija, y ésta va a ser modificada constantemente. ¿Hay alguna solución que pueda hacer por hardware? Aclarar que lo único que necesitaría es modificar el ancho de pulso de "pwm contraste" pero claro, el circuito RC no vale para todas las frecuencias.


Por otro lado, he pensado que la solución puede ser hacer PWM por solftware, y aún sin saber programarlo, la principal duda que tengo es cómo voy a tener un bucle produciendo el pwm y a la vez mi programa principal, pero supongo que esta duda viene de no saber como se hace el de software. Si me pueden ayudar a entenderlo y solucionar mi problema me ayudarán mucho.

un saludo y gracias a todos
Creo que El 18f4550 tiene un DAC de 16 etapas (creo) que si lo tienes de sobra podría servirte de lujo.
Reviza la ficha técnica. Pagina 276 del microchip

 
Última edición:
el PWM a software en realidad es algo simple.

puedes tener todas las patas del micro usando PWM a software cada PWM puede ser independiente, tambien si se te acaban las patas del micro puedes usar registros de corrimiento y tener mas PWMs.

es muy simple el PWM.

numero 1

necesitas una base de tiempo eso se hace con una interrupcion.

numero 2 necesitas una frecuencia, digamos que quieres un PWM con 20ms para un servo
ahora necesitas dividir eso en 255 partes para hacer el PWM.

20ms/255 = 78.43 us

es decir nececitas interrumpir cada 78 us

cuando llegues a 255 reinicias la cuenta a 0 asi obtienes una frecuencia de 20ms con una resolucion de 8 bits.

y un simple if else para hacer el dutycicle

if(PWM >= contador)
{
prende led
}
else
{
apaga led
}
 
Creo que El 18f4550 tiene un DAC de 16 etapas (creo) que si lo tienes de sobra podría servirte de lujo.
Reviza la ficha técnica. Pagina 276 del microchip

:unsure: me mataste con ese dato y estoy tratando de corroborarlo, pero sin irme muy lejos, no hace falta controlar +Vcc del led parasubir o bajar la retroiluminacion... con un simple transistor NPN en el negativo del led se puede sbir y bajar la intensidad de la iluminacion segun el PWM... Lo mismo pasaria con el pin del contraste, a diferencia que tendriamos que sumar una resistencia de 4K7 a Vcc y con eso tenemos el divisor cuasiresistivo... Lo del filtro no me parece mala idea (1uF + 1KOhm) :unsure:
 
Si no se oucupa el DAC del pic se puede, lo que se intenta hacer con el pwm es eso un dac, pero para que hacerlo si ya lo trae, la diferencia es que con el interno son solo 16etapas y con pwm es de ajuste fino. para hacerlo esta en el datashet hace tiempo que no lo uso pero es posible ese dac interno sirve para los comparadores pero se puede configurar un pin de salida con ese vref, dale una checada y me corriges si estoy equivocado

 
Si no se oucupa el DAC del pic se puede, lo que se intenta hacer con el pwm es eso un dac, pero para que hacerlo si ya lo trae, la diferencia es que con el interno son solo 16etapas y con pwm es de ajuste fino. para hacerlo esta en el datashet hace tiempo que no lo uso pero es posible ese dac interno sirve para los comparadores pero se puede configurar un pin de salida con ese vref, dale una checada y me corriges si estoy equivocado


Me estoy volviendo loco... estoy buscando esto mismo que comentas ( http://www.microchip.com/wwwproducts/en/PIC18F4550 ) y no encuentro nada.... no digo que no, solo que no lo encuentro y me interesa, ya que para varias aplicaciones de control de LCD y GLCD me vendria barbaro esta info ;)
 
Hola
Es buena idea los del Vref, pero decir DAC en mi opinión no es correcto...
El Vref se consigue internamente de un divisor de tensión, este tiene 16 pasos, no existe resolución ya que no es un DAC... tienes 16 combinaciones...
El calculo para saber que voltaje sale por Vref lo consigues en la misma hoja de datos.

PWM por soft como la de TRILO-BYTE y si no quieres parpadeos al cambiar la resolución puedes implementarlo con Timer + interrupción. Claro si la carga del programa principal no es tan complejo.

Saludos
 
Última edición:
segun yo es un dac r2r

aqui esta el diagrama:
Screenshot_1.jpg
el voltaje si no mal recuerdo sale por el RA3

como les comento ya lo he utilizado antes, pero hace tiempo y no recuedo si es de 0 a 5v, o del 25% al 75%, no me acuerdo...:D

si tengo chance hago la prueba de recordatorio.
 
Última edición:
Es de 0 a 5 o usando las entradas Vref+ y Vref-.

El detalle con r2r es que se da tensión en los nodos de 2 resistencias que a la vez están en serie con otras, el resultado se ubica al final de la cadena en un punto común. Al aplicar voltaje a una serie de nodos y a otros no, determina la tensión resultante. A mi forma de explicar :) jeje

Al modulo del Vref se aplica tensión a resistencias en serie y se toma el voltaje de cada nodo a un multiplexor, solo se puede seleccionar un nodo a la vez...

Saludos
 
Es de 0 a 5 o usando las entradas Vref+ y Vref-.

El detalle con r2r es que se da tensión en los nodos de 2 resistencias que a la vez están en serie con otras, el resultado se ubica al final de la cadena en un punto común. Al aplicar voltaje a una serie de nodos y a otros no, determina la tensión resultante. A mi forma de explicar :) jeje

Al modulo del Vref se aplica tensión a resistencias en serie y se toma el voltaje de cada nodo a un multiplexor, solo se puede seleccionar un nodo a la vez...

Saludos

Entonces tiene razon Papirrin, se puede usar como una especie de DAC de 4bit :unsure:
de yapa, ya no se que tag usar para buscar mas info...
 
Pues si no necesita precisión que utilice un convertidor digital analógico de 4 bits mediante una red R-2R. Así no utiliza timers ni el módulo CCP, solo 4 pines del PIC o 3 pines (todo el puerto E), programación fácil.
 

Adjuntos

  • image.jpeg
    image.jpeg
    15.4 KB · Visitas: 8
Última edición:
miren les despejo sus dudas.esto es sacado de la ficha tecnica,..

The RA2 pin can be used as a simple D/A output with

limited drive capability. Due to the limited current drive

capability, a buffer must be used on the voltage

reference output for external connections to VREF.

Figure 23-2 shows an example buffering technique.

 
Creo que nos estamos ahogando en un vaso de agua, él simplemente quiere controlar el contraste del display a través del PIC. Como está utilizando el TIMER0, y el módulo CCP (TIMER1 o TIMER2) necesita otra solución sin necesidad de utilizar el PWM. Lo mejor sería un convertidor Digital-Analógico de pocos bits.
 
pues es justo lo que sugiero utilizar el dac del pic que segun recuerdo se puede utilizar independiente del modulo comparador y solo se usa un pin el ra2 y no se entorpece el proceso con codigo considerando que no se requiere de un ajuste muy fino pues es solo el contraste.
en fin... hay miles de maneras de matar una mosca...XD

 
Última edición:
Al final he regresado, no contesté antes porque estaba con otras cosas y las respuestas no iban por el camino que quería dar a entender.

El problema que tengo es que ya tengo es que ya no puedo cambiar el hardware, tengo el pin (el CCP1 con pwm) para el contraste conectado a un filtro RC y ha sido después del montaje cuando me he dado cuenta que las frecuencias tienen que ser las mismas...

Por tanto, solo me quedan dos opciones,

o pwm por software en cuyo caso preguntaba si podría tenerlo funcionando mientras se realizan otras acciones en el pic (que funcione mientras estoy moviéndome entre los menús de la lcd por ej)

o hacer los cálculos de la resolución del duty cycle para cada frecuencia que use con el programa principal y adaptar su valor al porcentaje que necesita mi lcd para verse bien.

¿Qué me recomendáis?
 
o pwm por software en cuyo caso preguntaba si podría tenerlo funcionando mientras se realizan otras acciones en el pic (que funcione mientras estoy moviéndome entre los menús de la lcd por ej)
No, para eso esta el del HW.

o hacer los cálculos de la resolución del duty cycle para cada frecuencia que use con el programa principal y adaptar su valor al porcentaje que necesita mi lcd para verse bien.

No creo que se vea del todo bien, pro puedes intentar hacer esos calculos pero debes considerar todos esos calculos de lineas a nivel ensamblador segun entiendo lo que pretendes.
 
No, para eso esta el del HW.



No creo que se vea del todo bien, pro puedes intentar hacer esos calculos pero debes considerar todos esos calculos de lineas a nivel ensamblador segun entiendo lo que pretendes.

Lo que estaba pensando es usar la ecuanción de la resolución del pwm
9dUlmGK.png


una vez calculada, hacer 2^n siendo n la resolución en bits y ese número lo multiplicaría por una variable llamada duty de valor 0.5 por ejemplo si quiero el 50%.

Algo como esto:
Código:
#include <stdio.h>
#include <math.h>
#define Fosc 48000000  

int T2DIV;      // preescaler de la funcion setup_timer_2, puede ser 1, 4 o 16 
int Fpwm;       // frecuencia que busco
float dutycycle;    // valor que introducimos en la funcion set_pwm1_duty(dutycycle)
float duty;         // de 0 a 1 me indica el % del duty cycle que queremos
  
int dutycalculator();        // función donde operamos para obtener el valor de la variable dutycycle
int calculo_de_prescaler();  // función donde operamos para calcular el preescaler adecuado a la frecuencia que necesitamos



int main(void) {
	
	Fpwm= 5000;                          // ejemplo con 5 kHz
	duty= 0.5;                           // duty 50%
	calculo_de_prescaler();
	
	
	return 0;
}




  int calculo_de_prescaler(){  
     
   
   if (Fosc/(Fpwm*1*4)-1<0xFF) {
     //  setup_timer_2(T2_DIV_BY_1, (int8)(Fosc/(Fpwm*1*4))-1, 1);
       T2DIV=1;
   }
   
   else if (Fosc/(Fpwm*4*4)-1<0xFF) {
    //  setup_timer_2(T2_DIV_BY_4, (int8)(Fosc/(Fpwm*4*4))-1, 1);
      T2DIV=4;
   }
   
   else if (Fosc/(Fpwm*16*4)-1<0xFF) {
  // setup_timer_2(T2_DIV_BY_16, (int8)(Fosc/(Fpwm*16*4))-1, 1);
   T2DIV=16;
   }
   
   dutycalculator();
   
  }
  
  int dutycalculator(){
  	
  int resolucion = log10(Fosc/(Fpwm*T2DIV))/log10(2);             // calculamos la resolucion de dicho valor de frecuencia
  dutycycle = pow(2,resolucion)*duty;                             // hacemos 2^(resolucion) y multiplicamos por variable duty
  
  printf("%d\n",T2DIV);       
  printf ("%d\n",resolucion);
  printf("%.2f",dutycycle);
   

  	
  }

compilando se obtiene
FJLK2Wz.png




el caso es que fijándome en los valores de resoluciones de esta web http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html (para 48 MHz), no me queda claro cuándo la resolución es por ejemplo de 9 bits o 10 bits, ya que cuando el valor calculado resulta entre ambos (por ejemplo 9.9), para algunas frecuencias en 9 bits y para otras es 10...
 
Atrás
Arriba