Autor Tema: Dudas con PWM  (Leído 3357 veces)

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

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Dudas con PWM
« en: 25 de Marzo de 2016, 07:45:31 »
Hola, los que hayais leido el hilo que abri en "Electronica de potencia", sabreis que estoy en la tarea de construir un inversor DC/AC senoidal, valga este comentario para poner en materia a los demas.
Pues bien ante nada decir que es mi primer proyecto utilizando PWM y lo cierto es que aunque antes de empezar he estudiado bastante y visto ejemplos de otros compañeros, se me presentan dudas que no entiendo.
En los enlaces que pongo a continuacion, se ven distintas imagenes, asi como el codigo en CCS y el include de cabecera. Decir que el codigo es estrictamente el generado por el "Easy Project·, ya que para las pruebas lo considero suficiente. Igualmente aclaro que en el diseño de Proteus, no he puesto los condensadores de desacoplo de las patillas "VB" de los IR2112, por cuestion de espacio, pero es solo para la simulacion.
Bien vamos al tema, lo primero que me llama la atencion es que teniendo la definicion de duty una longitud de 16 bits, (set_pwm1_duty((int16)248);) solo son validos valores entre 0 y 499. El resto o sea hasta 16583, los acepta sin errores, pero no cambian nada, quedando el motor al maximo de su velocidad a partir de 500. ¿Porque ocurre eso? y ¿Porque precisamente 499?.
La segunda cuestion es que el puente H, no esta funcionando, el PIC solo activa permanentemente la salida P1A, incluso cuando el PWM es 0 y aplica el PWM a la salida P1C. Las salidas P1B y P1D no se utilizan nunca, a pesar de estar declarado como puente H, (setup_ccp1(CCP_PWM|CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);).
Una ultima aclaracion, he utilizado un motor para las pruebas, por ser mas grafico que un transformador.

Enlaces:

Proyecto completo: www.yaitana.es/temp/PWM_PIC18F1220.zip
Imagen 1: www.yaitana.es/temp/0_PWM.png
Imagen2:  www.yaitana.es/temp/248_PWM.png
Imagen3:  www.yaitana.es/temp/499_PWM.png
Imagen4:  www.yaitana.es/temp/500_PWM.png
Codigo C:  www.yaitana.es/temp/main.c
Cabecera h:  www.yaitana.es/temp/main.h
Codigo hex: www.yaitana.es/temp/main.hex
Diseño Proteus:  www.yaitana.es/temp/PIC18F1220-1.DSN

Agradezco como siempre vuestra ayuda.

Saludos.

P.D.: El zip contiene todos los otros enlaces, para quien quiera probarlo.
P.D2.: Por un problema en mi servidor, los enlaces no funcionan ahora. En unos dias volvere a subir los archivos.

« Última modificación: 11 de Abril de 2016, 06:52:24 por AcoranTf »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con PWM
« Respuesta #1 en: 25 de Marzo de 2016, 08:33:43 »
Citar
Bien vamos al tema, lo primero que me llama la atencion es que teniendo la definicion de duty una longitud de 16 bits, (set_pwm1_duty((int16)248);) solo son validos valores entre 0 y 499. El resto o sea hasta 16583, los acepta sin errores, pero no cambian nada, quedando el motor al maximo de su velocidad a partir de 500. ¿Porque ocurre eso? y ¿Porque precisamente 499?.

Voy a responderlo rapido: Por que no leiste el datasheet  :D

El duty no es de 16 bits, el duty es de maximo 10 bits, conformados 2 bits de un registro ( estos son los bits de menor peso ) y 8 mas que tiene un registro CCPR1L siendo los de mayor peso este ultimo.

Ahora lo mejor es ver el diagrama del Timer y del CCP para entenderle como es que funcionan.
En el Timer 2 cargaste tu Periodo, el Timer 2 va a contar desde 0 a ese periodo y volver a 0. Es decir que el Timer2 se compara con ese registro y ante una coincidencia se activa la salida y ademas pone a 0 el TMR2.

Ahora el Duty funciona de una forma parecida. Nomas que son 10 bits, ¿como haces para comparar 10 bits contra 8?, bueno el micro genera esos 2 ultimos bits. Algo simple de hacer que no viene al caso y si estas interesado lo explico. En fin.. quedando algo asi:

TMR2:2bitsgenerados

