Autor Tema: No logro generar el PWM para generar onda senoidal  (Leído 2480 veces)

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

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:No logro generar el PWM para generar onda senoidal
« Respuesta #30 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



Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro generar el PWM para generar onda senoidal
« Respuesta #31 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............
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro generar el PWM para generar onda senoidal
« Respuesta #32 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
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro generar el PWM para generar onda senoidal
« Respuesta #33 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

 

* PWM.jpg
(120.15 kB, 640x360 - visto 107 veces)
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything