Autor Tema: Problema con INVERSOR CC/CA de 60Hz  (Leído 37078 veces)

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

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Problema con INVERSOR CC/CA de 60Hz
« en: 27 de Julio de 2013, 00:27:46 »
Intento hacer un generador de PWM con frecuencia de 60Hz, ademas necesito que al existir un impulso en el INT0/RB0 se resetee la forma de onda, esto con el fin de poder sincronizarla con la red, debido a que el detector de cruce por cero lo tengo realizada para el flanco negativo tengo que iniciar la forma de onda desde cero hacia abajo en la interrupcion, pero hay algo que no me esta cuadrando ya que ni la PWM me da jeje, a ver si me puede alguien hechar una mano con que es lo que me esta faltando en el codigo... hace mucho q no hacia un programa y estoy un poco oxidado en el tema. El programa lo he hecho con salida en un pin que es el CCP1/RC2, pero si me pueden ayudar para que funcione en la salida complementaria pues lo agradeceria, caso contrario eso lo realizaria por hardware.

Espero y me puedan ayudar, ahi les dejo el codigo explicado lo mejor que he podido.

   list p=18f4550
   #include "p18f4550.inc"
;Símbolos
;Parámetros de demora
cont_val = 0x0b
;====================
   org 0
       goto inicio
   org 0x18
       goto INT_low ;rutina de atencion a IT de baja prioridad
;==================================================================================================
;Configuarción de hardware y condiciones iniciales de variables
;--------------------------------------------------------------------------------------------------
;PORTC   
inicio   bcf TRISC,2       ;salida del PWM      
;==================================================================================================
;Configuración  del periodo de PWM y del registro CCP1CON
   movlw d'42' ;Aqui es un valor q saque de un programa aunq segun mi calculo deberia ser: d'51'
   movwf PR2 ;Frecuencia de PWM = 6KHz
   movlw 0x0F
   movwf CCP1CON; Configura el modo PWM en "single output "
;==================================================================================================
      ;Configuración del TIMER 0
;--------------------------------------------------------------------------------------------------
   ;Timer0 es configurado como timer/counter de 8-bit; Prescale 1:8
   movlw b'01000010'
   movwf T0CON
;==================================================================================================
      ;Configuración del TIMER 2
;--------------------------------------------------------------------------------------------------
   ;Timer 2: Cargado con un pre-escaler de 16
   movlw b'00000011'
   movwf T2CON
;==================================================================================================
   ;Interrupciones
   bcf RCON,7 ;se desabilitan las prioridades resgistro RCON
   ;Interrupciones
   movlw b'01000000'    ;Deshabilitadas interrupciones, Habilitan interrupciones externas (bit6) habilitadas individualmente   
   movwf INTCON
   ;Int_timer 0
   bsf INTCON,TMR0IE ;Habiliada interrupcion del TMR0 por overflow
   bcf INTCON,GIE   ;espera por condiciones de arranque
   bsf INTCON,INT0IE   ;Habilita IT externa en PORTB0
   bcf INTCON2,INTEDG0   ;Falling o activo a la bajada
   ;==========================================
   ;Condiciones iniciales
   movlb 0   ;BSR=0 ubicación en el banco 0
   clrf cont_val
   clrf CCPR1L ;Ciclo Util = 0
   ;==========================================
   ;arranque
   bsf T0CON,7   ;arranca timer 0
   bsf T2CON,2   ;arranca timer 2
   bsf INTCON,7   ;arrancan ITs
   ;==========================================
   ;Lazo principal
again     goto again
   ;==========================================
   ;Interrupción
   ;-----------------------------------------------------------------------------
INT_low   ;Pregunta por banderas de IT
   btfss INTCON,TMR0IF   ;¿int timer 0?
   goto dos   
   call ini_tab
   movlw d'64'
tabla   cpfseq cont_val   ;  compara con las 64 muestas tomadas
   goto mover
        clrf cont_val
   goto back
   ;Mueve el valor  a CCPR1L
mover   movf cont_val,w
   mullw 2
   movff PRODL,TBLPTRL         ;apunta al valor de la tabla
   TBLRD*+
   movff TABLAT,CCPR1L         ; mueve el valorde la tabla al CCPR1L
   incf cont_val
back   bcf INTCON,TMR0IF
      bcf INTCON,INT0IF
   retfie 1
dos   btfss INTCON,INT0IF   ;¿interrupcion externa en puerto Rb0?
   goto back
   movlw d'33'      ;cargo valor 33 por el condensador que se demora medio ciclo en cargarse
   movwf cont_val
   goto tabla
;========= Inicia la TAbla o ACCESA============
ini_tab   clrf TBLPTRL
   movlw 6
   movwf TBLPTRH
   clrf TBLPTRU
   return
;==============================================================
;Demoras
;--------------------------------------------------------------------------------------------------
   ;Tabla de valores de la onda!!!!
   
   org 0x600

   data 0x80,0x8C,0x98,0xA5,0xB0,0xBC,0xC6,0xD0,0xDA,0xE2,0xEA,0xF0,0xF5,0xFA,0xFD
   data 0x0E,0xFF,0xFE,0xFD,0xFA,0xF5,0xF0,0xEA,0xE2,0xDA,0xD0,0xC6,0xBC,0xB0,0xA5,0x98
   data 0x8C,0x80,0x73,0x67,0x5A,0x4F,0x43,0x39,0x2F,0x25,0x1D,0x15,0xF,0xA,0x5,0x2,0x1
   data 0x0,0x1,0x2,0x5,0xA,0xF,0x15,0x1D,0x25,0x2F,0x39,0x43,0x4F,0x5A,0x67,0x73
;--------------------------------------------------------------------------------------------------

   end


Saludos, Pedro.
« Última modificación: 19 de Septiembre de 2013, 18:56:03 por pgvs25 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Citar
Intento hacer un generador de PWM con frecuencia de 60Hz, ademas necesito que al existir un impulso en el INT0/RB0 se resetee la forma de onda, esto con el fin de poder sincronizarla con la red, debido a que el detector de cruce por cero lo tengo realizada para el flanco negativo tengo que iniciar la forma de onda desde cero hacia abajo en la interrupcion, pero hay algo que no me esta cuadrando ya que ni la PWM me da jeje, a ver si me puede alguien hechar una mano con que es lo que me esta faltando en el codigo... hace mucho q no hacia un programa y estoy un poco oxidado en el tema. El programa lo he hecho con salida en un pin que es el CCP1/RC2, pero si me pueden ayudar para que funcione en la salida complementaria pues lo agradeceria, caso contrario eso lo realizaria por hardware.