Y formando los 10 bits. OK, ahora veamos que valores puede llegar a tener el duty.. en TMR2 pusiste un valor de periodo de 124 ( 0x7C ), pero deberiamos multiplicarlo por 4 ya que ahora estamos moviendolo a la izquierda 2 bits y poniendo bits nuevos. lo cual te deja en 496 + 0 a 3 de los ultimos 2 bits

Ahi tenes el por que podes variarlo solo desde 0 a 499 el duty. Y si queres la mayor resolucion posible tenes que intentar que el periodo sea lo mas proximo a 255. Lamentablemente Microchip decidio ponerlo pocas opciones de preescaler al TMR2.

Resumiendo:
El TMR2 es lo unico que cuenta, lo demas son valores que dan coincidencia y activan/desactivan la salida del PWM, luego hay una logica combinacional que maneja las 1/2/4 salidas.
Cuando coincide el valor del duty con el del (TMR2*4) + 0 a 3 , se apaga la salida
Cuando coincide el valor del duty con el periodo , la salida se enciende y se pone nuevamente a 0 el TMR2

Si el duty es muy grande, jamas habria una coincidencia por lo cual nunca se pondria a 0 la salida, y el TMR2 llegaria a coincidir con el periodo, lo cual volveria a 0 el contador y por ende jamas llegarias al valor del duty dejandote en 100% de duty.

Citar
La segunda cuestion es que el puente H, no esta funcionando, el PIC solo activa permanentemente la salida P1A, incluso cuando el PWM es 0 y aplica el PWM a la salida P1C. Las salidas P1B y P1D no se utilizan nunca, a pesar de estar declarado como puente H,

Si solo supiera cual es el codigo de setup_ccp1(), por eso odio CCS, al menos se lo que pongo en los registros. Ya que estoy mas que seguro que le estas errando en lo que pones dentro.
Por ejemplo:

CCP_PWM|CCP_PWM_FULL_BRIDGE

Es un problema... Deberias tener uno solo que deberia ser: CCP_PWM_FULL_BRIDGE , ya que tal ves CCP_PWM lo hace simple output, pero la combinacion de ambos (la OR) termina siendo como de 2 salidas.
Si no funciona asi, deberas esperar a alguno que sepa mas de CCS que yo, yo busque en el manual y trate de asimilarlo con el datasheet pero hay cosas que son imposibles.
« Última modificación: 25 de Marzo de 2016, 08:44:53 por KILLERJC »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #2 en: 25 de Marzo de 2016, 09:21:06 »
Muchas gracias por tu estupenda aclaracion KILLER_JC.
Todo lo que dices lo entiendo y te doy la razon, aunque si que estudie la hoja tecnica y entendi lo de los 10 bits, que por cierto tambien esta explicado en el manual de CCS. Pero cosas de la impaciencia y la falta de experiencia con PWM, no fui capaz de deducir lo que estaba tan claro.
Por otro lado, como digo en mi consulta, me he limitado a probar el codigo generado por el "Easy Project" del CCS, yo no he puesto ni quitado nada, salvo las lineas que aparecen comentadas, en un intento de solucionarlo.
Ahora estoy fuera de casa, pero cuando regrese seguire estudiando todo lo que comentas e intentare de nuevo ponerlo a funcionar correctamente.
Repito las gracias.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #3 en: 25 de Marzo de 2016, 21:12:32 »
Citar
La segunda cuestion es que el puente H, no esta funcionando, el PIC solo activa permanentemente la salida P1A, incluso cuando el PWM es 0 y aplica el PWM a la salida P1D. Las salidas P1B y P1C no se utilizan nunca, a pesar de estar declarado como puente H,

Como dije antes, estoy revisando la hoja tecnica del PIC18F1220 y me encuentro esta sorpresa en la pagina 117, que describe el funcionamiento del PWM avanzado:

REGISTER 15-1: CCP1CON REGISTER FOR ENHANCED CCP OPERATION

bit 7-6 P1M1:P1M0: PWM Output Configuration bits
If CCP1M<3:2> = 00, 01, 10:
xx = P1A assigned as Capture/Compare input; P1B, P1C, P1D assigned as port pins
If CCP1M<3:2> = 11:
00 = Single output; P1A modulated; P1B, P1C, P1D assigned as port pins
01 = Full-bridge output forward; P1D modulated; P1A active; P1B, P1C inactive
10 = Half-bridge output; P1A, P1B modulated with dead-band control; P1C, P1D assigned as
port pins
11 = Full-bridge output reverse; P1B modulated; P1C active; P1A, P1D inactive

