TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: j_fernandez en 20 de Octubre de 2005, 05:58:00

Título: Como funciona el PWM
Publicado por: j_fernandez en 20 de Octubre de 2005, 05:58:00
Hola, me gustaria hacer una conmutada mediante el pwm de un pic pero no tengo ni idea de como funciona.

Alguien puede explicarme un pikillo como funciona el PWM del pic?? Teneis algun ejemplo??

Gracias y un saludo

Jose
Título: RE: Como funciona el PWM
Publicado por: vszener en 20 de Octubre de 2005, 07:17:00
PWM=Modo de modulacion de anchura de pulsos
Este modulo sirve para obtener impulsos logicos cuya anchura del nivel alto es variable(Anchura variable=Duty Cycle)
El tiempo que dura el periodo de la onda viene determinado por el valor cargado en PR2(tener en cuenta que PR2 es la parte alta del TMR2):
Codigo:

   Periodo=[ (PR2)+1] · 4 · Tosc · Valor Preescaler PR2


Cuando el valor del TMR2=PR2 ocurren tres acontecimientos:
Codigo:

   1. Se borra TMR2
   2. La patita del CCP1 se pone a 1
   3. El valor CCPR1L(determina anchura del pulso) se carga en CCPR1H


Para obtener la anchura del pulso:
Codigo:

   Anchura del pulso=(CCPR1L:CCP1CON<5:4> ) · Tosc·Valor Preescaler TMR2



Pasos para configurar PWM:
Codigo:

   1. Asignar el periodo cargando valor oportuno en PR2
   2. Asignar la anchura del pulso(Duty Cycle)
   3. Configurar CCP1 como salida
   4. Asignar valor predivisor y activar TMR2
   5. Configurar modulo CCP1 como PWM.



Asi lo hago yo.....no se si ha quedado claro....de todas formas mirate estas transparencias:
http://www2.ate.uniovi.es/8696/transp.htm
Clave: micro
Suerte!!!Giño
Título: RE: Como funciona el PWM
Publicado por: j_fernandez en 20 de Octubre de 2005, 08:45:00
Gracias por tu respuesta vszener, me lo miraré con calma a ver si me aclaro. Por cierto, he ido a mirar las transparencias del enlace y al abrirlo me pide contraseña por lo que no he podido verlas.

Gracias y un saludo
Título: RE: Como funciona el PWM
Publicado por: vszener en 20 de Octubre de 2005, 08:56:00
Esta puesto en mi anterior post: Contraseña= micro
Giño
Título: RE: Como funciona el PWM
Publicado por: j_fernandez en 21 de Octubre de 2005, 03:52:00
Lo siento no no habia visto, ahora le exare un vistazo.

Muchas gracias, eres muy amable.

Un saludo!!!!
Título: Re: Como funciona el PWM
Publicado por: nicola en 30 de Septiembre de 2009, 20:04:37
hola que tal? siempre yo pidiendo ayuda, pero bueno sepan que son una fuente de informacion todos los dias! espero que en algun momento me llegue a mi el momento de ayudar jeje...


quiero generar una onda cuadrada de 1mhz. si utilizo la formula que postearon aca, la frecuencia maxima seria de 5mhz con un clock de 20mhz...ahora mi pregunta: a esas frecuencias funciona bien el pic? (16f877) no seria problema poner un schmitt trigger de ultima. ya use el ccp1 a 4khz y no tuve problemas, funciona genial.
la frutilla del postre seria poder variar la frecuencia del pwm con un potenciometro en alguna entrada A/D, alguien me podria echar una mano introductoria al uso del a/d?
la idea es poder guardar en la eeprom diferentes valores de frecuencia y despues poder volver a leerlos...

si les interesa saber en que ando, estoy buscando la manera de controlar con un pic los PT2395 (integrado de delay con a/d sigma delta, ram externa, d/a, comparadores, etc etc) variandole el clock varias los tiempos de delay y justamente quiero generarle el clock con el pic para poder guardar la frcuencia justa...