¿Que es un dimmer o algo parecido?, es decir ¿quieres recortar la onda de alterna?.

Creo que para lo que quieres con cualquier 16f te llegaria de sobra, incluso con un 12f y a lo mejor un 10f, para progranar en ensamblador creo que te irian mejor estas series que la 18f, aparte de que son mas baratos y ocupan menos espacio en la placa.

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Citar
Intento hacer un generador de PWM con frecuencia de 60Hz, ademas necesito que al existir un impulso en el INT0/RB0 se resetee la forma de onda, esto con el fin de poder sincronizarla con la red, debido a que el detector de cruce por cero lo tengo realizada para el flanco negativo tengo que iniciar la forma de onda desde cero hacia abajo en la interrupcion, pero hay algo que no me esta cuadrando ya que ni la PWM me da jeje, a ver si me puede alguien hechar una mano con que es lo que me esta faltando en el codigo... hace mucho q no hacia un programa y estoy un poco oxidado en el tema. El programa lo he hecho con salida en un pin que es el CCP1/RC2, pero si me pueden ayudar para que funcione en la salida complementaria pues lo agradeceria, caso contrario eso lo realizaria por hardware.

¿Que es un dimmer o algo parecido?, es decir ¿quieres recortar la onda de alterna?.

Creo que para lo que quieres con cualquier 16f te llegaria de sobra, incluso con un 12f y a lo mejor un 10f, para progranar en ensamblador creo que te irian mejor estas series que la 18f, aparte de que son mas baratos y ocupan menos espacio en la placa.

En realidad quiero hacer un inversor... en realidad solamente tengo nociones del 18f4550 que fue el que aprendimos en las aulas, asi como tambien tocamos un poco del 16f871, tambien lo he intentado, en el 16f871, pero sin resultados, almenos este 18f4550 en la vida real me da solamente una parte de la onda, aunque a veces si y a veces no, a parecer tiene que ver algo con la configuracion... en el 16f871 me funciona la interrupcion por el puerto externo pero no logro hacer salir el pwm, si quieres te paso el codigo en 16f para que le heches un vistazo aunque es muy similar, solamente diferencia la configuracion y una que otra cosa por ahi... Ademas he puesto el ejemplo en 18f4550 ya que veo que ese pic lo manejan mas aca en el foro que el 16f.

Saludos, Pedro.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Citar
En realidad quiero hacer un inversor...

Entonces no tienes que sincronizar la onda, para hacer un inversor tienes que rectificar primero, y ya en DC la conviertes en alterna. ¿No?

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Citar
En realidad quiero hacer un inversor...

Entonces no tienes que sincronizar la onda, para hacer un inversor tienes que rectificar primero, y ya en DC la conviertes en alterna. ¿No?

A ver si me explico un poco mejor.

Tengo una fuente de Corriente continua.... lo que necesito es esa fuente de corriente continua transformarla en fuente de corriente alterna (inversor), luego la parte de sincronizar se podria decir que es un segundo tema, para ese segundo tema me va a ayudar la parte de la interrupcion externa.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
No entiendo lo que estas haciendo, pero bueno es que la serie 18f no la controlo mucho, lo que si veo es que efectivamente la salida PORTC,2 salida del PWM no varia.

Pon el que tienes para el 16f871, a ver si con ese me entero algo mas. Nunca hice esto para monofasica, pero te explico como creo que es:

Para generar el PWM de 6KHz cada 167uS tienes que poner a 1 el PORTC,2 y ponerlo a 0 cuando acaba su DUTTY correspondiente que sera diferente en cada PWM primero sera de 0 (este sera el paso por 0 de la onda alterna) no hay que detectarlo porque eres tu quien lo hace, el segundo PWM tendra un DUTTY del 10% es decir 16 o 17us (asi seria una onda de 10 niveles, que deben ser multiplos de 3, pero bueno...) el tercero del 20% y asi sucesivamente hasta llegar al 100%, entonces empezara a bajar, primero al 90%, despues al 80% ..........del 10% y de 0, que sera el cruce por 0 nuevamente y e haras lo mismo pero con sentido inverso de corriente para hacer la semionda negativa. Tendras que hacer los calculos para que con todas estas te salga una frecuencia de 60Hz de alterna. Bueno esta es la manera de hacerlo que yo se, no se si tu lo haces asi o de otra manera, que habra otras maneras de hacerlo, supongo.

No se que hard esta usando, supongo que un puente H, tendras que poner bobinas para que conviertan los PWMs en niveles de tension, si es para alimentar un motor las bobinas del motor ya te hacen esta funcion, pero si es para alimentar una vivienda...

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Exactamente, la salida PORTC,2 que es la salida del PWM no varia cuando deberia variar....

A ver si puedo explicar un poco mejor porque talves por la tabla no me entiendas....


Utilizo una resolución en el PWM de 8 bits (256 niveles de tensión). Lo que intento hacer es que estos niveles (salida PWM) varíen en el tiempo para describir una señal seno.
Primero elijo que resolución en frecuencia deseo darle a la "salida seno", es decir cuantos niveles de tensión deseas tener en un ciclo de la senoide, esto lo hago cada 5,625 grados eléctricos (el ciclo completo es 2pi=360 grados) por lo cual tendre 64 niveles distintos.
Para realizar lo anterior debo tener una salida PWM (obvio) y un timer que es el que te actualizará el valor del duty cycle de la salida.

Entonces calculo el tiempo en el que el timer debe recalcular el duty cycle de la salida.
Lla frecuencia de la seno es 60Hz por lo tanto:
el período es  ------>60 Hz = (1/60)seg = 16,67 ms

esto es lo que dura un período de la seno, como lo actualizamos cada 5,625 grados tendremos 64 niveles y cada uno durará:
Tiempo del timer ----> Tt = período / 64 = 16,67 / 64 = 260,468 Useg
Estos 260 Useg es cada cuanto debes recalcular el duty cycle del PWM.

Ahora bien, para calcular este duty cycle habría que calcular el seno de 5,625 grados, el de 11,25... hasta el de 360 grados y nuevamente el seno de 5,625.....y asi eternamente, esto es muy complejo de realizar con un microcontrolador de 8 bits. Lo que se hace es colocar los 64 resultados en una tabla, e irlos leyendo con la frecuencia que te da el timer que acabamos de calcular.

Luego los valores de la tabla serán:
para 0o = ((seno 0o)*127)+127 = 127
para 5,625o = ((seno 5,625o)*127)+127 = 139,44
para 11,25o = ((seno 11,25o)*127)+127 = 151,77
.
.
para 90o = ((seno 90o)*127)+127 = 254
.
.
para 180o = ((seno 270o)*127)+127 = 127

.
.
para 270o = ((seno 270o)*127)+127 = 0
.
.
para 360o = ((seno 360o)*127)+127 = 127
Estos  valores son los que coloco en el PWM para ajustar el duty cycle, pero los transformo en hexadecimal

Entonces leo esta tabla e incremento el puntero de lectura (cont_val), al llegar al final debes comenzar nuevamente.

Aqui estoy algo confundido ya q no se si tengo q utilizar la bandera del Timer 2 o  algo mas?? solamente ocupo la bandera del Timer 0.... la verdad que tambien estoy un poco oxidado en programacion y por eso queria ver si alguien me podia colaborar a ver en que me estoy equivocando o que me esta faltando.


Aqui el codigo en 16f871, a ver si ahi me pedes ayudar



   list p=16F871
   #include "p16f871.inc"

;Auxiliares
cont_val = 0x01
aux1 = 0X02
;====================
   org 0x00
       goto inicio
   org 0x04
       goto INT ;rutina de atencion a IT de baja prioridad
;==================================================================================================
;Configuarción de hardware y condiciones iniciales de variables
;--------------------------------------------------------------------------------------------------
inicio
;PORTC   
   movlw b'00100000'  ;Pasa al Banco1      
   movwf STATUS   
    bcf TRISC,2       ;salida del PWM
;==================================================================================================
;Configuración  del periodo de PWM y del registro CCP1CON
   movlw 0x0F
   movwf CCP1CON; Configura en modo PWM
   movlw d'81'
   movwf PR2 ;Frecuencia de PWM = ; PR2 = [(Fosc*Tpwm)/(Prescaler*4)]-1 = [(20E6*(260,468E-6))/(16*4)]-1= 81
;==================================================================================================
      ;Configuración del TIMER 0
;--------------------------------------------------------------------------------------------------
   ;TOverflow max apagado
   movlw b'00000010'  ;configura el prescaler 1:8, y la int por flanco de bajada (bit6)      
   movwf OPTION_REG
;==================================================================================================
      ;Configuración del TIMER 2
;--------------------------------------------------------------------------------------------------
   ;Timer 2: overflow max. apagado
   movlw b'00000011' ; cargado con un pre-escaler de 16 y post-escaler de 1:1
   movwf T2CON
   bsf PIE1,TMR2IE
;==================================================================================================
   ;Interrupciones
   bcf INTCON,GIE ;Deshabilitadas todas las interrupciones
   bsf INTCON,PEIE ;Habilitadas de IT perifericas
   bsf INTCON,INTE   ;Habilita IT externa en PORTB0
   ;Int_timer 0
   bsf INTCON,T0IE   ;Habilita IT del TMR0
   bsf INTCON,TMR0IE ;Interrupción de desbordamiento del Temporizador 0 habilitada
   bcf OPTION_REG,INTEDG   ;La interrupción externa en Rb0 se dispara por flanco de bajada.
;==================================================================================================
   ;Condiciones iniciales
   movlw b'00000000'  ;configura el prescaler 1:8, y la int por flanco de bajada (bit6)      
   movwf STATUS   ;BSR=0 ubicación en el banco 0
   ;==========================================
   ;arranque
   bsf T2CON,TMR2ON ;arranca timer 2
   bsf INTCON,GIE ;arrancan ITs y TMR0
   ;==========================================
   ;Lazo principal
again     goto again
   ;==========================================
   ;Interrupción
   ;-----------------------------------------------------------------------------
INT   ;Pregunta por banderas de IT
    btfss INTCON,INTF
   goto a
   goto int_ext
a   btfss INTCON,T0IF   ;¿int timer 0?
   goto volver
   call ini_tabla
   movlw d'64'
   movwf aux1
tab   decfsz aux1,1
   goto mover   
   clrf cont_val
   goto volver
int_ext
   bcf PORTC,2
   bcf INTCON,INTF
   retfie
mover   incf cont_val,1
   pageselw tabla
   movf cont_val,w
   call tabla
   movwf CCPR1L
   goto tab
volver   bcf INTCON,T0IF
   retfie

;========= Inicia la TAbla o ACCESA============
ini_tabla
   movlw 0
   clrf cont_val
   return
;==============================================================
;Demoras
;--------------------------------------------------------------------------------------------------
   ;Tabla de valores de la onda!!!!
   
   org 0x600

tabla
   ADDWF PCL,1 ; W = offset
   RETLW 0X7F ; Empieza la tabla
   RETLW 0X8B ;
   RETLW 0X97 ;
   RETLW 0XA3 ;
   RETLW 0XAF ;
   RETLW 0XBA ;
   RETLW 0XC5 ;
   RETLW 0XCF ;
   RETLW 0XD8 ;
   RETLW 0XE1 ;
   RETLW 0XE8 ;
   RETLW 0XEF ;
   RETLW 0XF4 ;
   RETLW 0XF8 ;
   RETLW 0XFB ;
   RETLW 0XFD ;
   RETLW 0XFE ;
   RETLW 0XFD ;
   RETLW 0XFB ;
   RETLW 0XF8 ;
   RETLW 0XF4 ;
   RETLW 0XEF ;
   RETLW 0XE8 ;
   RETLW 0XE1 ;
   RETLW 0XD8 ;
   RETLW 0XCF ;
   RETLW 0XC5 ;
   RETLW 0XBA ;
   RETLW 0XAF ;
   RETLW 0XA3 ;
   RETLW 0X97 ;
   RETLW 0X8B ;
   RETLW 0X7F ;
   RETLW 0X72 ;
   RETLW 0X66 ;
   RETLW 0X5A ;
   RETLW 0X4E ;
   RETLW 0X43 ;
   RETLW 0X38 ;
   RETLW 0X2E ;
   RETLW 0X25 ;
   RETLW 0X1C ;
   RETLW 0X15 ;
   RETLW 0XE ;
   RETLW 0X9 ;
   RETLW 0X5 ;
   RETLW 0X2 ;
   RETLW 0X1 ;
   RETLW 0X0 ;
   RETLW 0X1 ;
   RETLW 0X2 ;
   RETLW 0X5 ;
   RETLW 0X9 ;
   RETLW 0XE ;
   RETLW 0X15 ;
   RETLW 0X1C ;
   RETLW 0X25 ;
   RETLW 0X2E ;
   RETLW 0X38 ;
   RETLW 0X43 ;
   RETLW 0X4E ;
   RETLW 0X5A ;
   RETLW 0X66 ;
   RETLW 0X72 ;
   RETLW 0X7E ;