Lo cual coincide con lo que me ocurre con las salidas, o sea P1A = +5V fija, P1D = PWM, P1B y P1C = 0V permanentes. Y entonces yo me pregunto ¿esto es un FULL_BRIDGE?. Para este viaje no necesitaba yo estas alforjas. Con un solo transistor me basta para tener ese mismo resultado y me ahorro tres transistores y dos IR2110 con sus componentes asociados.
Realmente esto no llego a entenderlo.
¿Alguien sabe de que va esto?.

Saludos.

P.D.: En la descripcion inicial del problema intercambie por error las salidas P1C con la P1D, o sea el PWM se aplica a la salida P1D.
P.D2.: Pensando sobre este "problema" se me ocurre lo que han querido hacer los de Microchip. Al tener las posibilidades de FULL_BRIDGE Forward y Reverse, esto podria utilizarse para invertir el giro de un motor, pero la utilidad se reduce mucho cuando se trata de utilizarlo para el fin que yo lo quiero, o sea generar una tension alterna mediante la conexion del transformador al puente H. Y digo que se reduce mucho porque habria que cambiar el modo del puente en cada semiciclo de la sañal alterna, todo un handicap para el programador y mas aun si como es mi caso, no es muy experto.
« Última modificación: 25 de Marzo de 2016, 21:28:30 por AcoranTf »

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Dudas con PWM
« Respuesta #4 en: 25 de Marzo de 2016, 22:44:12 »
Saludos,
 Como dices en la PD2 el full bridge te serviria para el control de un motor dc y el cambio del sentido de giro. Para gererar la señal de un inversor con onda senoidal bipolar podrias utilizar el pwm en half-bridge y la coneccion del puente H como se indica en el datasheet. Pero para un inversor seno unipolar necesitas dos modulos pwm en half-bridge. Por lo que te recomendaria en ese caso utilizar otro micro que los tenga, como el 18f4xk22, o un dspic

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #5 en: 26 de Marzo de 2016, 07:13:54 »
Gracias uZINQ por tu comentario.
Ahora mismo estoy pensando que quiero hacer, ya que todo lo que tenia pre-pensado se fue al carajo.
Lo que tu comentas me supone tanta dificultad como intentarlo con este PIC, generando por software lo que no hace el propio PIC. Tambien cabe la posibilidad de olvidarse totalmente del PWM implementado y generarlo totalmente por software, pero cualquiera de esas soluciones requieren un conocimiento y experiencia que no tengo.
Por otro lado he visto inversores senoidales que solo llevan un humilde PIC de gama baja, tipo PIC16F84 o similar y van de maravilla. Claro que al ser comerciales no tengo acceso al software.
Como digo, voy a tomarme unos dias para decidir que hacer y seguir investigando por ahi.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con PWM
« Respuesta #6 en: 26 de Marzo de 2016, 07:54:11 »
Es que si te pones a pensar no es "muy complicado" hacer el PWM que pensas por software, En su minima expresiona necesitarias un timer, nomas que el PIC18 tiene ademas otras herramientas como el registro y que carga sola, lo cual te puede simplificar mas las cosas.

Ademas lo podes hacer unipolar y bipolar, segun como desees. En el caso que quieras realizar un SPWM obviamente.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #7 en: 26 de Marzo de 2016, 08:00:57 »
Es que si te pones a pensar no es "muy complicado" hacer el PWM que pensas por software, En su minima expresiona necesitarias un timer, nomas que el PIC18 tiene ademas otras herramientas como el registro y que carga sola, lo cual te puede simplificar mas las cosas.

Ademas lo podes hacer unipolar y bipolar, segun como desees. En el caso que quieras realizar un SPWM obviamente.

Precisamente justo tras publicar mi ultimo comentario, hace unos minutos, se me ocurrio una idea que voy a probar, es utilizar lo que tengo ideado, pero el PWM, programarlo para half bridge y poner a cada salida, (P1A y P1B), los transistores opuestos en rama y posicion. De ese modo creo que pueda funcionar, aun tengo que comprobar si los tiempos de conexion y corte de los transistores de la misma rama no provocan problemas.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #8 en: 24 de Octubre de 2016, 07:01:29 »
Bueno tras unos meses en que me lo tome con calma, hace unas semanas volvi al tema y aun no consigo sacar este proyecto.
Voy a explicar un poco la filosofia que estoy aplicando a mi plan:

