TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado 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
-
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
-
Pedon la Frecuencia del PWM es de 12 Khz
-
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)
-
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
-
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.
-
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).
-
a ok el final de la tabla esta mal???....................como deberia ser???
-
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.......
-
..............
movlw D'103'
xorwf ANGULO,W
btfsc STATUS,Z
clrf ANGULO
..............
-
a ok entiendo................gracias un detalle que se me paso...............probare y aviso
-
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
-
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.
-
debes poner un filtro rc , lo ideal seria lc , para integrar la señal y poder ver la onda senoidal
-
.... 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
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
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
-
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
-
hola amigo le emviera lo que he hecho hasta ahora..........use un pic con una frecuencia de 10 MHz
-
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
-
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)
-
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.
-
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
-
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
-
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,,,,,,????
-
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
-
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
-
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:
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.
-
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.
-
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???
-
Prueba primero con el cambio del timer 2. (esa es una opción)
movlw b'00011101'
movwf T2CON
-
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
-
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.
;====================================================================
; 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
-
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............
-
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
-
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 -