;--------------------------------------------------------------------------------------------------

   end


Saludos, Pedro.



No entiendo lo que estas haciendo, pero bueno es que la serie 18f no la controlo mucho, lo que si veo es que efectivamente la salida PORTC,2 salida del PWM no varia.

Pon el que tienes para el 16f871, a ver si con ese me entero algo mas. Nunca hice esto para monofasica, pero te explico como creo que es:

Para generar el PWM de 6KHz cada 167uS tienes que poner a 1 el PORTC,2 y ponerlo a 0 cuando acaba su DUTTY correspondiente que sera diferente en cada PWM primero sera de 0 (este sera el paso por 0 de la onda alterna) no hay que detectarlo porque eres tu quien lo hace, el segundo PWM tendra un DUTTY del 10% es decir 16 o 17us (asi seria una onda de 10 niveles, que deben ser multiplos de 3, pero bueno...) el tercero del 20% y asi sucesivamente hasta llegar al 100%, entonces empezara a bajar, primero al 90%, despues al 80% ..........del 10% y de 0, que sera el cruce por 0 nuevamente y e haras lo mismo pero con sentido inverso de corriente para hacer la semionda negativa. Tendras que hacer los calculos para que con todas estas te salga una frecuencia de 60Hz de alterna. Bueno esta es la manera de hacerlo que yo se, no se si tu lo haces asi o de otra manera, que habra otras maneras de hacerlo, supongo.

No se que hard esta usando, supongo que un puente H, tendras que poner bobinas para que conviertan los PWMs en niveles de tension, si es para alimentar un motor las bobinas del motor ya te hacen esta funcion, pero si es para alimentar una vivienda...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Vale, correcto, vas a hacer una onda senoidal casi perfecta, joder 256 niveles  ((:-)) ((:-)), tengo visto en algunos motores trifasicos senoides de 3 niveles y, a pesar de que muy mala, andan como si nada.

Bien como ecte PIC nunca lo programe te pregunto ¿Estos dos reg. estan bien ahi?

;Auxiliares
cont_val = 0x01
aux1 = 0X02

Te entra en interrupcion a los 5.8uS y ya no se sale de ahi, ejecuta el retfie pero en vez de volver aqui:

   ;Lazo principal
again     goto again

Se va directamente al vector de interrupcion a pesar de que INTCON,GIE si se borra, TMR0 no llega a desbordarse (con el tiempo lo hara claro) y PORTC,2 esta siempre a 0, no se porque entra en interrupcion y lo peor no se porque nunca se sale de ella, ahora ando apurado mañana a ver si lo miro con mas detalle.

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Funcionan para motores ya q no se necesita q la forma de onda sea muy buena... como comentaba al principio luego de que me de la onda sinusoidal voy a utilizar la interrupcion para poder sincronizar la onda a la red pero eso ya es otra historia... por ahora quiero que me salga la forma de onda....

Con respecto a tus preguntas de las Auxiliares.... pues se que tengo que declararlas, lo que no recuerdo es como o en que ubicacion tengo que hacerlo... realmente yo estuve apartado de los PICs como 5 años, y recien ahora estoy tomandolos nuevamente y es por eso que ando con muchas dudas y ando en busca a ver si alguien me puede quitar esas dudas y por sobre todo ayudar con este codigo...

El porque se entra en la interrupcion y no sale de ahi es seguramente por la declaracion de esas variables, seguramente estan incorrectas pero ya no recuerdo como hacerlo, y para colmo no tengo ni un ejemplo tengo de lo que habia hecho en el tiempo de estudiante ya que por problemas en mi computador tuve q formatearlo y jamas hice respaldo de eso.... Por eso mismo acudi al foro a ver si alguien me podia hechar una mano, ya con la parte que tengo del programas pues a ver si alguien puede ahi echarle mano y hecharlo a correr jejejeje


Saludos, Pedro.


Vale, correcto, vas a hacer una onda senoidal casi perfecta, joder 256 niveles  ((:-)) ((:-)), tengo visto en algunos motores trifasicos senoides de 3 niveles y, a pesar de que muy mala, andan como si nada.

Bien como ecte PIC nunca lo programe te pregunto ¿Estos dos reg. estan bien ahi?

;Auxiliares
cont_val = 0x01
aux1 = 0X02

Te entra en interrupcion a los 5.8uS y ya no se sale de ahi, ejecuta el retfie pero en vez de volver aqui:

   ;Lazo principal
again     goto again

Se va directamente al vector de interrupcion a pesar de que INTCON,GIE si se borra, TMR0 no llega a desbordarse (con el tiempo lo hara claro) y PORTC,2 esta siempre a 0, no se porque entra en interrupcion y lo peor no se porque nunca se sale de ella, ahora ando apurado mañana a ver si lo miro con mas detalle.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Citar
Funcionan para motores ya q no se necesita q la forma de onda sea muy buena... como comentaba al principio luego de que me de la onda sinusoidal voy a utilizar la interrupcion para poder sincronizar la onda a la red pero eso ya es otra historia... por ahora quiero que me salga la forma de onda....

Si, de acuerdo si es para almentacion de aparatos electronicos o electrodomesticos etc, cuanto mejor sea, pues mucho mejor, aunque creo que es "demasiado buena"  :lol:, tambien creo que repites varios DUTTys por tanto en varios PWMs el nivel es el mismo ¿No?.

Los registros normalmente van aqui en toda le serie16f:

;Auxiliares
cont_val  EQU 0x20
aux1   EQU 0X21

Digo normalmente porque queria bajar el datasheet del 16f871 pero no me aparece en las paginas de Microchip, ¿Es muy antiguo?.

