|
| |
PWM or Pulse Width Modulation is an important and essential
concept in embedded systems. We can control speed of a motor, brightness of a
bulb or a LED etc by supplying a train of pulses. If the pulse has larger ON
time i.e. duty cycle, the average voltage supplied will be more, thus if we have
connected a motor to the output, its speed increases, if we reduce the pulse
width, average voltage supplied is less, thus the speed of the motor decreases.
Thus we can digitally control the speed of a motor without the need for an ADC.
So now we will construct a pulse width modulator using
8051(89s52) to illustrate the concept of PWM I have constructed a simple
circuit which is shown below, where a LED or small lamp is connected to the output of
microcontroller (you can also connect a small motor or fan with an additional
transistor). The microcontroller is programmed such that the brightness of
the LED increases for some time, when it reaches maximum brightness, the LED's
brightness starts to fade till its brightness is minimum and this continues.

The program appears to be bigger but it is just replication
of first main block with different values loaded in registers. The second
program published in the second table uses a concept of lookup tables.
;************************************************* ; ;Program: PWM ;Author: Srikanth ;Website: http://shree-electronics.com/ ;Description: Varies brightness of an LED ;connected to any pin of P2 continuously ; ;*************************************************
outp equ P2 org 0h
main:mov
r4,#0ffh up0: mov r0,#100d ;Set duty
cycle mov r1,#01d acall
out ;light up LED djnz
r4,up0 ;loop for dome time
mov r4,#0ffh up1: mov r0,#90d mov
r1,#10d acall out djnz
r4,up1
mov r4,#0ffh up2: mov r0,#80d mov
r1,#20d acall out djnz
r4,up2
mov r4,#0ffh up3: mov r0,#70d mov
r1,#30d acall out djnz
r4,up3
mov r4,#0ffh up4: mov r0,#60d mov
r1,#40d acall out djnz
r4,up4
mov r4,#0ffh up5: mov r0,#50d mov
r1,#50d acall out djnz
r4,up5
mov r4,#0ffh up6: mov r0,#40d mov
r1,#60d acall out djnz
r4,up6
mov r4,#0ffh up7: mov r0,#30d mov
r1,#70d acall out djnz
r4,up7
mov r4,#0ffh up8: mov r0,#20d mov
r1,#80d acall out djnz
r4,up8
mov r4,#0ffh up9: mov r0,#10d mov
r1,#90d acall out djnz
r4,up9
mov r4,#0ffh up11: mov
r0,#10d mov r1,#90d acall
out djnz r4,up11
mov r4,#0ffh up12: mov r0,#20d mov
r1,#80d acall out djnz
r4,up12
mov r4,#0ffh up13: mov r0,#30d mov
r1,#70d acall out djnz
r4,up13
mov r4,#0ffh up14: mov r0,#40d mov
r1,#60d acall out djnz
r4,up14
mov r4,#0ffh up15: mov r0,#50d mov
r1,#50d acall out djnz
r4,up15
mov r4,#0ffh up16: mov r0,#60d mov
r1,#40d acall out djnz
r4,up16
mov r4,#0ffh up17: mov r0,#70d mov
r1,#30d acall out djnz
r4,up17
mov r4,#0ffh up18: mov r0,#80d mov
r1,#20d acall out djnz
r4,up18
mov r4,#0ffh up19: mov r0,#90d mov
r1,#10d acall out djnz
r4,up19
mov r4,#0ffh up20: mov
r0,#100d mov r1,#01d acall
out djnz r4,up20
ajmp main
;Loop
**************************************************
;Out subroutine out: mov outp,#0ffh djnz
r0,out out1:mov outp,#00h djnz
r1,out1
ret
**************************************************
end
|
Program using lookup tables.
;************************************************* ; ;Program: PWM ;Author: Srikanth ;Website: http://shree-electronics.com/ ;Description: Varies brightness of an LED ;connected to any pin of P2 continuously ; ;*************************************************
outp equ P0 org 0h
main:mov dptr,#pwm_data ;load
pointer for lookup table clr a movc a,@a+dptr mov
r2,a inc dptr up: clr a movc a,@a+dptr mov
40h,a ;ON
period clr a inc dptr movc a,@a+dptr mov
41h,a ;OFF
period inc dptr acall
out djnz r2,up sjmp
main
;************************************************* out:
mov r4,#02h
lp0: mov r3,#0ffh
lp: mov r0,40h
mov r1,41h
lp1: mov outp,#0ffh
djnz r0,lp1
lp2: mov outp,#00h
djnz r1,lp2
djnz r3,lp
djnz r4,lp0
ret
;************************************************* ;Lookup table pwm_data: db 15h ;no of elements in the
db 100d,001d ;lookup table
db 090d,010d;
db 080d,020d ;each element consisting db 070d,030d ;of 2 bytes db 060d,040d; db 050d,050d ;first byte is value
db 040d,060d ;for ON period db 030d,070d ;second byte is value
db 020d,080d ;for OFF period
db 010d,090d;
db 001d,100d;
db 010d,090d;
db 020d,080d; db 030d,071d; db 040d,060d; db 050d,050d; db 060d,040d; db 070d,030d; db 080d,020d; db 090d,010d; db 100d,001d;
;*************************************************
end
|
BACK
| |
|