You are on page 1of 5

Pulse Width Modulation (PWM)

Modulao por largura de pulso ou PWM (Pulse Width Modulation) uma das
tcnicas mais poderosas utilizados em sistemas de controle hoje em dia. usado em
ampla gama de aplicaes que inclui: controle de velocidade, controle de potncia,
medio e comunicao. Este tutorial ir lev-lo atravs de noes bsicas de
modulao de largura de pulso e sua implementao em microcontroladores.

Princpio bsico de PWM


A modulao de largura de pulso basicamente construir uma onda quadrada
variando o seu tempo em nvel lgico baixo e alto. Um sinal de base de PWM
mostrado na figura abaixo:

Figura 1. Modulao por largura de pulso.

Existem vrios termos associados com PWM:

T on : Durao de tempo do sinal em nvel lgico alto.


T off : Durao de tempo do sinal em nvel lgico baixo.
Perodo: representado como a soma de

T on e

T off .

Ciclo de trabalho (Duty cicle): representado como a percentagem do sinal que


permanece ligada em relao ao tempo total do sinal PWM (perodo).

Perodo
Como mostrado na figura,

T on indica o tempo ligado e

T off

indica o tempo fora do

sinal. Perodo a soma dos dois tempos, calculada como se mostra na equao
abaixo:

T total =T on +T off

Ciclo de trabalho (Duty cicle)


O ciclo de trabalho calculado como sendo o tempo

T on

sobre o perodo, como

mostrado abaixo:

D=

T on
T
= on
T on+T off T total

PWM: Regulao de tenso


Quando o sinal de PWM usado com vrios ciclos de trabalho diferentes, tem-se uma
variao de tenso na sada. Este mtodo usado em vrias de aplicao como:
Inversores
LED dimmers
udio
Gerao de sinais analgicos
E muito mais...
A regulao de tenso dada pela mdia do sinal PWM. A tenso de sada
representada pela seguinte equao:

V out =DV V out =

T on
V
T total

Como podemos ver na equao acima, pode-se variar a tenso de sada variando o
valor de

T on . Se

T on=0 , a tenso de sada tambm zero. Se

dizemos que a tenso de sada igual a

T on=T total , ento

ou mxima.

Implementando PWM com o 8051


A ideia bsica por trs da implementao do PWM em 8051 usando
temporizadores e comutando os pinos da porta de sada de alto para baixo em
intervalos definidos. Como j discutido na introduo deste artigo, alterando o tempo

T on , podemos variar a largura da onda quadrada mantendo mesmo perodo de


tempo desta mesma onda.
Ns estaremos usando o timer 0 do 8051 no modo 0. Valores de nvel alto e
baixo sero carregados de tal forma que o total de atrasos permanea igual. Se em
nvel alto carregarmos um valor X em TH0 em seguida, para nvel baixo TH0 ser
carregado com 255-X assim que os restos totais como 255.

Exemplo de cdigo em assembly


Configurao do timer para o PWM

PWMPIN EQU P1.0 ; PWM output pin


PWM_FLAG EQU 0 ; Flag to indicate high/low signal
PWM_SETUP:
MOV TMOD,#00H ; Timer0 in Mode 0
MOV R7, #160
; Set controle de largura de pulso
; O valor carregado em R7 o valor X, discutido acima
SETB EA ; Habilita interrupes
SETB ET0 ; Habilita interrupo do Timer 0
SETB TR0 ; Start
RET

Sub-rotina de interrupo
TIMER_0_INTERRUPT:
JB PWM_FLAG, HIGH_DONE ; Se PWM_FLAG est setado ento terminamos
LOW_DONE: ; pula para HIGH_DONE
SETB PWM_FLAG ; Faa PWM_FLAG=1 para indicar o inicio da seo alta
SETB PWMPIN ; Faa o pino de sada PWM alto
MOV TH0, R7 ; valor alto do byte do timer carregado com R7 (Controle do valor de
largura de pulso)
CLR TF0 ; Limpa o flag de interrupo do timer 0
RETI ; Retorne da interrupo para onde estava o programa
HIGH_DONE:
CLR PWM_FLAG ; Faa PWM_FLAG=0 para indicar o incio da seo baixa
CLR PWMPIN ; Faa o pino de sada PWM baixo
MOV A, #0FFH ; Move FFH (255) para A
CLR C ; Limpa C (o bit de carry) ento isso no afetar a subtrao
SUBB A, R7 ; Subtraia R7 de A. A = 255 - R7.
MOV TH0, A ; O valor carregado dentro de TH0 + R7 = 255
CLR TF0 ; Limpa o flag de interrupo do timer 0
RETI ; Retorna da interrupo para onde o programa esteja
Como tudo tratado em ISR, pode-se parar o PWM simplesmente desativando o timer.

1.

PWM_STOP:

2.

CLR TR0 ; Limpa timer para parar PWM

3.

RET

A largura de PWM pode ser mudada mudando o valor de registro R7. No


exemplo acima usamos 160, voc pode escolher qualquer valor de 0 a 255. R7 = 0 ir
dar-lhe o / p aproximadamente 0V e R7 = 255 vai lhe dar 5V aprox.
Voc tambm pode fazer uso de Timer1, se quiser. E o pino de sada pode ser alterado
a qualquer pino que voc deseja.

AVR Timers como PWM


A maioria dos controladores AVR tem um canal onboard de PWM, o que torna seu uso
mais simples e preciso. Temporizadores ou contadores AVR podem ser utilizados no
modo de PWM, sem perturbar a funo bsica do temporizador. Tal como no caso do
AT90S8515, onde o Timer1 pode ser configurado no modo de PWM, definindo os bits
PWM11 e PWM10 no registrador TCCR1A. Os modos disponveis para PWM so
mostrados na tabela abaixo:

A fonte pr-escalar para Timer / contador 1 pode ser selecionada com a ajuda dos bits
de seleo do clock no registrador TCCR1B (mais informaes consulte folha de dados
na pgina 37).
Largura de pulso colocada na sada do temporizador comparar registros OCR1A
(OCR1AH & OCR1AL) e OCR1B (OCR1BH & OCR1BL). Timer / contador 1 atua como um
contador Alto / baixo, contando a partir de $0000 para o topo (ver tabela abaixo),
onde ele gira e faz a contagem regressiva novamente para zero antes do ciclo ser
repetido. Quando o valor do contador corresponde ao contedo de 10 bits menos
significativos de OCR1A ou OCR1B, os pinos de PD5 (OC1A) / OC1B so setados ou
limpos de acordo com as configuraes dos bits COM1A1 / COM1A0 ou COM1B1 /
COM1B0 no controle de registro do Timer / contador1 (TCCR1A), veja a tabela abaixo:

AVR: Exemplo de cdigo em Assembly

1.

; Exemplo PWM 8-bits No Inversvel

2.

.equ pulse_width = $40

3.

;A largura de pulso pode ser mudada de 0 ao mximo

4.

PWM_START:

5.

ldi temp, pulse_width ; Carrega largura de pulso

6.

out OCR1AL, temp ;OCR1A = largura de pulso

7.

clr temp

8.

out OCR1AH, temp

9.
10.

ldi temp, $81 ;Modo PWM de 8-bits

11.

out TCCR1A, temp ; No Invertido

12.
13.

in temp, DDRD ;faa PortD.5 como o/p

14.

ori temp, (1<<5)

15.

out DDRD, temp

16.
17.

ldi temp, $1 ;Incie PWM

18.

out TCCR1B, temp

19.

ret ;Retorna para o inicio

20.

;PWM ser rodado no plano de fundo automaticamente