De todas maneras ya le cambie esos registros y sigue estando en la interrupcion siempre, pero ahora va a buscar valores a la tabla y los guarda en CCPR1L???  esta cargando valores en CCPR1L pero nunca espera a que desborde ningun TIMER y nunca activa PORTC,2.

Mirate aqui unos ejemplos:

http://www.todopic.com.ar/foros/index.php?topic=24720.0

Y aqui un ejemplo del Módulo CCP, porque creo que el problema es que esta este modulo mal configurado.

http://www.todopic.com.ar/foros/index.php?topic=24720.msg204920#msg204920

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Re: Problemas con PWM e interrupcion externa en pic18f4550 al realizar una onda seno
« Respuesta #10 en: 31 de Julio de 2013, 23:42:53 »
no repito duttys, bueno mas bien los repito pero ya es en la parte de bajada de la onda con respecto a la de subida jejejejeje

ahora voy a cambiar los registros de los auxiliares que me comentas, como te escribi anteriormente ya no recuerdo mucho jejejeje

ah y ya revise asi que edito... veo que el General Purpose Register inicia en el 20h en el banco 0 asi que tienes razon... ahora q veo los bancos y creo q en la declaracion de algunas cosas se me paso el cambiar de banco, voy a probar a ver como me va... lo malo es que no recuerdo muy bien como simular en MPLAB, asi que para simular solamente utilizo el proteus, aunque se que en algunos casos no funciona pero tengo esperanza de que si me funcione en lo que estoy haciendo jejejejejeje


No se que tan antiguo sea, como te digo hace algunos años que no estoy vinculado a la electronica y recien estoy retomando, en todo caso te dejo un link de microchip en donde esta el datasheet del pic a ver si tu encuentras algo porque yo no encontre.... o sera q no lo logro ver...

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010233

ahora leo las paginas que me dejas para ver si encuentro algo... por ahi parece q lei q tengo q mandar a 1 el PORTC,2 y de ahi empezar... voy a ver si encuentro en esas paginas algo sobre eso.

Cualquier cosa sigo con el hilo e igualmente espero q si encuentras algo que me pueda ayudar pues que me lo indiques.

Saludos, Pedro.


Citar
Funcionan para motores ya q no se necesita q la forma de onda sea muy buena... como comentaba al principio luego de que me de la onda sinusoidal voy a utilizar la interrupcion para poder sincronizar la onda a la red pero eso ya es otra historia... por ahora quiero que me salga la forma de onda....

Si, de acuerdo si es para almentacion de aparatos electronicos o electrodomesticos etc, cuanto mejor sea, pues mucho mejor, aunque creo que es "demasiado buena"  :lol:, tambien creo que repites varios DUTTys por tanto en varios PWMs el nivel es el mismo ¿No?.

Los registros normalmente van aqui en toda le serie16f:

;Auxiliares
cont_val  EQU 0x20
aux1   EQU 0X21

Digo normalmente porque queria bajar el datasheet del 16f871 pero no me aparece en las paginas de Microchip, ¿Es muy antiguo?.

De todas maneras ya le cambie esos registros y sigue estando en la interrupcion siempre, pero ahora va a buscar valores a la tabla y los guarda en CCPR1L???  esta cargando valores en CCPR1L pero nunca espera a que desborde ningun TIMER y nunca activa PORTC,2.

Mirate aqui unos ejemplos:

http://www.todopic.com.ar/foros/index.php?topic=24720.0

Y aqui un ejemplo del Módulo CCP, porque creo que el problema es que esta este modulo mal configurado.

http://www.todopic.com.ar/foros/index.php?topic=24720.msg204920#msg204920
« Última modificación: 31 de Julio de 2013, 23:51:53 por pgvs25 »

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Re: Problemas con PWM e interrupcion externa en pic18f4550 al realizar una onda seno
« Respuesta #11 en: 01 de Agosto de 2013, 03:26:33 »
A ver... aqui esta el nuevo codigo con la declaracion de auxiliares en donde va, ademas con el cambio de bancos pero tengo q hacerlo asi con w, ya q al utilizar RP0(q ahora esta como comentario) me da unos errores al compilar en mplab...

A ver si puedes chequearlo para ver que te sale... yo ya simule en Proteus pero no obtuve el resultado positivo...

Te dejo el codigo

   list p=16F871
   #include "p16f871.inc"

;Auxiliares
cont_val EQU 0x20
aux1 EQU 0X21
;====================
   org 0x00
       goto inicio
   org 0x04
       goto INT ;rutina de atencion a IT de baja prioridad
;==================================================================================================
;Configuarción de hardware y condiciones iniciales de variables
;--------------------------------------------------------------------------------------------------
inicio
;PORTC         
   bsf STATUS,RP0   ;Pasa al Banco1
    bcf TRISC,2       ;salida del PWM
;==================================================================================================
;Configuración  del periodo de PWM y del registro CCP1CON
   movlw b'00000000'        
   movwf STATUS   ;Banco 0
;   bcf STATUS,RPO ;Pasa al Banco 0
   movlw 0x0F
   movwf CCP1CON; Configura en modo PWM
   movlw b'00100000'        
   movwf STATUS   ;Banco 1
;   bsf STATUS,RP0   ;Pasa al Banco1
   movlw d'81'
   movwf PR2 ;Frecuencia de PWM = 6KHz; PR2 = [(Fosc*Tpwm)/(Prescaler*4)]-1 = [(20E6*(1/6000))/(16*4)]-1= 51
;==================================================================================================
      ;Configuración del TIMER 0
;--------------------------------------------------------------------------------------------------
   ;TOverflow max apagado
   movlw b'00000010'  ;configura el prescaler 1:8, y la int por flanco de bajada (bit6)      
   movwf OPTION_REG
;==================================================================================================
      ;Configuración del TIMER 2
;--------------------------------------------------------------------------------------------------
   ;Timer 2: overflow max. apagado
   movlw b'00000000'        
   movwf STATUS   ;Banco 0
;   bcf STATUS,RPO ;Pasa al Banco 0
   movlw b'00000011' ; cargado con un pre-escaler de 16 y post-escaler de 1:1
   movwf T2CON
   movlw b'00100000'        
   movwf STATUS   ;Banco 1
;   bsf STATUS,RP0   ;Pasa al Banco1
   bsf PIE1,TMR2IE