* Pretendo general un SPWM, para una salida AC de 50 Hz. Con un PIC18F1220, oscilador interno de 12 MHz. 120 muestras por ciclo, (6 KHz.).
* He realizado una tabla con 120 muestras. Estas muestras representan el valor del DUTY para el PWM y se obtienen de multiplicar el valor seno de uno de cada tres grados de los 360, por el valor de maxima definicion del DUTY. He realizado pruebas con 10 bits y 8 bits.
* He calculado el valor de PR2 para obtener los 6 KHz del PWM.
* Utilizo la variable: bint = bandera de interrupcion.
* Activo la bandera de interrupcion y desactivo la propia interrupcion en el momento que ocurre esta.
* Asigno al Duty el valor correspondiente de la tabla.
*  Al llegar a 60 pasos y cambiar de semiciclo, cambio la polaridad del puente H. Al llegar a 120 vuelvo a cambiarlo
* Cuando se ha completado un ciclo de AC, (20 mS.), restituyo la bandera de interrupcion y reactivo esta.

Todo lo anterior puede verse tanto en el codigo C, como en el esquematico de Proteus : www.yaitana.es/temp/pwm.zip

El problema que tengo es que la señal del PWM  presenta una señal bastante extraña, en la que no estan presentes los 120 pasos correspondientes.
He pensado si sera falta de tiempo entre interrupciones para atender todo el codigo, pero creo que deberia sobrar tiempo. He intentado meter un "control" en el programa, de modo que encienda el pin RB0 al desahibilitarse la interrupcion y apagarlo al restituirla, colocando luego un frecuencimetro en ese pin para controlar el tiempo que tarda en ejecutarse, pero no solo no funciona la medida del tiempo sino que deja de funcionar todo. Esto confirmaria que puede ser falta de tiempo.

¿Alguien me da un poco de luz en este tema?.

Saludos.

P.D.: Ufff, leyendo mi propio post me acabo de dar cuenta de un verdadero "disparate". La interrupcion esta programada para producirse cada 166 uS. Pero un ciclo de AC dura 20 mS. Voy a estudiar por ahi. De todas formas agradezco cualquier comentario.

P.D2.: He modificado y simplificado el codigo. Ha mejorado mucho el funcionamiento general, pero la  señal del PWM sigue siendo rara, no contiene los 120 pasos por ciclo. ¿Podria deberse a falta de tiempo?. Lo extraño es que estan presentes los primeros y ultimos pulsos de cada semiciclo del PWM, pero no los 100 restantes, o sea los centrales de cada semiciclo.



« Última modificación: 25 de Octubre de 2016, 17:44:17 por AcoranTf »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #9 en: 24 de Octubre de 2016, 16:30:00 »
Creo que todo el problema esta en la interrupcion del TIMER2. He realizado una pequeña rutina que solo active el pin B1 durante 85 uS cada interrupcion y he quitado el resto del programa y del esquema. Solo he dejado un frecuencimetro para intentar ver con que frecuencia se activa el pin B1 y aunque el mini programa ocupa el 2% de la memoria del PIC, al ejecutarlo ocupa el 100% de CPU, ademas da error de desbordamiento repetitivo y por tanto de RESET del PIC. Ello me lleva apensar como digo, que algo estoy haciendo mal en el tratamiento de la interrupcion, pero no consigo ver que es. A ver si alguien me puede echar una mano.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #10 en: 25 de Octubre de 2016, 22:28:21 »
Bueno "cada loco con su tema"  :D :D
Sigo haciendo pruebas y estudiando a ver donde esta el fallo, pero aun no consegui encontrarlo. Lo que si consegui es mejorar bastante el comportamiento del circuito y obtener las frecuencias correctas, tanto del PWM,(166 uS), como de la señal de salida AC, (20 mS). La señal PWM tambien presenta los valores y forma correcta, en el tramo que se genera. Pero sigo teniendo el problema de que en las porciones de PWM correspondiente a cada semiciclo de AC, solo tengo unos 20 impulsos o ciclos del PWM repartidos en los extremos del semiciclo, quedando el resto de espacio sin pulsos, o sea me faltarian unos 80 pulsos del PWM y eso es lo que no entiendo porque ocurre.
En la foto del enlace se aprecia lo que digo, tiene poca calidad porque la tuve que hacer con el movil, ya que al actualizar el Virtualbox, no me hace captura de pantalla.
Las señales amarilla y azul, son las que excitan los GATE de los dos MOSFET de la parte baja, los de la parte alta simplemente se ponen a 1 o a 0 segun corresponda y la señal roja es la salida de AC, despues del filtro pasabajos.

