Autor Tema: 3 PWM desfasados 120 grados con PIC18F6520  (Leído 8899 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
3 PWM desfasados 120 grados con PIC18F6520
« en: 09 de Junio de 2010, 00:01:24 »
Buenas, he leido la mayoria de los temas relacionados con PWM en PICs pero ninguno esta relacionado con el problema que tengo. Necesito generar 3 PWM con ciclo util variable desfasados 120 grados entre ellos. El problema es que pude generar dos PWM desfasados 120 grados perfectamente pero el tercer PWM no lo genera bien, es decir, algunos pulsos los hace bien pero otros no (adjunto imagen de los 3 PWM). Estoy usando tablas con porcentajes de ciclo utiles distintos y mediante la interrupcion del timer2 voy cargando valores distinto de la tabla para generar los distintos ciclo utiles. El problema lo tengo en el tercer PWM. Si alguien me pusiera ayudar, se lo agradeceria (Estoy usando CCS).

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #1 en: 09 de Junio de 2010, 01:49:48 »
Pega tu programa para que podamos ayudarte

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #2 en: 09 de Junio de 2010, 20:21:38 »
Anexo programa. Estoy actualizando el ciclo util de los 3 PWM en la interrupcion del timer2, mientras que el periodo total lo estoy actualizando cada 9 interrupciones del timer2.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #3 en: 10 de Junio de 2010, 03:29:05 »
Veo ciertas cosas en tu programa que me chirrían:
- ¡en cada interrupción del timer cambias el duty!
- haces 3 multiplicaciones float*float dentro de la interrupción del timer lo que puede provocar un retraso enorme en los cálculos


Como tú bien dices, se pueden generar 3 PWM con el mismo periodo, pero no con periodos distintos, por lo que yo me olvidaría del PWM por hardware e intentaría hacer una gestión por software:
- en el bucle del main, en función del duty de cada momento, calcularía el tiempo que debe transcurrir entre un flanco y el siguiente y alimento un array con estos tiempos
- en la interrupción del timer cargo el tiempo que toque e incremento el índice que va recorriendo el array
- en la misma interrupción levanto o bajo el pin que toque

Suerte

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #4 en: 10 de Junio de 2010, 15:44:26 »
Ok, gracias por responder. Entiendo lo que me dices. Realice la multiplicacion del float*float porque necesito cambiar tambien el periodo de los 3 PWM. Pero no es que los varie a un periodo distinto los 3 PWM sino que los vario al mismo periodo. Lo que si cambia entre un PWM y el otro es el desfasaje de 120 grados. Uno de los array float que eso utilizando es relacionado con un factor que se multiplicara por el porcentaje del ciclo util que es otro array para asi generar un PWM de igusl porcentaje de ciclo util pero de distinto periodo (igual para los 3 PWM). Por lo que veo, me dices que el problema radica en le multiplicacion de los float.

Ahora la parte que me dices que actualice en el bucle main (infinito por supuesto) los duty y los meta en un array lo intentare. Pero quizas no habra algun problema cuando en la mitad de la actualizacion para otro periodo completo de PWM entre en la interrupcion y al leer los valores del array, lea unos valores para un periodo y otros valores para otro periodo?. Pero veo que me dices que no use el modulo PWM en si, sino que use timers?

Bueno, intentare quitar la multiplicacion de los float y hacer simplemente la actualizacion sin la misma de los duty. Te respondo a ver como me va

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #5 en: 10 de Junio de 2010, 18:06:23 »
lei un par de veces el mensaje para entender el tema del PWM con variación del periodo, pero no he logrado entenderlo :oops:

Según tengo entendido, un PWM funciona con periodo constante y solo varia el ancho del pulso o duty cycle, ya lo que quieres hacer si es como entendí, no corresponde a un PWM, por lo que deberias utilizar interrupciones por el timer como dice Nocturno.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #6 en: 10 de Junio de 2010, 20:38:28 »
Willnovy, yo puedo generar un PWM con solo timers, el problema es que esa senal tengo que variarla. Imagina 9 pulsos de PWM en 60Hz, tengo que variar la frecuencia desde 48 hasta 72Hz y que permanezca un mismo porcentaje de ciclo util para los 9 pulsos, es decir, cuando tenga 48Hz, deben haber 9 pulsos de PWM en 48Hz, al igual que cuando tenga 72Hz, deben haber el mismo numero de pulsos en la frecuencia escogida. Hacerlo solo con timer e interrupciones sin el modulo PWM gastaria mucha memoria por los array que estaria incluyendo ademas supongo que perderia sincronia entre las 3 senales. Lo que no se si estoy haciendo bien, es la actualizacion de los PWM, como se que en cada vez que haya desborde del timer2, empieza un nuevo pulso de pwm.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #7 en: 11 de Junio de 2010, 01:50:54 »
Una duda: ¿sólo cambiará la frecuencia entre 48Hz y 72Hz manteniendo el duty constante todo el rato, o también cambia el duty?

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #8 en: 11 de Junio de 2010, 10:12:56 »
Nocturno, al cambiar la frecuencia, cambiaria el duty pero mantendria su porcentaje. Por ejemplo, el periodo de un pulso de PWM a 60Hz es de 1.85ms (ya que son 9 pulsos en 16.66ms), si hay un PWM que tiene 50% de duty seria de 925us; ahora si vario la frecuencia a 48Hz, entonces el periodo del pulso del PWM seria ahora de 2.31ms, entonces el duty tiene que ser 50% tambien, por lo que el tiempo ahora es de 1.16ms. Asi se mantienen los 9 pulsos de PWM por frecuencia deseada.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #9 en: 11 de Junio de 2010, 12:17:55 »
Ok, pues si no cambia el duty es más fácil, si tenemos en cuenta estas consideraciones:

1. Llamamos a los flancos de subida de cada una de las tres señales A, B y C. Llamamos a los flancos de bajada de esta otra manera: a, b y c.
2. En cualquier frecuencia, si el duty es fijo al 50%, y llamamos T al periodo de la señal, el tiempo entre flancos será el siguiente:
A  <- T/2 -> a <- T/2 -> A  <- T/2 -> a <- T/2 -> A  <- T/2 -> a ...
            B  <- T/2 -> b <- T/2 -> B  <- T/2 -> b <- T/2 -> B  <- T/2 -> b ...
                        C  <- T/2 -> c <- T/2 -> C  <- T/2 -> c <- T/2 -> C  <- T/2 -> c ...
3. Si no me equivoco, el orden en que deben producirse los distintos flancos es el siguiente: C t1 b t2 A t3 c t4 B t5 a t6 C t1 b t2 A t3 c t4 B t5 a t6...
4. Y si la hipótesis es correcta, tenemos que T = t1 + t2 + t3 + t4 + t5 + t6 y esto permanece invariable para cada frecuencia, por lo que únicamente debes calcular qué fracción de T representa cada tn, para tener rápidamente los tiempos con que cargar la interrupción del timer.

Suerte

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #10 en: 11 de Junio de 2010, 20:26:00 »
Ok, La cuestion de los duty es la siguiente, me falto un detalle (pense que lo habia explicado). Los 9 pulsos a cualquier frecuencia tiene los siguientes porcentajes de ciclo útil:
1 pulso: 68.93%
2 pulso: 93.59%
3 pulso: 94.39%
4 pulso: 74.98%
5 pulso: 50.76%
6 pulso: 24.99%
7 pulso: 7.89%
8 pulso: 6.66%
9 pulso: 31.31%

Ahora creo que me explique mejor. Lo que tengo en mente es realizar un vector para cada frecuencia que contenga 18 valores (9 para los tiempos en alto y 9 para los periodos) y asi genero un PWM a una frecuencia, pero tendria que realizar 72-48=24 vectores con 18 valores cada uno, me parece que consumiria mucha memoria del PIC (aunque los vectores serian tipo int16 o int de acuerdo al timer que use). Estare ideando otra forma, aviso como me va.

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #11 en: 11 de Junio de 2010, 22:40:23 »
Nocturno, pude generar un solo PWM con el timer 1 pero solo para 60Hz. En el programa declare un vector con 9 valores para el timer (ciclo util). En el programa principal voy actualizando el valor de R_T el cual sera un valor del timer que pondra en alto de nuevo el pin. En la interrupcion simplemente de acuerdo al valor de una variable cargo el ciclo util o el resto del periodo del pwm. Ahora tendria que variar ese PWM entre 48Hz y 72Hz, pero lo unico que se me ocurre es realizar muchos vectores para cada valor de frecuencia y ya. 

Use a 20MHz para mayor rapidez en la parte de la interrupcion.

Anexo programa e imagen con el PWM

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #12 en: 12 de Junio de 2010, 03:18:41 »
Entonces el desfase es en el duty, y no en la frecuencia. Me confundiste al decirme que el duty permanecía constante; el problema hay que resolverlo de otra manera.

Si sobre la gráfica que has obtenido pintas las otras dos señales desfasadas 120º, ¿no puedes calcular los tiempos entre flancos como en el ejercicio que yo hice antes?. Te puede quedar un array largo, pero una vez montado ya tendrás hecha la aplicación.

Desconectado simon_1988

  • PIC10
  • *
  • Mensajes: 10
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #13 en: 12 de Junio de 2010, 10:22:11 »
Tienes razon, ya realice la variacion de frecuencia para un solo PWM, pero tuve que colocar un array de dos dimensiones (ARRAY[X][Y]), de 24 filas y 9 columnas (cada fila representa los duty a una frecuencia). Realice el calculo como mencionas y lo puse en el array y para el periodo completo use una ecuacion donde involucra el valor del timer para no realizar tantos array. No se si estoy entendiendo mal, pero me sugieres que haga los 3 PWM con un solo timer??, porque lo tengo pensado hacer con 3 pero podria ahorrarme timers si uso uno solo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 PWM desfasados 120 grados con PIC18F6520
« Respuesta #14 en: 12 de Junio de 2010, 12:11:52 »
Sí, claro, con un sólo timer tienes de sobra. La clave está en ordenar todos los cambios de flanco de las tres señales y encontrar los intervalos de tiempo entre cada dos flancos y ya lo tienes. Aunque cambies la frecuencia, el orden entre los flancos permanecerá constante por lo que en el array sólo deberás cambiar los tiempos.


 

anything