;==================================================================================================
   ;Interrupciones
   bcf INTCON,GIE ;Deshabilitadas todas las interrupciones
   bsf INTCON,PEIE ;Habilitadas de IT perifericas
   bsf INTCON,INTE   ;Habilita IT externa en PORTB0
   ;Int_timer 0
   bsf INTCON,T0IE   ;Habilita IT del TMR0
   bsf INTCON,TMR0IE ;Interrupción de desbordamiento del Temporizador 0 habilitada
   bcf OPTION_REG,INTEDG   ;La interrupción externa en Rb0 se dispara por flanco de bajada.
;==================================================================================================
   ;Condiciones iniciales
   movlw b'00000000'        
   movwf STATUS   ;BSR=0 ubicación en el banco 0
   ;==========================================
   ;arranque
   bsf T2CON,TMR2ON ;arranca timer 2
   bsf INTCON,GIE ;arrancan ITs y TMR0
   ;==========================================
   ;Lazo principal
again     goto again
   ;==========================================
   ;Interrupción
   ;-----------------------------------------------------------------------------
INT   ;Pregunta por banderas de IT
    btfss INTCON,INTF
   goto a
   goto int_ext
a   btfss INTCON,T0IF   ;¿int timer 0?
   goto volver
   call ini_tabla
   movlw d'64'
   movwf aux1
tab   decfsz aux1,1
   goto mover   
   clrf cont_val
   goto volver
int_ext
   bcf PORTC,2
   bcf INTCON,INTF
   retfie
mover   incf cont_val,1
   pageselw tabla
   movf cont_val,w
   call tabla
   movwf CCPR1L
   goto tab
volver   bcf INTCON,T0IF
   retfie

;========= Inicia la TAbla o ACCESA============
ini_tabla
   movlw 0
   clrf cont_val
   return
;==============================================================
;Demoras
;--------------------------------------------------------------------------------------------------
   ;Tabla de valores de la onda!!!!
   
   org 0x600

tabla
   ADDWF PCL,1 ; W = offset
   RETLW 0X7F ; Empieza la tabla
   RETLW 0X8B ;
   RETLW 0X97 ;
   RETLW 0XA3 ;
   RETLW 0XAF ;
   RETLW 0XBA ;
   RETLW 0XC5 ;
   RETLW 0XCF ;
   RETLW 0XD8 ;
   RETLW 0XE1 ;
   RETLW 0XE8 ;
   RETLW 0XEF ;
   RETLW 0XF4 ;
   RETLW 0XF8 ;
   RETLW 0XFB ;
   RETLW 0XFD ;
   RETLW 0XFE ;
   RETLW 0XFD ;
   RETLW 0XFB ;
   RETLW 0XF8 ;
   RETLW 0XF4 ;
   RETLW 0XEF ;
   RETLW 0XE8 ;
   RETLW 0XE1 ;
   RETLW 0XD8 ;
   RETLW 0XCF ;
   RETLW 0XC5 ;
   RETLW 0XBA ;
   RETLW 0XAF ;
   RETLW 0XA3 ;
   RETLW 0X97 ;
   RETLW 0X8B ;
   RETLW 0X7F ;
   RETLW 0X72 ;
   RETLW 0X66 ;
   RETLW 0X5A ;
   RETLW 0X4E ;
   RETLW 0X43 ;
   RETLW 0X38 ;
   RETLW 0X2E ;
   RETLW 0X25 ;
   RETLW 0X1C ;
   RETLW 0X15 ;
   RETLW 0XE ;
   RETLW 0X9 ;
   RETLW 0X5 ;
   RETLW 0X2 ;
   RETLW 0X1 ;
   RETLW 0X0 ;
   RETLW 0X1 ;
   RETLW 0X2 ;
   RETLW 0X5 ;
   RETLW 0X9 ;
   RETLW 0XE ;
   RETLW 0X15 ;
   RETLW 0X1C ;
   RETLW 0X25 ;
   RETLW 0X2E ;
   RETLW 0X38 ;
   RETLW 0X43 ;
   RETLW 0X4E ;
   RETLW 0X5A ;
   RETLW 0X66 ;
   RETLW 0X72 ;
   RETLW 0X7E ;
;--------------------------------------------------------------------------------------------------

   end


Saludos, Pedro.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problemas con PWM e interrupcion externa en pic18f4550 al realizar una onda seno
« Respuesta #12 en: 01 de Agosto de 2013, 14:44:18 »
Bueno la interrupcion se produce por desborde de TMR0, hoy ya lo vi a la primera,debo tener un buen dia y estoy lucido  :lol: pero ya no sale de esa interrupcion porque nunca llega a ejecutar esta instruccion:

mover   incf cont_val,1
   pageselw tabla
   movf cont_val,w
   call tabla
   movwf CCPR1L
   goto tab
volver   bcf INTCON,T0IF
   retfie

Ni el reffie que esta a continuacion.

Esta continuamente yendo a la tabla va cogiendo valores correlativamente y cargandolos en "movwf CCPR1L" ¿Que es CCPR1L?.

¿Estas usando TMR0 o TMR2 para contar los tiempos? Aunque no cuentas tiempos porque entra en interrupcion de TMR0 a los 412,6uS (a 20MHz) y ya no cuenta ningun tiempo mas???

Yo pensaba que en esa tabla guardabas los OFFSET de desborde del TMR para contar esos tiempos pero parece que no???

Por otro lado le estado vueltas a esto:

Citar
Entonces calculo el tiempo en el que el timer debe recalcular el duty cycle de la salida.
Lla frecuencia de la seno es 60Hz por lo tanto:
el período es  ------>60 Hz = (1/60)seg = 16,67 ms

esto es lo que dura un período de la seno, como lo actualizamos cada 5,625 grados tendremos 64 niveles y cada uno durará:
Tiempo del timer ----> Tt = período / 64 = 16,67 / 64 = 260,468 Useg
Estos 260 Useg es cada cuanto debes recalcular el duty cycle del PWM.

En vez de actualizar cada 5,625 grados, como todos los PWMs de este tiempo van a tener el mismo DUTTY y por tanto el mismo nivel ¿Por que no haces un solo PWM de esa duracion y ese DUTTY?.