www.yaitana.es/temp/pwm.jpg

Saludos.
« Última modificación: 25 de Octubre de 2016, 22:33:37 por AcoranTf »

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Dudas con PWM
« Respuesta #11 en: 25 de Octubre de 2016, 23:07:47 »
Saludos

 Yo pondria todo el codigo vital dentro de la interrupción, además que tienes tiempo de sobra para lo que se requiere (166us). Pero insisto en que tu estas tratando de realizar un inversor unipolar y de esa manera como lo estas realizando solo te servira para cargas resistivas, para cargas inductivas necesitas darle un camino de circulación a la corriente en todo momento. Por eso te recomende utilizar un pic con dos modulos PWM. Como lo estas realizando el voltaje se distorsiona cuando la carga es inductiva.
Código: [Seleccionar]
void TIMER2_isr(void)
{
   
set_pwm1_duty(dato[paso]);                   // Asigna valor de la tabla a DUTY.
    paso++;                                      // Incrementa puntero de la tabla.
if(paso==60)                                       // Semiciclo negativo.
    {
 
   setup_ccp1(CCP_PWM|CCP_PWM_FULL_BRIDGE_REV); // Puente H inverso.

}
if(paso==120)                                      // Semiciclo positivo
{
   
   setup_ccp1(CCP_PWM|CCP_PWM_FULL_BRIDGE);     // Puente H directo.
  paso=0;                       // Repone puntero de la tabla.

}
}


void main()
{
      set_tris_b(0);                                         //Puerto B como salidas.
      enable_interrupts(int_timer2);                         //Habilita la interrupcion del TIMER2
      enable_interrupts(GLOBAL);                             //Habilita las interrupciones.
     
      setup_timer_2(T2_DIV_BY_4,101,1);                      // Interrupcion cada 166 uS.
     
      setup_ccp1(CCP_PWM|CCP_PWM_FULL_BRIDGE);               //4 salidas PWM, para puente H
     
     
      while(true);
             
}



 

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #12 en: 26 de Octubre de 2016, 04:44:54 »
Hola uZYNQ y gracias por tu comentario.
En el inicio del proyecto, tenia el codigo como tu indicas, todo dentro de la interrupcion, pero dado que todo el mundo y en todas partes aconsejan que se haga como esta ahora, lo cambie. Hay que tener en cuenta que una vez funcione el PWM correctamente, el PIC tendra otras funciones mas. De todos modos lo voy a probar como dices, aunque solo son unas pocas instrucciones las que se ahorran, (habilitar, desahiblitar y borrar registro de interrupcion).
Por otro lado no termino de entender lo que comentas de que sea unipolar y su mal funcionamiento con cargas inductivas. Te agradeceria me lo explicases mejor y cual seria la solucion.

Saludos.

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Dudas con PWM
« Respuesta #13 en: 26 de Octubre de 2016, 07:32:19 »
 Saludos

 En cuanto a la carga inductiva te explico. Cuando el puente esta en FORWARD enciendes Q1 y haces PWM con Q4. Si la corriente es positiva no hay problema tal como se muestra en la Imagen parte A y B. si Q4 se enciende tendras VCC en la Carga (Imagen A) y cuando se apaga tendras GND en la carga (Imagen B), porque la corriente tiene un camino y se garantiza el Cero en la carga.
 En cambio si la corriente es negativa como se muestra en la Imagen C y D. Cuando se enciende Q4 efectivamente se tiene VCC en la carga (Imagen C), pero cuando se apaga Q4, la corriente sigue circulando por donde mismo por lo que la carga sigue viendo VCC, es decir no se esta generando el Cero a la Carga cuando se deberia porque Q4 se esta apagando.
Esto mismo ocurre para el caso cuando pones el puente en REVERSE.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Dudas con PWM
« Respuesta #14 en: 26 de Octubre de 2016, 08:06:53 »
Supongo que te referiras a la contracorriente, pero en cualquier caso y salvo el pequeñisimo tiempo de encendido/apagado de los IGBT, el resto del tiempo siempre hay una pareja de IGBT conduciendo y son alternativamente Q1 y Q4 o Q3 y Q2 segun el semiciclo de la AC. Por ello no creo que haya problema.

Saludos.