18F PIC Example - PWM
PWM signals (Pulse Width Modulated) are extremely
handy for multiple purposes, one in particular is controlling
high
current devices such as DC motors and large
LED arrays. PIC's have
their limitations, namely 25mA per output, so if you want to drive
something a lot larger, using PWM and a high power switching device
such as a
logic MOSFET will do the job perfectly.
Although there are many other uses (such as Inferred
modulation and Ultrasonic), this example focuses purely on a PWM
program designed to control the brightness of a large
LED
array.
A PWM signal consists of both
frequency and
duty cycle. Both are important to understand;
The Frequency component
can be though of as how many pulses per second. If your PWM signal
had 10 pulses per second, then it would be 10Hz. Although this is
slow, you don't need to make things to much faster to trick the
human eye that there is no flashing. Consider your TV playing video
at 25 frames per second, or fluorescent lights pulsing at 60Hz! I
like to aim for 200-1Khz with my designs, I chose 5KHz out of the
blue the example below.
The Duty Cycle component is the important part of PWM,
it is what controls the average current/voltage to the target
device. It is not nearly as complicated as it sounds, consider these
two signals;
-
Steady 5 Volts
-
1KHz 50% Duty Cycle PWM Signal
If you put your multimeter between GND and the 5V
signal, you will read 5 Volts... However, if you put it between GND
and the PWM signal operating at 50%, you will read
2.5 Volts! It simply reads an
average of what's actually
there, in this case, only 50% of the time is there 5V available!
Now to put this excellent tool to use and drive 12
Very Bright
LED's
that require 250mA to operate at full brightness -
a task that a PIC could not do without PWM!
Note the PIC's
power supply/oscillator are not shown
The 10 Ohm
resistor is
very important, as it
controls the maximum amount of current that can be supplied to the
LED's, without it, the LED's would self destruct themselves
when the duty cycle percentage becomes high enough, and you
can say goodbye to 12 LED's in a matter of moments...
Logic
MOSFET's make mince meat of any high power task, the turn
on hard with 5 Volts to the Gate, and usually have an on resistance
of about 0.01 ohm or less. In this scenario, I am switching the
earth on and off, so I am using a N-Channel Logic MOSFET, if you
require to switch the supply on and off, then you need to use a
P-Channel Logic MOSFET. See the
MOSFET tutorial for more info.
Now for the source code;
Device = 18F4550
Clock = 8
Config FOSC = INTOSCIO_EC
Include "INTOSC8.bas"
// import PWM module...
Include "PWM.bas"
// local duty variable...
Dim Duty As Byte
// main program...
PWM.SetFreq(5000)
While true
Duty = 0
Repeat
PWM.SetDuty1Percent(Duty)
Inc(Duty)
DelayMS(25)
Until Duty > 100
Repeat
PWM.SetDuty1Percent(Duty)
Dec(Duty)
DelayMS(25)
Until Duty = 0
Wend
You will notice that I am using the
PWM.bas library, this is not
a standard library within
Swordfish,, you need to
download it and save it in your \Swordfish\UserLibrary
directory. The module can be found
here..
This program will set the frequency of the PWM signal
to 5Khz, and then ramp up the Duty Cycle from 0 to 100% in 2.5
seconds, and then back down again. The LED array will go brighten
and dim accordingly, all with the power of PWM and Duty Cycle.
Video Tutorials:
-
PWM Control With MOSFET's
- Brief overview of the
source code
- Discuss how PWM works,
and wire up a large LED array to be controlled via PWM

Download PWM
Library
Link:
What is a Swordfish
Library?
Where you can get the components;

 | Site Tutorial Index |
|  | 16F PIC Examples |
|  | 18F PIC Examples |
| |  | 7 Segment Displays |
| |  | 7 Segment Displays |
| |  | RS232 and UART |
| |  | Code Snippets |
|  | Handy Tips |