Вы находитесь на странице: 1из 3

prodas

GENERAR PWM POR SOFWARE

Muchas veces necesitamos aplicaciones en donde tenemos que utilizar más de un PWM y si nuestro
Microcontrolados no dispone de módulos suficientes los podemos generar por software.

Para esto vamos a utilizar el IDE MikroBasic for PIC.

Primero necesitamos recordar mediante le siguiente grafico como es el funcionamiento del PWM.

Vamos a trabajar primero desde software mediante demoras pero no es óptimo pues no podemos
controlar ciertos intervalos de tiempo de compasiones en las iteraciones por ejemplo, lo ideal sería
trabajar con TIMER pero inicialmente lo haremos con las demoras, para ello lo primero es definir la
frecuencia que queremos trabajar.

Prodas CTS
prodas

En este ejemplo vamos a controlar un LED por lo tanto la frecuencia deberá ser mayor a la que el
ojo humano puede distinguir un parpadeo, en este caso trabajaremos a 100Hz.

Ahora necesitamos calcular el periodo

0,01 s

Entonces necesitamos dos demoras que sumadas nos den 10ms pero para conseguir eso antes
necesitamos plantearnos cuantos valores de Duty Cycle queremos, yo utilizaré 255, por lo tanto mi
base de tiempo será

A continuación se presenta el sub procedimiento para generar distintos tiempos mediante una
demora base de 40us.

sub procedure demora (dim intervalos as byte)


dim i as byte
for i=0 to intervalos
delay_us(40)
next i
end sub

Cuando tengamos lista nuestra demora configurable vamos a realizar el sub procedimiento para
generar el PWM.

sub procedure genera_PWM (dim d_c as byte)


PWM1=1
demora(d_c)
PWM1=0
demora(255-d_c)
end sub

Veamos el programa completo

Prodas CTS
program pwm_delay

' Declarations section


symbol PWM_1 = PORTD.0 'defino para mi programa el puerto D0 ccmo PWM1
const retardo as byte=10 'constante de tiempo
Dim CICLO_UTIL as byte 'variable para cargar el ciclo util

sub procedure demora (dim intervalos as byte) 'demora segun valor intervalos
dim i as byte
for i=0 to intervalos
delay_us(40) 'demora base de 40 us
next i
end sub

sub procedure genera_PWM (dim d_c as byte)


PWM_1=1
demora(d_c)
PWM_1=0
demora(255-d_c)
end sub

main:
' Main program
TRISD.0=0
while true
genera_PWM(10) 'cargo el valor del CICLO UITL
wend
end.

Prodas CTS

Вам также может понравиться