Creo que hay otra cosa que esta haciendo mal, tu calculas un ciclo 60 Hz = (1/60)seg = 16,67 ms pero esto no es asi, lo hay que calcular por semiciclos (8,33mS) ya que en cada semiciclo positivo tienes que hacer circular la corriente en una direccion y en el semiciclo negativo en direccion contraria, es decir por otros transistores activandolos con otra salida tambien con PWM ¿No???? ¿O estoy yo equivocado? que tampoco seria nada raro  :lol: :lol:

Desconectado pgvs25

  • PIC12
  • **
  • Mensajes: 58
Re: Problemas con PWM e interrupcion externa en pic18f4550 al realizar una onda seno
« Respuesta #13 en: 02 de Agosto de 2013, 05:20:39 »
Ahora que simule nuevamente en PROTEUS me doy cuenta que esta tomando a todo el PORTB como 1, no se si es solo el PROTEUS o en general, asi que se deberia preguntar por el flanco de bajada ya que ese es el que le estamos configurando para la interrupcion externa... creo que esta entrando directamente en la interrupcion externa y por eso nunca llega a la parte que tu me estas poniendo en el mensaje, no se si algo asi esta pasando realmente, lo pensaste o probaste asi??

Lo que me parece extraño es que vaya a la tabla y coja valores para cargarlo al CCPR1L ya que si entro en la interrupcion como es mi teoria anterior pues no deberia hacer este paso.... pues la respuesta de lo que es ese registro esta en las paginas web q me mandaste a leer pero mejor te copio la parte que te interesa jajajaja

-------------------------------------
Ciclo de Trabajo del PWM
El ciclo de Trabajo se especifica escribiendo un valor de 10 bits al registro CCPR1L (los 8 bits más significativos (msb)) y los dos bits menos significativos (lsb) a CCP1CON<5:4>.



Como se puede ver en la figura anterior, el valor que determina la duración de C.T. del PWM no es el cargado en CCPR1L, sino en CCPR1H, el cual sólo se actualiza en el momento en que TMR2 alcanza el valor de PR2 (es decir, cada vez que se completa un periodo). Por ello, aunque CCPR1L puede ser escrito en cualquier momento, el Ciclo de Trabajo solo se actualiza hasta que termina el periodo que está en transcurso.
No hay otra manera de escribir al registro CCPR1H, ya que este es un registro de sólo lectura.
----------------------------------------

Ahora si que me confundi jajajajaja... se supone que es el TMR2 el que cuenta el periodo, justamente por eso calculamos es PR2, pero no se porque estoy preguntando por el TMR0 jajajajajaja lo configuro el prescaler 1:8, y la int externa por flanco de bajada (bit6)... la interrupcin externa pues esa la utilizare luego, lo q no recuerdo es porque utilizo el tmr0, este es un programa que lo tenia un amigo en 18f4550 (no se si alguna ves lo probo), lo que yo hice es pasarle a la 16f871 con los mismos parametros con los que el habia programado. Ahora estoy preguntando al TMR2 ademas que movi algunas pequeñas configuraciones, como el preguntar por la interrupcion en el flanco de bajada ademas de limpiar el CCPR1L antes de empezar para empezar con un ciclo util de 0.

Lo que se pretende con la tabla es cambiar el ciclo de trabajo...

Con respecto a las salidas tambien pense igual que tu y por eso queria hacer con el pic18f4550 ya que ese tiene 2PWM ademas de algo q se llama un modulo ECCP o algo asi, es justamente para manejar puentes H, y se lo puede configurar en salida simple, medio puente o puente completo, no se si has leido algo al respecto... pero bueno por lo menos quiero que me salga la PWM aqui... a ver si por medio de hardware hago algo para manejar los transistores...

Ya con los cambios q realizo ahora ya me dio unos datos pero no se si me ayudas probando. Ahi te dejo el codigo:


   list p=16F871
   #include "p16f871.inc"

;Auxiliares
cont_val EQU 0x20
aux1 EQU 0X21
;====================
   org 0x00
       goto inicio
   org 0x04
       goto INT ;rutina de atencion a IT de baja prioridad
;==================================================================================================
;Configuarción de hardware y condiciones iniciales de variables
;--------------------------------------------------------------------------------------------------
inicio
;PORTC         
   bsf STATUS,RP0   ;Pasa al Banco1
    bcf TRISC,2       ;salida del PWM
;==================================================================================================
;Configuración  del periodo de PWM y del registro CCP1CON
   movlw b'00000000'        
   movwf STATUS   ;Banco 0
;   bcf STATUS,RPO ;Pasa al Banco 0
   movlw b'00111111'
   movwf CCP1CON; Configura en modo PWM
   movlw b'00100000'        
   movwf STATUS   ;Banco 1
;   bsf STATUS,RP0   ;Pasa al Banco1
   movlw d'81'
   movwf PR2 ;Frecuencia de PWM = 6KHz; PR2 = [(Fosc*Tpwm)/(Prescaler*4)]-1 = [(20E6*(1/6000))/(16*4)]-1= 51
;==================================================================================================
      ;Configuración del TIMER 0
;--------------------------------------------------------------------------------------------------
   ;TOverflow max apagado
   movlw b'00000010'  ;configura el prescaler 1:8, y la int por flanco de bajada (bit6)      
   movwf OPTION_REG
;==================================================================================================
      ;Configuración del TIMER 2
;--------------------------------------------------------------------------------------------------
   ;Timer 2: overflow max. apagado
   movlw b'00000000'        
   movwf STATUS   ;Banco 0
;   bcf STATUS,RPO ;Pasa al Banco 0
   movlw b'00000011' ; cargado con un pre-escaler de 16 y post-escaler de 1:1
   movwf T2CON
   movlw b'00100000'        
   movwf STATUS   ;Banco 1
;   bsf STATUS,RP0   ;Pasa al Banco1
   bsf PIE1,TMR2IE ;Habilita la interrupción al comparar TMR2 a PR2
;==================================================================================================
   ;Interrupciones
   bcf INTCON,GIE ;Deshabilitadas todas las interrupciones
   bsf INTCON,PEIE ;Habilitadas de IT perifericas
   bsf INTCON,INTE   ;Habilita IT externa en PORTB0
   ;Int_timer 0
   bsf INTCON,T0IE   ;Habilita IT del TMR0
   bsf INTCON,TMR0IE ;Interrupción de desbordamiento del Temporizador 0 habilitada
   bcf OPTION_REG,INTEDG   ;La interrupción externa en Rb0 se dispara por flanco de bajada.
