TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: akira_ve en 01 de Febrero de 2023, 01:28:33

Título: No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 01 de Febrero de 2023, 01:28:33
Hola amigos escribi un programa para un 16F877A para generar uma onda senoidal de 60 Hz con el modulo CCP, el Pic  corre a 20Mhz pero no completa todo el PWM el modulo esta como PWM con un pre scaler en 4 si lo configuro para que el pre scaner con valor 1 funciona bien les envio el codigo..........coloque como comentario ciertas partes del programa que de momento no importaban a mi parecer, lo quiero con el pre scaler con valor 4 pues asi tengo tiempo para cargar los valores de la tabla gracias de antemano

   list p=16f877a
   include "p16f877a.inc"

   CBLOCK 0X20
   Cuenta1, Cuenta2, ANGULO
   ENDC
 
   ORG   0
   GOTO   INICIO

Tabla_P:
    ADDWF   PCL,F

    DT      .0,     .3,     .6,     .9,  .13,  .16,  .19,   .22,  .25,  .28,.31,.34,.37,.40,.43,.46,.48,.51,  .54,  .56,  .59,  .62,   .64,  .67,  .69
    DT     .71,  .73,  .76,   .78,  .80,  .82,  .84,   .85,  .87,  .89,.90,.92,.93,.94,.96,.97,.98,.99,.100,.100,.101,.102,.102,.102,.103
   DT   .103,.103,.103,.103,.103,.102,.102,.102,.101,.100,.99,.99,.98,.97,.95,.94,.93,.92,  .90,  .89,  .87,  .85,   .83,  .81,  .79
   DT     .77,   .75,  .73,  .71,  .69,  .66,  .64,   .61,  .59,  .56,.53,.51,.48,.45,.42,.39,.36,.34,  .31,  .28,  .24,  .21,   .18,  .15,   .12
    DT       .9,     .6,     .3

INICIO
   BSF   STATUS,RP0
   CLRF   TRISC               ; SALIDA
   MOVLW D'103'                ;
   MOVWF   PR2
   bcf      STATUS,RP0
   bcf      T2CON,1             ; Prescaler en 4
   bsf      T2CON,0
   BCF   CCP1CON,5          ;
   bcf      CCP1CON,4          ;
   bsf      CCP1CON,3            ; 1100 PWM
   bsf      CCP1CON,2
   bcf      CCP1CON,1
   bsf      CCP1CON,0
   clrf      PORTC
   clrf      ANGULO
   bsf      T2CON,2            ; TMR2 ON

START
   BTFSS   PIR1,TMR2IF
   GOTO   START
   ;MOVF   CCP1CON,W         ; 0010 1100
   ;ANDLW   B'00001100'            ; 0000 1100
   ;MOVWF   Cuenta2
   ;MOVLW D'10'
   MOVF   Tabla_P,W    
   MOVWF   CCPR1L
   ;MOVWF   cuenta1            ; 11000000
   ;RRF   Cuenta1,F
   ;RRF   Cuenta1,F; 00110000
   ;MOVF   Cuenta1,W
   ;ADDWF   cuenta2,F;
   ;MOVF   Cuenta2,W
   ;MOVWF   CCP1CON

   movlw    D'104'
   xorwf    ANGULO,W
   btfsc    STATUS,Z
   clrf      ANGULO
   movf    ANGULO,W
   call       Tabla_P
   movwf   CCPR1L
   incf    ANGULO,F
   bcf       PIR1,TMR2IF

   GOTO   START
   END
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 02 de Febrero de 2023, 22:33:29
la precuencia del PIC son 20 Mhz
la frecuencia del PWM es 120000, pues los valores son periodicos osea cada mediociclo es igual al otro por lo tanto no son 60 Hz son 120
t asumi 100 valores por cada semi ciclo por lo tanto la frecuencia del PWM son 120Khz
uso el pre scaler con valor 4 por lo tanto el PR2 Vale 103
hago una tabla dode cada valor varia un equivalente del valoe del seno de 1,75 grados 103 valores pero al simularlo en PWM resultante es Discontinuo pero si el pre scaler vale 1 es continuo........necesito que sea prescaler de valor 4 pues quiero hacer que esta onda senoidal resultante se soncronice con los 60 Hz de la red pues esto es para hacer un inverson de un UPS
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 02 de Febrero de 2023, 22:34:52
Pedon la Frecuencia del PWM es de 12 Khz
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: DominusDRR en 03 de Febrero de 2023, 12:12:48
Hola amigos escribi un programa para un 16F877A para generar uma onda senoidal de 60 Hz con el modulo CCP, el Pic  corre a 20Mhz pero no completa todo el PWM el modulo esta como PWM con un pre scaler en 4 si lo configuro para que el pre scaner con valor 1 funciona bien les envio el codigo..........coloque como comentario ciertas partes del programa que de momento no importaban a mi parecer, lo quiero con el pre scaler con valor 4 pues asi tengo tiempo para cargar los valores de la tabla gracias de antemano

   list p=16f877a
   include "p16f877a.inc"

   CBLOCK 0X20
   Cuenta1, Cuenta2, ANGULO
   ENDC
 
   ORG   0
   GOTO   INICIO

