martes, 8 de enero de 2008

Piklab programando ejemplo PWM


PWM en un PIC

Hola este codigo muestra como usar una caracteristica de un PIC el PWM, me vaso segun la hoja de datos del pic16F873, para otros pic lo que va a variar es el TOSC que va a depender del cristal que usemos, en fin aqui les va xD.

Calculando el periodo segun la formula:

Periodo = [PR2 +1] * 4 * TOSC * TMR2 valor del prescaler

PR2 = 255
TOSC = 50 para el cristal de 20 Mhz
TMR2 = 16

Periodo = [255+1]*4*(50*10^-9)*16 = 0.0008192
En Hz seria 1 / 0.0008192 = 1220.703 dividido por 10^3
nos qedaria 1.220703 Khz que es el valor de la hoja de datos.

Para calcular el ancho del pulso o la duracion del ciclo hay otra formula
en la hoja de datos podran ver con mas detalle, en este caso el registro
CCPR1L lo cargamos con valores conocidos ^^ .
El codigo seria:


list p=16f873a
include "p16f873a.inc"
__config _HS_OSC & _WDT_OFF & _LVP_OFF &_DEBUG_OFF & _CPD_OFF &_PWRTE_ON &_LVP_OFF &_BODEN_ON

cblock 0x20

ContadorA
ContadorB
ContadorC

endc
org 0h
goto Inicio
org 05h
;-------------------------------------------------------------------------------------------
Inicio bsf STATUS,RP0
movlw B'00000000'
movwf PORTC
bcf STATUS,RP0

;PWM
clrf T2CON
clrf TMR2
clrf INTCON
movlw 0x07 ;B'00000111'
movwf CMCON
bsf STATUS,RP0
clrf PIE1
bcf STATUS,RP0
clrf PIR1
bsf STATUS,RP0
movlw B'11111111'
movwf PR2 ;Periodo
bcf STATUS,RP0
movlw B'00000010'
movwf CCPR1L
movlw B'00000110'
movwf T2CON ;1:16
movlw B'00001100'
movwf CCP1CON ;Modo PWM
bsf T2CON,TMR2ON
;-------------------------------------------------------------------------------------------
doloop movlw D'64'
movwf CCPR1L
call retraso_0.5_seg
movlw D'128'
movwf CCPR1L
call retraso_0.5_seg
movlw D'255'
movwf CCPR1L
call retraso_0.5_seg
goto doloop
;-------------------------------------------------------------------------------------------
; Código de retardo generado por PikLoops (mié ene-2008-09 00:51:59)
; Tiempo de retardo = 0.49999620 con Osc = 20.00000000MHz

retraso_0.5_seg
movlw D'13'
movwf ContadorC
retraso_0.5_seg_bucle
call sub_delay_0.5_seg
decfsz ContadorC,1
goto retraso_0.5_seg_bucle
return

sub_delay_0.5_seg
movlw D'250'
movwf ContadorB
movlw D'188'
movwf ContadorA
sub_delay_0.5_seg_bucle
decfsz ContadorA,1
goto sub_delay_0.5_seg_bucle
decfsz ContadorB,1
goto sub_delay_0.5_seg_bucle
return

;-------------------------------------------------------------------------------------------
end
;-------------------------------------------------------------------------------------------

IRC

#freenode->#usljujuy

Seguidores

Eventos n_n

Tira Ecol Nano,Bilo y Luca