;==================================================================================================
   ;Condiciones iniciales
   movlw b'00000000'        
   movwf STATUS   ;BSR=0 ubicación en el banco 0
   clrf CCPR1L ;Ciclo Util = 0
   ;==========================================
   ;arranque
   bsf T2CON,TMR2ON ;arranca timer 2
   bsf INTCON,GIE ;arrancan ITs y TMR0
   ;==========================================
   ;Lazo principal
again     goto again
   ;==========================================
   ;Interrupción
   ;-----------------------------------------------------------------------------
INT   ;Pregunta por banderas de IT
    btfsc INTCON,INTF
   goto a
   goto int_ext
a   btfss PIR1,TMR2IF   ;btfss INTCON,T0IF   ;¿int timer 0?
   goto volver
   call ini_tabla
   movlw d'64'
   movwf aux1
tab   decfsz aux1,1
   goto mover   
   clrf cont_val
   goto volver
int_ext
   bcf PORTC,2
   bcf INTCON,INTF
   retfie
mover   incf cont_val,1
   pageselw tabla
   movf cont_val,w
   call tabla
   movwf CCPR1L
   goto tab
volver   bcf PIR1,TMR2IF  ; bcf INTCON,T0IF  ;
   retfie

;========= Inicia la TAbla o ACCESA============
ini_tabla
   movlw 0
   clrf cont_val
   return
;==============================================================
;Demoras
;--------------------------------------------------------------------------------------------------
   ;Tabla de valores de la onda!!!!
   
   org 0x600

tabla
   ADDWF PCL,1 ; W = offset
   RETLW 0X7F ; Empieza la tabla
   RETLW 0X8B ;
   RETLW 0X97 ;
   RETLW 0XA3 ;
   RETLW 0XAF ;
   RETLW 0XBA ;
   RETLW 0XC5 ;
   RETLW 0XCF ;
   RETLW 0XD8 ;
   RETLW 0XE1 ;
   RETLW 0XE8 ;
   RETLW 0XEF ;
   RETLW 0XF4 ;
   RETLW 0XF8 ;
   RETLW 0XFB ;
   RETLW 0XFD ;
   RETLW 0XFE ;
   RETLW 0XFD ;
   RETLW 0XFB ;
   RETLW 0XF8 ;
   RETLW 0XF4 ;
   RETLW 0XEF ;
   RETLW 0XE8 ;
   RETLW 0XE1 ;
   RETLW 0XD8 ;
   RETLW 0XCF ;
   RETLW 0XC5 ;
   RETLW 0XBA ;
   RETLW 0XAF ;
   RETLW 0XA3 ;
   RETLW 0X97 ;
   RETLW 0X8B ;
   RETLW 0X7F ;
   RETLW 0X72 ;
   RETLW 0X66 ;
   RETLW 0X5A ;
   RETLW 0X4E ;
   RETLW 0X43 ;
   RETLW 0X38 ;
   RETLW 0X2E ;
   RETLW 0X25 ;
   RETLW 0X1C ;
   RETLW 0X15 ;
   RETLW 0XE ;
   RETLW 0X9 ;
   RETLW 0X5 ;
   RETLW 0X2 ;
   RETLW 0X1 ;
   RETLW 0X0 ;
   RETLW 0X1 ;
   RETLW 0X2 ;
   RETLW 0X5 ;
   RETLW 0X9 ;
   RETLW 0XE ;
   RETLW 0X15 ;
   RETLW 0X1C ;
   RETLW 0X25 ;
   RETLW 0X2E ;
   RETLW 0X38 ;
   RETLW 0X43 ;
   RETLW 0X4E ;
   RETLW 0X5A ;
   RETLW 0X66 ;
   RETLW 0X72 ;
   RETLW 0X7E ;
;--------------------------------------------------------------------------------------------------

   end



Saludos, Pedro
« Última modificación: 02 de Agosto de 2013, 10:51:47 por pgvs25 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problemas con PWM e interrupcion externa en pic18f4550 al realizar una onda seno
« Respuesta #14 en: 02 de Agosto de 2013, 13:14:45 »
Citar
Ahora que simule nuevamente en PROTEUS me doy cuenta que esta tomando a todo el PORTB como 1, no se si es solo el PROTEUS o en general, asi que se deberia preguntar por el flanco de bajada ya que ese es el que le estamos configurando para la interrupcion externa... creo que esta entrando directamente en la interrupcion externa y por eso nunca llega a la parte que tu me estas poniendo en el mensaje, no se si algo asi esta pasando realmente, lo pensaste o probaste asi??

No, la unica interrupcion que veo que entra es TMR0 y como no borras ese flag no sale de ella. Para que entrara esa interrupcion tendria que haber cambio de estado y no lo hay.

Citar
Lo que me parece extraño es que vaya a la tabla y coja valores para cargarlo al CCPR1L ya que si entro en la interrupcion como es mi teoria anterior pues no deberia hacer este paso.... pues la respuesta de lo que es ese registro esta en las paginas web q me mandaste a leer pero mejor te copio la parte que te interesa jajajaja

Ahora va a la tabla al cabo de 1.0568mS y carga los valores en CCPR1L, que seguramente esta bien??? porque segun dice aqui, pero mirate en los ejemplos de Suki, seguro que tiene un ejemplo practico de aplicacion. Hace muy poco estuvimos aqui mismo peleando con esto, a ver si te lo busco.

Citar
Como se puede ver en la figura anterior, el valor que determina la duración de C.T. del PWM no es el cargado en CCPR1L, sino en CCPR1H, el cual sólo se actualiza en el momento en que TMR2 alcanza el valor de PR2 (es decir, cada vez que se completa un periodo).

Pero esta interrupcion nunca se activa, porque el CCPR1H no se actualiza esta siempre a 0,TMR2 debe estar en un preescaler y postscaler muy alto (imposible para generar 6KHz) en cambio TMR0 corre de la hostia  :lol: pero como borras el flag no sale de interrupcion???.

Yo es que el modulo CCP no lo suelo usar, prefiero hacer los PWM a "mano" porque en trifasica tengo que generar 6 PWM y hay que irse a PIC de gama alta que los tengan.

Mirate bien como trabaja TMR2 y como se configura el modulo CCP, porque en esto es donde esta el principal problema, despues o mañana si tengo un rato te busco un hilo en el que hace poco estuvimos peleando con esto mismo, la verdad como lo uso tan poco no recuerdo como va.