gracias de antemano, un saludo!
Título: Re: Como funciona el PWM
Publicado por: Suky en 30 de Septiembre de 2009, 20:17:23
Como bien tu indicaste a 20 MHz podes obtener como maximo 5Mhz y no tendras problema en el funcionamiento del PIC porque la generación del PWM se hace por Hardware  ;-)

Aquí (http://www2.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Modulo%20_AD_v4.pdf) hay un pdf donde presenta el módulo de conversión Analógico/digital muy bien explicado más un ejemplo al final.

Revisa el siguiente hilo (http://www.todopic.com.ar/foros/index.php?topic=24720.0), donde hay ejemplo de uso del PWM.



Saludos!
Título: Re: Como funciona el PWM
Publicado por: nicola en 08 de Octubre de 2009, 23:34:18
muchismas gracias suky, no me olvido queusted es el quesiempre me reponde las preguntas  :mrgreen:

el ejemplo del a/d no lo entiendo mucho, no se nada de assembly mas que equ...  :(
ahora me pongo a buscar algo en C

ya tengo al pwm funcionando!!!
Título: Re: Como funciona el PWM
Publicado por: Suky en 08 de Octubre de 2009, 23:42:05
En CCS es sencillo, para empezar se debe indicar cuantos bits vamos a utilizar en la conversión:

Código: C
  1. /* ********************* Conversor A/D de 8 bits *************************** */
  2. #device adc=8

Luego al inicio del main queda configurar el módulo analógico:
Código: C
  1. setup_adc_ports(ALL_ANALOG);
  2.    setup_adc(ADC_CLOCK_INTERNAL);

Los parámetros de estas funciones las podemos ver en el include (.h) del microcontrolador que estemos utilizando.

Y para realizar la conversión:
Código: C
  1. set_adc_channel(0);
  2.    delay_us(20);
  3.    Data=read_adc();

La declaración de data depende si se usa 8 o 10 bits.


Saludos!
Título: Re: Como funciona el PWM
Publicado por: nicola en 09 de Octubre de 2009, 03:59:14
bueno, son las 4 de la mañana y mañana a las 7 arriba para ir a trabajar...esto es amor por los pic (?)
debo admitir que no puedo parar de mover el potenciometro y mirar cambiar el display, es hipnotizante.
aca dejo el codigo, que en muy gran medida es gracias al foro!
es muy simplelo que hace: tiene un pote divisor de tension en la entrada A0 y muestra la posicion de 0 a 9 en un display de 7 segmentos. es el hola mundo de los adc  :lol:

un saludo suky, gracias de nuevo por la ayuda!


Código: C
  1. #include <16f877a.h>    
  2. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
  3. #DEVICE ADC=8
  4. #use delay (clock=4000000)
  5.  
  6. void main(void)
  7. {
  8.    char data;
  9.  
  10.    setup_adc_ports(ALL_ANALOG);
  11.    setup_adc(ADC_CLOCK_INTERNAL);
  12.    set_tris_b(0x00);
  13.  
  14.    set_adc_channel(0);
  15.  
  16.    do{
  17.       delay_us(20);
  18.       data=read_adc();
  19.       delay_us(20);
  20.  
  21.       if((data>=0x00)&&(data<0x18))
  22.       output_b(0b01111101);               //0
  23.       if((data>=0x18)&&(data<0x30))
  24.       output_b(0b01001000);               //1
  25.       if((data>=0x30)&&(data<0x48))
  26.       output_b(0b00111110);               //2
  27.       if((data>=0x48)&&(data<0x60))
  28.       output_b(0b01011110);               //3
  29.       if((data>=0x60)&&(data<0x78))
  30.       output_b(0b01001011);               //4
  31.       if((data>=0x78)&&(data<0x90))
  32.       output_b(0b01010111);               //5
  33.       if((data>=0x90)&&(data<0xA8))
  34.       output_b(0b01110111);               //6
  35.       if((data>=0xA8)&&(data<0xC0))
  36.       output_b(0b01001100);               //7
  37.       if((data>=0xC0)&&(data<0xD8))
  38.       output_b(0b01111111);               //8
  39.       if((data>=0xD8)&&(data<0xFF))
  40.       output_b(0b01001111);               //9
  41.  
  42.       delay_ms(100);
  43.              
  44.      }while(TRUE);      
  45. }
Título: Re: Como funciona el PWM
Publicado por: PPGando en 10 de Octubre de 2009, 14:06:16
interesantisimo chicos, voy a probar el codigo de suky en lo que llegue a casa de ver el futbol, pero quiero hacer una consulta, tengo entendido, que se pueden generar 2 pwm independientes en frecuencia y periodo de trabajo con el 18f, es cierto??, algun ejemplo??, no cual es la frecuencia mas pequeña en la que se puede trabajar(periodomas largo).

gracias de antemano por su atencion y respuestas
Título: Re: Como funciona el PWM
Publicado por: nicola en 14 de Octubre de 2009, 03:49:44
cuando vi el ejemplo de como usar el pwm, note que el periodo q pongo en el setup del timer2 siempre era la mitad del numero que ponia en el pwm duty.
Código: C
  1. setup_timer_2(T2_DIV_BY_4, 127, 1);      //512us -> 1,95kHz
  2. set_pwm1_duty(256);                  //256us/(4*(1/4000000)) = 256

pero con numeros menores a 127 no se mantiene esa relacion, de hecho es todo lo contrario y no tengo la menor idea del porque, pero probando valores encontre que el valor del pwm duty tiene q ser exactamente la mitad para tener un 50% de ancho de pulso.

Código: C
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
  3. #DEVICE ADC=8
  4. #use delay (clock=4000000)
  5.  
  6. void main(void)
  7. {
  8.    char frec,pwm;
  9.  
  10.    setup_adc_ports(ALL_ANALOG);
  11.    setup_adc(ADC_CLOCK_INTERNAL);
  12.    setup_ccp1(CCP_PWM);
  13.  
  14.    do{
  15.       set_adc_channel(0);
  16.       frec=read_adc();
  17.       delay_us(50);
  18.       frec=2+frec/2;
  19.       pwm=frec/2;
  20.  
  21.       setup_timer_2(T2_DIV_BY_1, frec, 1);
  22.       set_pwm1_duty(pwm);
  23.      
  24.        }while(TRUE);    
  25. }

ese es el ejemplito que hice.
con periodo igual a 10 saque 90,90khz
con periodo 50 saque 20khz
con periodo 127 saque 7,14Khz.

resumiendo, no se si anda por algun lugar del foro (yo no lo pude encontrar), pero aca dejo un simple generador de onda cuadrada variable con una entrada analogica.
Título: Re: Como funciona el PWM
Publicado por: Suky en 14 de Octubre de 2009, 09:11:05
Revisa por aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.0) lo que es la teoría del PWM, dependiendo de la frecuencia que selecciones trabajaras con cierta resolución (n bits) y de ello dependerá los valores que debas ingresar en duty_cycle.

Saludos!
Título: Re: Como funciona el PWM
Publicado por: pablolode en 16 de Octubre de 2009, 11:11:06
 Hola  colegas,con respecto a el tiempo real de ejecucion en cuanto a ms y us en CCS ¿ es real?...
es que adapte un codigo PMW del un maestro del foro para hacerlo trabajar en us y con el ociloscopio de PROTEUS me da los tieMpos asignados ...
PERO por ahi lei que en CCS DEMORA MAS AL EJECUTARLO EN UN CIRCUITO REAL  por el tiempo de ejecucion de las rutinas,¿¿ como saber mas o menos el tiempo real???
Título: Re: Como funciona el PWM
Publicado por: Suky en 16 de Octubre de 2009, 11:21:46
Pero el PWM que estas implementando es por Hard? Si es así no hay modificación. Si es por software, si esta bien calculado (Con demoras + ciclos de instrucción utilizados), tampoco deberías de tener problemas  :undecided:

Saludos!
Título: Re: Como funciona el PWM
Publicado por: pablolode en 16 de Octubre de 2009, 11:38:50
es decir... si implemento en el sof , por ejemplo, un  PMW a una frec DE 1 KHZ y un pulso de 10 us, en un circuito real se dara ESE tiempo exacto??
es que no dispongo de instrumental para verificar que el pic haga exactamente esos tiempos,esa es mi duda...
Título: Re: Como funciona el PWM
Publicado por: Suky en 16 de Octubre de 2009, 12:13:30
Si usas el cristal correcto (Porque si usas uno de 4Mhz no creo que de la velocidad) y has tenido todas las variables en consideración (Instrucciones usadas + demoras) repito nuevamente, no debería de haber diferencia.
Título: Re: Como funciona el PWM
Publicado por: PPGando en 16 de Octubre de 2009, 20:23:24
alguno ha usado el oscilador interno de alguno de los micros para generar la pwm??, la intencion es usarlo en 1Mhz para generar una pwm de 120hz pero he escuchado que no son estables
Título: Re: Como funciona el PWM
Publicado por: Nocturno en 17 de Octubre de 2009, 06:03:42
No son tan precisos como un cristal de cuarzo, pero para generar un PWM te irán genial, porque supongo que la precisión requerida a la frecuencia no es tan importante como la requerida al % de duty, y esto sí que lo vas a conseguir perfectamente.

La pega es que no puedes elegir a qué frecuencia corre el oscilador interno, la mayoría van a 8MHz y algunos también a 4MHz, pero no he visto ninguno a 1MHz.
Título: Re: Como funciona el PWM
Publicado por: PPGando en 18 de Octubre de 2009, 00:31:16
 :-/, gracias por tomarte la molestia de responder :-/
bueno en la data sheet de el 18f4550 y el 2550 dica que manipulando el registroOSCCON se puede obtener una surtida gama de frecuencias
bit 6-4 IRCF2:IRCF0: Internal Oscillator Frequency Select bits
                               111 = 8 MHz (INTOSC drives clock directly)
                               110 = 4 MHz
                               101 = 2 MHz
                               100 = 1 MHz(3)
                               011 = 500 kHz
                               010 = 250 kHz
                               001 = 125 kHz
                               000 = 31 kHz (from either INTOSC/256 or INTRC directly)
lo que no se es com hacerlo en c, alguine me podria echar una mano??
Título: Re: Como funciona el PWM
Publicado por: Suky en 18 de Octubre de 2009, 01:06:00
Debes colocar el fuse correspondiente:
Código: C
  1. INTXT, INTHS

y usar la siguiente función para establecer la velocidad:

Código: C
  1. setup_oscillator(parametro)

El parámetro puede ser:

Código: C
  1. OSC_31KHZ  
  2. OSC_125KHZ
  3. OSC_250KHZ
  4. OSC_500KHZ
  5. OSC_1MHZ
  6. OSC_2MHZ
  7. OSC_4MHZ
  8. OSC_8MHZ
  9. OSC_16MHZ
  10. OSC_32MHZ
Título: Re: Como funciona el PWM
Publicado por: epogor en 01 de Septiembre de 2011, 10:40:54
Hola soy nuevo, mis copañeros de la universidad me han recomendado este foro y les pido que me ayuden por favor; necesito generar un PWM con un Pic 18f2550, este pulso depende de dos datos una velocidad máxima en rpm y de un tiempo maximo que se ingresa por una pc, con este PWM debo ir aumentando el cicle duty a fin de que un motor brushless aumente su velocidad gradualmente como una rampa, mi problema consiste en calcular en lenguaje c el valor de pwm si las dos entradas mencionadas son variables a gusto del operador; soy nuevo en el manejo de PICs en lenjuaje Cy no se como hacerlo, al menos si tienen una idea se los agradeceria, saludos a todos. 
Título: Re: Como funciona el PWM
Publicado por: epogor en 02 de Septiembre de 2011, 12:00:08
queria aclara que no quiero que me den el codigo c pero necesito saber que bibliotecas usar y como calcular la frecuencia del pwm variable desde ya racias a todos, como digo compañeros de la universidad de la calle :o