Tabla_P:
    ADDWF   PCL,F

    DT      .0,     .3,     .6,     .9,  .13,  .16,  .19,   .22,  .25,  .28,.31,.34,.37,.40,.43,.46,.48,.51,  .54,  .56,  .59,  .62,   .64,  .67,  .69
    DT     .71,  .73,  .76,   .78,  .80,  .82,  .84,   .85,  .87,  .89,.90,.92,.93,.94,.96,.97,.98,.99,.100,.100,.101,.102,.102,.102,.103
   DT   .103,.103,.103,.103,.103,.102,.102,.102,.101,.100,.99,.99,.98,.97,.95,.94,.93,.92,  .90,  .89,  .87,  .85,   .83,  .81,  .79
   DT     .77,   .75,  .73,  .71,  .69,  .66,  .64,   .61,  .59,  .56,.53,.51,.48,.45,.42,.39,.36,.34,  .31,  .28,  .24,  .21,   .18,  .15,   .12
    DT       .9,     .6,     .3

INICIO
   BSF   STATUS,RP0
   CLRF   TRISC               ; SALIDA
   MOVLW D'103'                ;
   MOVWF   PR2
   bcf      STATUS,RP0
   bcf      T2CON,1             ; Prescaler en 4
   bsf      T2CON,0
   BCF   CCP1CON,5          ;
   bcf      CCP1CON,4          ;
   bsf      CCP1CON,3            ; 1100 PWM
   bsf      CCP1CON,2
   bcf      CCP1CON,1
   bsf      CCP1CON,0
   clrf      PORTC
   clrf      ANGULO
   bsf      T2CON,2            ; TMR2 ON

START
   BTFSS   PIR1,TMR2IF
   GOTO   START
   ;MOVF   CCP1CON,W         ; 0010 1100
   ;ANDLW   B'00001100'            ; 0000 1100
   ;MOVWF   Cuenta2
   ;MOVLW D'10'
   MOVF   Tabla_P,W    
   MOVWF   CCPR1L
   ;MOVWF   cuenta1            ; 11000000
   ;RRF   Cuenta1,F
   ;RRF   Cuenta1,F; 00110000
   ;MOVF   Cuenta1,W
   ;ADDWF   cuenta2,F;
   ;MOVF   Cuenta2,W
   ;MOVWF   CCP1CON

   movlw    D'104'
   xorwf    ANGULO,W
   btfsc    STATUS,Z
   clrf      ANGULO
   movf    ANGULO,W
   call       Tabla_P
   movwf   CCPR1L
   incf    ANGULO,F
   bcf       PIR1,TMR2IF

   GOTO   START
   END

Pídele a la IA que te ayude, explícale paso a paso las cosas que has hecho, es posible que llegue a darte una ayuda:

(https://pbs.twimg.com/media/FoDR88VWQAA3blV?format=png&name=900x900)
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 03 de Febrero de 2023, 13:14:03
No respodio algo que no sepa.....................ayer cree una hoja de calculo con exel  para calcular los valores de PR2 y los valores de  CCPR1L: CCP1CON y me di cuenta que los valores de CCPR1L: CCP1CON eran erroneo hoy corrijo eso y les aviso
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: DominusDRR en 03 de Febrero de 2023, 13:18:57
No respodio algo que no sepa.....................ayer cree una hoja de calculo con exel  para calcular los valores de PR2 y los valores de  CCPR1L: CCP1CON y me di cuenta que los valores de CCPR1L: CCP1CON eran erroneo hoy corrijo eso y les aviso

Obviamente no lo sabe, es una herramienta de búsqueda y ayuda bastante a crear código sin necesidad de romper mucho la cabeza. Obviamente no es perfecta, pero te guía en lo que deseas hacer.
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: Eduardo2 en 03 de Febrero de 2023, 14:44:42
No es la causa del problema, pero el último valor de la tabla es Tabla_P[102] , por lo que cuando va a leer el 103 termina saltando al comienzo del programa sin ejecutar el retlw --> stack overflow después de 9 iteraciones (tiene 8 niveles).
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 03 de Febrero de 2023, 15:51:38
a ok el final de la tabla esta mal???....................como deberia ser???
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 03 de Febrero de 2023, 15:56:08
hoy hice una hpja de calculo y todo loos calculos se hicieron automaticamente..............y fue que me di cuenta pues se generaba todos los valores a cargarse en los registros y me di cuenta que los valores no eran los correctos solo PR2 era correcto............pero  CCPR1L: CCP1CON no eran corectos y los tiempos no cuadran nunca............por eso di por sentado que es la rason.............pero lo qwue dices es valido........por eso te pregunto como seria eso lo de la tabla.......
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: Eduardo2 en 03 de Febrero de 2023, 16:36:38

Código: [Seleccionar]
..............
   movlw    D'103'
   xorwf    ANGULO,W
   btfsc    STATUS,Z
   clrf      ANGULO
..............
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 03 de Febrero de 2023, 17:29:28
a ok entiendo................gracias un detalle que se me paso...............probare y aviso
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 06 de Febrero de 2023, 01:44:21
Buenas noches recien fue que logre ponerme a  res escruibir el programa y ahora si logra funcionar continuamente pero en la simulacion no veo la señal tipica del PWM de la onda Senoidal solo veo una PWM desordenada pero es un progreso pues la dodulacion es desordenada pero continua seguire revisando abajo pego el programa corregido.......re scribi la carga de  CCPR1L: CCP1CON y el valoe de PR2 segun los valores calculador

    list p=16f877a
   include "p16f877a.inc"

   CBLOCK 0X20
   Cuenta1, Cuenta2, ANGULO
   ENDC
 
   ORG   0
   GOTO   INICIO

Tabla_P:
    ADDWF   PCL,F

    DT      .52, .55, .58, .61, .64, .67, .70, .73, .76, .79, .82, .84, .86,.89,.91,.93,.95,.97,.98,.99
    DT      .101,.102,.102,.103,.104,.104,.104,.104,.104,.103,.102,.102,.101,.99,.98,.97,.95,.93,.91,.89
   DT      .86, .84, .82, .79, .76, .73, .70, .67, .64, .61, .58, .55, .52,.49,.46,.43,.40,.37,.34,.31
   DT      .28, .25, .22, .20, .18, .15, .13, .11,  .9,  .7,  .6,  .5,  .3, .2, .2, .1, .0, .0, .0, .0
    DT       .0,  .1,  .2,  .2,  .3,  .5,  .6,  .7,  .9, .11, .13, .15, .18,.20,.22,.25,.28,.31,.34,.37
   DT     .40, .43, .46, .49, .52   

INICIO
   BSF   STATUS,RP0
   clrf      TRISC               ; SALIDA
   MOVLW .25                ;
   MOVWF   PR2
   bcf      STATUS,RP0
   bsf      T2CON,1             ; Prescaler en 16
   bsf      T2CON,0
   bsf      CCP1CON,3            ; 1100 PWM
   bsf      CCP1CON,2
   bcf      CCP1CON,1
   bsf      CCP1CON,0
   clrf      PORTC
   clrf      ANGULO
   bsf      T2CON,2            ; TMR2 ON

START
   BTFSS   PIR1,TMR2IF
   GOTO   START   
   movlw    D'104'
   xorwf    ANGULO,W
   btfsc    STATUS,Z
   clrf      ANGULO
   movf    ANGULO,W
   call       Tabla_P
   MOVWF   Cuenta1            ; 11000000
   RRF   Cuenta1,F
   btfsc   STATUS,C
   goto   Uno
   bcf      CCP1CON,4

VolverY
   RRF   Cuenta1,F
   btfsc   STATUS,C
   goto   Dos
   bcf      CCP1CON,5

VolverX
   MOVF   Cuenta1,W    
   MOVWF   CCPR1L
   incf    ANGULO,F
   bcf       PIR1,TMR2IF
   GOTO   START

Uno:
   bsf      CCP1CON,4
   goto   VolverY

Dos:
   bsf      CCP1CON,5
   goto   VolverX
   
   END
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: DominusDRR en 06 de Febrero de 2023, 08:34:32
Me imagino que estás utilizando un filtro para eliminar la componente de alta frecuencia de la señal ¿Verdad?

Tal vez deberías compartir el esquemático.
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: nbc en 06 de Febrero de 2023, 15:17:51
debes poner un filtro rc , lo ideal seria lc , para integrar la señal y poder ver la onda senoidal
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: Eduardo2 en 07 de Febrero de 2023, 14:17:54
.... logra funcionar continuamente pero en la simulacion no veo la señal tipica del PWM de la onda Senoidal solo veo una PWM desordenada pero es un progreso pues la dodulacion es desordenada

En
Código: [Seleccionar]
VolverY
RRF Cuenta1,F
btfsc STATUS,C
goto Dos
bcf CCP1CON,5
te olvidaste que con RRF el carry va a parar al bit7 de Cuenta1  --> te hace percha Cuenta1
el resultado es pseudoaleatorio, algunas no pasaba nada porque el carry estaba en 0 pero en otras si.

Debió ser
Código: [Seleccionar]
VolverY
   bcf      STATUS,C
   RRF      Cuenta1,F
   btfsc    STATUS,C
   goto     Dos
   bcf      CCP1CON,5

Antes tambien usaste RRF , pero ligaste porque ahi siempre llegabas con carry=0
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 07 de Febrero de 2023, 18:07:04
Si amigo tienes rasib debo Hacer el Carry Cero para el otro Ciclo pues se modifica el dato...................amigo gracias...............con respecto al filtro puedes usar un simple filtro RC para eso hay una ley experimental que dice que se puede usar un filtro cuya frecuencia de corte sea 10 o 100 veces la frecuencia del PWM usar un filtro pasa bajos por lo minimo pues lo que me importa es que e haga bien el PWM luego hacer un filtro que deje poco armonicos es allgo mas sensillo
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 17 de Febrero de 2023, 23:07:20
hola amigo le emviera lo que he hecho hasta ahora..........use un pic con una frecuencia de 10 MHz
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 18 de Febrero de 2023, 23:40:53
Hola amigos buenas noches logre resolver la modulacion de manera continua, usando interrupciones, pues sin el uso de interrupciones se generan retardos del orden de los milisegundos, con el uso de interrupciones todo funciona muy bien, cree una table de datosy no funciona a continuacion les muestro el codigo

List   p=16F877A      ;Tipo de procesador
   include   "P16F877A.INC"   ;Definiciones de registros internos

   __config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC

   CBLOCK 0x20
    Periodo, Duty,Temp
    ENDC

   org      0x00
   goto   Inicio   
   org      0x04
   goto   Int

Int
   movlw    .51
   xorwf    Duty,W
   btfsc    STATUS,Z
   clrf       Duty
   MOVLW   0x06         ; Memoria de programa p gina 0 subpagina 6
   MOVWF   PCLATH      ; Carga el PCLATH para el salto en memoria
   movfw   Duty         ; Carga el offset en W
   ;call      PWM_H      ; Busca la correci¢n del  ngulo   
   movwf   CCPR1L      ; µngulo corregido a usar
   incf      Duty,F
   bcf      PIR1,TMR2IF
   retfie   

Inicio      
   clrf      PORTC         ;  Borra salidas
   bsf      STATUS,RP0   ;  Selecciona banco 1
   clrf      TRISC         ;  RC2 salida
   movlw   .49
   movwf   PR2         ;  Carga el registro de periodos
   movlw   b'11000000'
   movwf   INTCON
   movlw   b'00000010'
   movwf   PIE1
   bcf      STATUS,RP0   ;  Selecciona banco 0   
   movlw   b'00111100'
   movwf   CCP1CON
   movlw   b'00000110'
   movwf   T2CON         ;  T2 en On
   movlw   .28
   movwf   CCPR1L      ;  Carga la anchura del pulso
   clrf      Duty
   
Loop      
   nop
   goto   Loop         ;  Bucle infinito      

   ORG   600h         ; i nicio de la tabla en 0600h= P gina 0, subpagina 6
PWM_H
   addwf    PCL,F

   DT   0x1a,0x1d,0x20,0x23,0x26,0x28,0x2b,0x2d,0x2f,0x30,0x32,0x32,0x33,0x33,0x33,0x32,0x31,0x30,0x2e,0x2c
   DT   0x29,0x27,0x24,0x21,0x1e,0x1b,0x18,0x15,0x12,0xf,0xc,0xa,0x7,0x5,0x3,0x2,0x1,0x0,0x0,0x0
   DT   0x1,0x1,0x3,0x4,0x6,0x8,0xb,0xd,0x10,0x13,0x16,0x1a

   end            ;  Fin del programa fuente

si elimino el uso de la table modula funciona bien la table la genere con la siguiente direccion

https://daycounter.com/Calculators/Sine-Generator-Calculator.phtml

Use como maxima amplitus 51 al igual que el numero de puntos...........espero me ayuden pues solo falta resolver eso y se podria generar ondas senoidal con el PWM y asi no usar el DAC para generar las señal abaratando el diseño.........luego pienso crear una rutina que permita sincronisar este pwm con la red ac......................asi se podria hacer UPS esta idea la tomo de los ups de la marca APC que usa un microcontrolador INTEL para generar la señal senoidal pero con un DAC y con este sincronizan tambien el inversor con la red AC.....................si alguien tiene una idea puede comentarlo asi podriamos hace UPS ON LINE y OFF LINE
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: DominusDRR en 19 de Febrero de 2023, 11:11:42
AC.....................si alguien tiene una idea puede comentarlo así podríamos hace UPS ON LINE y OFF LINE

Si tu idea es algo didáctico o para un proyecto estudiantil, está bien. Pero comercialmente, tal sea más barato y más rentable comprar y revender UPS, al menos que tengas el dinero suficiente para montarte tu empresa y competir con otro fabricantes locales y extranjeros.

También debes considerar que no todo UPS genera o sintetiza una onda sinusoidal. Aquellos que son económicos sólo generan una onda cuadrada en base a un circuito similar a este.

(https://www.elprocus.com/wp-content/uploads/Inverter-Circuit-Diagram.jpg)


Si quieres indagar más en el tema, Texas Instruments tiene guías de desarrollo para productos comerciales, por ejemplo para un UPS simple tienes este enlace:

https://www.ti.com/solution/single-phase-online-ups#tech-docs (https://www.ti.com/solution/single-phase-online-ups#tech-docs)

Son de buena referencia para crear un producto comercial, no necesariamente con dispositivos de TI, debes tomarlo como una referencia.

MCHP también tiene guías de desarrollo de productos:

https://www.microchip.com/en-us/development-tool/Digital-Pure-Sine-Wave-UPS (https://www.microchip.com/en-us/development-tool/Digital-Pure-Sine-Wave-UPS)



Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 19 de Febrero de 2023, 15:39:42
 No deberías utilizar la interrupción del timer2 para actualizar el ciclo de trabajo. Te recomiendo que uses otro timer como el timer 0. De hecho así puedes usar un PWM con frecuencia mayor, así la frecuencia del PWM es independiente del periodo de la señal seno que quieres generar. En tu caso configuras el timer0 para la frecuencia de 60 x 51 = 3060.
Así como lo tienes solo funciona para valores mayores a 28 de ciclo de trabajo, porque el timer 2 sigue avanzando desde que ocurre la interrupción y mientras se procesa la interrupción, y si refrescas con un valor de ciclo de trabajo menor a 28, no se produce el cambio de valor de la señal pwm.

Saludos.
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 19 de Febrero de 2023, 15:52:06
amigo soy ua persona que me gusta conocer las cosas, pues soy curioso, no soy de dar las cosas por sentadas, me gusta entenderlas hasta donde sea posible, hace muchos años yo me puse a averiguar si sepodia crear una comparador de voltaje que reemplazara a un amplificador operacional mediante  un pic............aqui tambien cuestionaron eso..................amigo ha habido gente que han hecho cosas asi.....................alguien una vez diseño un pelador de papas con una laser, la red wifi es lo que es gracias a 2 personas, una actris que tenia un amigo musico y adapto la idea de la pianola para que un sistema de radio cambiara de frecuencia en canales fijos pero de manera aleatoria, y un cientifico que desarrolloaba un algoritmo para deteccion de cuerpos celestes en radio astronomia la idea no funciono pero dicho algoritmo es importante para que se detecten los puntos en una red inalambrica.................y asi la lista sigue y sugue, ideas que consideraban absurdas, y resulta que esa absurda idea fue importante para resolver otra, alguien dijo....................si una idea no es ansurda.............dudo que dure ,ucho.......................no subestimo ninguna idea concepto pues dentro de todo eso hay algo que puede ser una joya oculta............por eso trabajo en esta idea pues senti curiocidad y ademas permite perfeccionar mis habilidades en programacion de hecho estoy trabajando en algo mas para lograr mas velocidad y su hay dados que se repiten tomar en cuenta esto asi no usar mucho la tabla.......................osea estoy planteando ideas que antes no habia pensado.........de todas maneras te agradesto las direcciones que me ofreces gracias
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 19 de Febrero de 2023, 15:59:15
es mas en internet consegui a alguien que logro hacer que un pic 16f84a se pueda conectar a un puerto usb, otro que por medio de procesador propeller operar el cabeza de una impresora epson, hizo una ingenieria revesa del cabezal y esarrollo toda la logica de control............................un ing realizo una ingenieria reversa sobre FPGA...................y esto desato furor pues ahora podemos programarlos de manera mas sensilla sin las atadurs de ciertos fabricantes de FPGA
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 19 de Febrero de 2023, 16:03:36
Amigo  uZYNQ casual mente consegui recien una trabajo de ua persona que hacia uno muy basico pero usando el moduloCCP1 pero como comparador y justo me di cuenta de lo que dices..................solo que no logro entender bien como hacer PWM asi............por fa me lo puedes explicar,,,,,,????
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 19 de Febrero de 2023, 16:15:56
 Solo eso, tu puedes generar una frecuencia mayor de tu pwm (20KHz por ejemplo) modificando el prescaler y dejando igual el 51 como amplitud (PR2). Luego tienes que configurar tu timer 0 para que genere la interrupción a la frecuencia de 3K, y en la rutina de interrupción barres la tabla con los valores de ciclo de trabajo como lo tienes. de hecho si luego modificas la frecuencia del timer 0 puedes cambiar la frecuencia de la onda seno (dentro de cierto rango).
 
 Yo lo hice para una frecuencia de 25Khz de PWM, y con un valor de amplitud de 200, para tener mayor resolución.

Saludos
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 19 de Febrero de 2023, 18:40:46
Si amigo entiendo tu punto pero el detalle de hacer el T_ON y el T_OFF el TIMER haria el T_ON pero el resto del tie,po para completar el PWM como lo hago pues si varia el total del tiempo estoy variando la frecuencia y no el ciclo de trabajo, pues se necesita el T_ON, un T_OFF para conservar ese tiempo total
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 19 de Febrero de 2023, 19:12:29
El timer0 es para refrescar el ciclo de trabajo, ya el pwm se encarga de los tiempos ON y OFF.
 Así como esta tu código debería funcionar pero hay un problema con el refrescamiento de ciclo de trabajo. Una solución es utilizar el postcaler para generar la interrupción por cada 4 del timer y para compensar puedes configurar un prescaler de 4 del timer.

 Prueba configurando el timer con este valor:
Código: [Seleccionar]
      movlw   b'00011101'
      movwf   T2CON         

Solo modificando eso vas a ver el resfrecamiento correctamente. pero sigues atado a la frecuencia del timer2. Utilizando el timer0 puedes hacer ese refrescamiento de forma independiente y por lo tanto puedes generar la onda seno con otra frecuencia.

Saludos.
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 19 de Febrero de 2023, 19:39:21
  Así tu frecuencia de pwm queda en 12500 y la frecuencia de la interrupción para el ciclo de trabajo de 3125 que divido por 51 te quedan los 60 hz aproximadamente.
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 19 de Febrero de 2023, 21:23:14
a ok.......dejame ver si entendi.....dejo activo el Timer0 generando una interrupcion solamanete para refrescar el CCP1........por cada  4 interrupciones del PWM del CCP1 se genera una del Timer0.............es asi???
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 19 de Febrero de 2023, 21:31:14

 Prueba primero con el cambio del timer 2. (esa es una opción)

Citar
      movlw   b'00011101'
      movwf   T2CON
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 22 de Febrero de 2023, 09:19:08
Buenos das.............amigo  uZYNQ anoche probe loque me aconsejaste y vaya si funciono, pocedi a ajustar todo para  que el PWM diera 16 mS, baje el postcaler de 4 a 2 reajuste el prescaler y el PR2 quedando el postscaler en 2 el prescaler en 4 y el PR2 en 78 con los 2 bit bajos en 11 y dio jstamente los 16,6 mS amoche mismo obtune la table de valores para la onda senoidal, hoy la convierto para tener las 2 tablas prar que sea carhada, si mas no me equivoco son 234 valores que debo modificar al hacer todo aviso de los resultados  gracias por tu consejo
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: uZYNQ en 22 de Febrero de 2023, 10:41:29
 Con un prescaler de 4 y postcaler de 2, PR2=51, 100 puntos de amplitud 51. Onda seno de 60Hz. Pero si quieres variar la frecuencia de la onda seno debes utilizar otro timer.

Código: [Seleccionar]
;====================================================================
; Processor: PIC16F877A
; Compiler:  MPASM
;====================================================================

;====================================================================
; DEFINITIONS
;====================================================================

#include p16f877a.inc                ; Include register definition file

;====================================================================
; VARIABLES
;====================================================================
    CBLOCK 0x20
    Periodo, Duty,Temp
    ENDC

;====================================================================
; RESET and INTERRUPT VECTORS
;====================================================================

      ; Reset Vector
RST   code  0x0
      goto  Start
INT   code 0x04
      movlw    .100
      xorwf    Duty,W
      btfsc    STATUS,Z
      clrf       Duty
      MOVLW   0x06         ; Memoria de programa p gina 0 subpagina 6
      MOVWF   PCLATH      ; Carga el PCLATH para el salto en memoria
      movfw   Duty         ; Carga el offset en W
      call      PWM_H      ; Busca la correci¢n del  ngulo   
      movwf   CCPR1L      ; µngulo corregido a usar
      incf      Duty,F
      bcf      PIR1,TMR2IF
      retfie   
     

;====================================================================
; CODE SEGMENT
;====================================================================

PGM   code
Start
      ; Write your code here
      clrf      PORTC         ;  Borra salidas
      bsf      STATUS,RP0   ;  Selecciona banco 1
      clrf      TRISC         ;  RC2 salida
      movlw   .51
      movwf   PR2         ;  Carga el registro de periodos
      movlw   b'11000000'
      movwf   INTCON
      movlw   b'00000010'
      movwf   PIE1
      bcf      STATUS,RP0   ;  Selecciona banco 0   
      movlw   b'00001100'
      movwf   CCP1CON
      movlw   b'00001101'
      movwf   T2CON         ;  T2 en On
      movlw   .28
      movwf   CCPR1L      ;  Carga la anchura del pulso
      clrf      Duty
     
Loop 
      goto  Loop
      code 0x600
PWM_H
   addwf    PCL,F
   
   DT 0x1a,0x1b,0x1d,0x1e,0x20,0x21,0x23,0x24,0x26,0x27,0x28,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x31,0x32,0x32,0x33,0x33,0x33
   DT 0x33,0x33,0x33,0x33,0x32,0x32,0x31,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x28,0x27,0x26,0x24,0x23,0x21,0x20,0x1e,0x1d,0x1b
   DT 0x1a,0x18,0x16,0x15,0x13,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x2,0x1,0x1,0x0,0x0,0x0
   DT 0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xb,0xc,0xd,0xf,0x10,0x12,0x13,0x15,0x16,0x18   
   
   ;====================================================================
      END


Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 22 de Febrero de 2023, 13:02:52
realise mediciones de tiempo y todo el ciclo completo era de 20mS pues use un simple circuto RC y con este medi el tiepo totan del ciclo completo del PWM, por lo tanto varie hasta lograr esos valores que te dije...................pues reciuerda que al usar el postscaler despues de repetir los cambios de salida 2 veces habra el cambio de estado de la salida........por eso debo cambiar los valores................pero en la simulacion es evidente la estabilidad............
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 25 de Febrero de 2023, 12:54:55
buenos dias amigos logre hacer funcionar el PWM de manea correcta, la solucion es usar las tablas con lo valores para ser cargador en el CCP1 en modo PWM genere 2 tablas cosa que es algo engorroso por que debo generr una table para el  CCPR1L y otra para el CCP1CON
 es engorroso por que en la tabla para el CCP1CON debo incluir la configuracion para que funcione en modo PWM por lo tanto cara ensayo implica una table nueva para generar la onda senoidal, y lo resolvi de una manera simple cree 2 tablas que hacen un PWM lineal y se optiene algo parecido a un diente de sierra lo importante es que la señal debe ser continua, el resultado era unaa señal a veces inestable, elimine el POSTCALER y listo la salida es establey menos ruidopues el POSTCALER introducia un ruido por el retraso que genera, con esto hecho hice la table para la configuracion mas optima y salio una onda senoidal bien..........

use un simple circuito RC como fultro pero les pregunto que configuracion debo usar para obtener la señal senoidal? he visto que al parecer usan la configuracion Sallen-Key, espero me ayuden luego les paso el codigo y les explico algunos detalles que aprend con esta experiencia

luego entrare a otro tema interesante, es crear algo parecido a un PLL para que? para sincronizar la salida de la señal senoidal con la red eletrica, tengo una una idea que no logro cuadrar y es generar un pulso que indique el comienzo de la onda y un pulso que indique al ciclo positivo de la onda de la red, pero...........la que llegue primero arrancara un TMRX, en espera que aparesca la otra señal, cuando aparesca usara ese conteo para correr la fase dell programa del PWM para sincronizarce..................de momento recomiendenme que filtro uso en la salida del PWM, he logrado un PWM con una frecuencia cercana a los 18 Khz...................les pido las gracias por la colaboracion en su momento subire el codigo
Título: Re:No logro generar el PWM para generar onda senoidal
Publicado por: akira_ve en 02 de Marzo de 2023, 19:24:02
Buenas tarde amigo logre generar la señasl aqui les paso el codigo gra cias al amigo uZYNQ por el consejo la señal sale bien limpia y estable le puse un pin con que pueden sacactivar la generacion de la señal pienso hacer otras mejoras, pense en otra opcion de usar el modo comparador del CCP1 que es mucho mas flexible, para explorar mas funcionalidades les envio imagen de la simulacion gracias por la ayuda

   List   p=16F877A            ;Tipo de procesador
   include   "P16F877A.INC"      ;Definiciones de registros internos

      __config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC

   CBLOCK    0x20
   Ciclo,Reg_H,Reg_L
    ENDC

   Periodo   org   .65
   Tope   org   .156

   org      0x00
   goto      Inicio   
   org      0x04
   goto      Int

Int
   movfw   Reg_H
   movwf   CCPR1L
   movfw   Reg_L
   movwf   CCP1CON
      movlw   Tope
   xorwf   Ciclo,W
      btfsc   STATUS,Z
      clrf    Ciclo
      MOVLW   0x06            ; Memoria de programa p gina 0 subpagina 6
      MOVWF   PCLATH         ; Carga el PCLATH para el salto en memoria
      movfw   Ciclo            ; Carga el offset en W
      call    PWM_H            ; Busca la correci¢n del  ngulo   
      movwf   Reg_H            ; µngulo corregido a usar
   MOVLW   0x07            ; Memoria de programa p gina 0 subpagina 6
      MOVWF   PCLATH         ; Carga el PCLATH para el salto en memoria
      movfw   Ciclo            ; Carga el offset en W
      call     PWM_L            ; Busca la correci¢n del  ngulo   
      movwf   Reg_L
      incf      Ciclo,F
   clrf   PCLATH
      bcf      PIR1,TMR2IF
      retfie   

Inicio     
   clrf     PORTC            ;  Borra salidas
   bsf      STATUS,RP0      ;  Selecciona banco 1
   movlw      b'10000001'
   movwf    TRISC            ;  RC2 salida
   movlw   Periodo
   movwf      PR2            ;  Carga el registro de periodos
   movlw      b'11000000'
   movwf      INTCON
   movlw      b'00000010'
   movwf      PIE1
   bcf      STATUS,RP0      ;  Selecciona banco 0   
   movlw      b'00111100'
   movwf      CCP1CON
   movlw      b'0001101'
   movwf      T2CON            ;  T2 en On
   movlw      .1
   movwf      CCPR1L         ;  Carga la anchura del pulso
   clrf      Ciclo   

Loop     
   nop
   btfsc   PORTC,7
   goto      Uno
   clrf      CCP1CON      
   goto      Loop            ;  Bucle infinito     

Uno
   movlw      b'00111100'
   movwf      CCP1CON
   goto      Loop

   ORG      600h            ; i nicio de la tabla en 0600h= P gina 0, subpagina 6
PWM_H
   addwf    PCL,F

   DT   0x13,0x14,0x15,0x15,0x16,0x17,0x18,0x18,0x19,0x1a,0x1b,0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x1f,0x20,0x20,0x21,0x22,0x22,0x23   
   DT   0x23,0x23,0x24,0x24,0x25,0x25,0x25,0x25,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x25
   DT   0x25,0x25,0x24,0x24,0x24,0x23,0x23,0x22,0x22,0x21,0x21,0x29,0x20,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1b,0x1a,0x1a,0x19,0x18   
   DT   0x17,0x17,0x16,0x15,0x14,0x13,0x13,0x12,0x11,0x10,0x0f,0x0f,0x0e,0x0d,0x0c,0x0c,0x0b,0x0a,0x0a,0x09,0x08,0x08,0x07,0x06   
   DT   0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   
   DT   0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x08,0x09,0x09,0x0a   
   DT   0x0b,0x0b,0x0c,0x0d,0x0e,0x0e,0x0f,0x10,0x11,0x11,0x12,0x13,0x13   

    ORG      700h               ; i nicio de la tabla en 0600h= P gina 0, subpagina 6
PWM_L
   addwf    PCL,F

   DT   0x2c,0x1c,0x0c,0x3c,0x2c,0x1c,0x0c,0x3c,0x2c,0x1c,0x0c,0x3c,0x2c,0x0c,0x3c,0x2c,0x0c,0x3c,0x1c,0x3c,0x2c,0x0c,0x2c,0x0c   
   DT   0x2c,0x3c,0x1c,0x2c,0x0c,0x1c,0x2c,0x3c,0x0c,0x1c,0x2c,0x2c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x2c,0x2c,0x1c,0x1c,0x0c,0x3c
   DT   0x2c,0x0c,0x3c,0x2c,0x0c,0x2c,0x1c,0x3c,0x1c,0x3c,0x1c,0x2c,0x0c,0x2c,0x3c,0x0c,0x2c,0x3c,0x0c,0x1c,0x3c,0c0c,0x1c,0x2c
   DT   0x3c,0x0c,0x0c,0x1c,0x2c,0X3c,0X0c,0X1c,0X2c,0X3c,0X3c,0X0c,0X1c,0X2c,0X3c,0X0c,0X2c,0X3c,0X0c,0X1c,0X3c,0X0c,0X1c,0X3c
   DT   0X1c,0X2c,0X0c,0X2c,0X0c,0X2c,0X1c,0X3c,0X1c,0X0c,0X3c,0X1c,0X0c,0X3c,0X2c,0X2c,0X1c,0X1c,0X0c,0X0c,0X0c,0X0c,0X0c,0X0c
   DT   0X1c,0X1c,0X2c,0X3c,0X0c,0X1c,0X2c,0X3c,0X1c,0X2c,0X0c,0X1c,0X3c,0X1c,0X3c,0X1c,0X0c,0X2c,0X0c,0X3c,0X1c,0X0c,0X3c,0X1c
   DT   0X0c,0X3c,0X2c,0X1c,0X0c,0X3c,0X2c,0X1c,0X0c,0X3c,0X2c,0X2c,0x0c

   end                     ;  Fin del programa fuente

  - Tienes que ingresar para ver archivos adjuntos -