TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: davo_tlax en 14 de Octubre de 2009, 16:48:17
-
que tal amigos quisiera saber en el siguiente programa en ensamblador como le cambio la frecuencia con el que me sale el pwm sale aprox de 24.72 Hz pero yo necesito una frecuencia de 7000 Hz me harian un gran favor compartiendome sus conocimientos espero su respuesta gracias
a continuacion pongo el programa en .asm
;Programa de regulación de velocidad de un motor de corriente continua mediante la modulación
;de anchura de pulso(PWM). Por la linea de salida se genera una onda cuadrada de frecuencia
;constante s 100Hz(periodo de 10 ms) y ciclo de trabajo variable desde 0% a 100%, dependiendo
;del valor de la entrada del Puerto A. Es decir, el tiempo en alto varia entre 0 ms (0%) y 10
;ms (100%) de acuerdo con la siguiente tabla:
; (Ciclos_ON) (Ciclos_OFF)
; Entrada CD(%) SEMIPERIODO ALTO SEMIPERIODO BAJO
; ------- ----- ---------------- ----------------
; 0 0% 0 mn = 0 x 1 ms 10 ms = 10 x ms
; 1 10% 1 ms = 1 x 1 ms 9 ms = 9 x 1 ms
; 2 20% 2 ms = 2 x 1 ms 8 ms = 8 x 1 ms
; ... ... -------- -------
; 9 90% 9 ms = 9 x 1 ms 1 ms = 1 x 1 ms
; 10 100% 10 ms = 10 x 1 ms 0 ms = 0 x 1 ms
; >10 0%
;
;ZONA DE DATOS***************************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
Ciclos_ON
Ciclos_OFF
GuardaEntrada
Var
ENDC
MaximaEntrada EQU .10
;ZONA DE CODIGOS*************************************************************************
ORG 0
Inicio:
bsf STATUS,RP0
movlw b'00001111' ;RA3:RA0 como entradas.
movwf TRISA
clrf TRISB ;Las lineas del Puerto B se configuran como salidas.
bcf STATUS,RP0
Principal
movf PORTA,W ;Lee el puerto de entrada.
andlw b'00001111'
movwf GuardaEntrada ;Guarda el valor.
btfsc STATUS,Z ;Si RA3:RA0=0 el motor se detiene
goto DC_CeroPorCiento
sublw MaximaEntrada ;(W)=10-(PORTA)
btfsc STATUS,Z
goto DC_100PorCiento
btfss STATUS,C ;¿C=1?,¿(w)positivo?,¿(PORTA)<=10?.
goto DC_CeroPorCiento ;Ha resultado(PORTA>10).
movwf Ciclos_OFF ;10-(PORTA)-->(Ciclos_OFF).
movf GuardaEntrada,W
movwf Ciclos_ON ;Carga RA3:RA0 en (Ciclos_ON).
Motor_ON
movlw b'10000000' ;Habilita los drivers y un sentido de giro.
movwf PORTB
call Retardo_1ms
decfsz Ciclos_ON,F ;Si(Ciclos_ON)=0 salta a Motor_OFF.
goto Motor_ON ;+2
Motor_OFF
clrf PORTB ;Inhabilita los drivers. Motor parado.
call Retardo_1ms
decfsz Ciclos_OFF,F ;Si(Ciclos_OFF)=0 salta a Principal.
goto Motor_OFF ;+1
goto Fin
DC_CeroPorCiento
clrf PORTB ;Inhabilita los drivers. Motor Parado.
goto Fin
DC_100PorCiento
movlw b'10000000' ;Habilita los drivers y un sentido de giro
movwf PORTB
Fin:
goto Principal
INCLUDE<RETARDO.INC>
END
-
que tal?
asi como tienes el programa, tienes que reducirle el tiempo a los retardos,
aunque a mi parecer, seria mas eficiente que hicieras el PWM por interrupcion
por si el micro tiene que hacer alguna otra cosa a parte del PWM.
saludos!!
-
que tal pues lo unico que tiene que hacer el pic es el pwm no hace otra funcion yrealmente soy un novato con esto del ansamblador o peor que eso y no le se mucho pero le tengo que cambiar en donde dice lo de 1 ms? o me tengo que ir al retardos.asm y ahi cambiarle? perdona mi ignorancia y ya calcule mas o menos a cuanto le tengo que poner y tendria que ser a 10 us (micro segundos) para que teoricamente me salga a 5 khz y gracias por tu ayuda que tengas un buen dia
-
Lee el siguiente enlace (http://www.todopic.com.ar/foros/index.php?topic=24720.0) para que tengas ideas de como funciona en general, las creaciones de demoras y sabrás que cambiar.
Saludos!
-
thnks suky se ve bueno espero poder darme un tiempesito para poder leerlo y asi aprender mas espero me ayude y te vuelvo a reiterar mis mas sincers agradecimientos que estes bien.
-
pues si solamente tiene que hacer eso puede ser asi:
la frecuencia que necesitas es de 5kHz, por lo que el tiempo que tiene que durar cada retardo es de 2 veces 5kHz,
porque la frecuencia la da medio ciclo en alto y medio ciclo en bajo por lo que el retardo debe durar
1s/10kHz= 0.0001s=100us
asi que haremos un retardo de aproximadamente 100us
y simplemente, haremos que encienda y apague el pin con ese retardo
algo asi:
;-------------------------------------------------------------------------------------------------------------
INICIO: bsf portb,0
call Retardo10uS
bcf portb,0
call Retardo10uS
goto inicio
Retardo100uS: movlw .33
movwf num1
espera: decfz num1,F
goto espera
return
;-------------------------------------------------------------------------------------------------------------
es el caso mas simple que te puedo poner, ya si necesitas variar el ciclo de trabajo, habra que tener un retardo para
apagado y otro para encendido, y hacer que se complementen en tiempo.
espero te sirva.
saludos!
-
Saludos
En forma de sugerencia. Si quieres que los retardos te queden más precisos utiliza interrupciones por timers asi habra más exactitud en los tiempos por lo tanto también en la frecuencia.