Practical PIC Projects


8 Channel PWM Power

for 16F628A 
(Kit 483)




Update: Variable chase speed option  (see here for details)

This neat little circuit provides 8 LEDs directly driven from the PIC along with a single mode control switch.  The firmware elsewhere on this page drives the LEDs with a 5 bit PWM signal providing each of the 8 LED channels with four levels of intensity; off, dim, mid, bright.  A number of sequences are programmed into the firmware to provide some interesting visual effects and chase sequences, including the classic effect seen on the car in the Knight Rider TV series. 

The software has sequential, random and manual sequence run modes and manual advance to the next sequence in any mode.  The selected sequence and mode are also saved to non-volatile memory so it will always restart in the selected mode.

The design is kept simple with each channel being directly driven from a PIC I/O pin.  On board LEDs allow operation to be monitored while the power MOSFETs enable the board to control LED arrays and modules at currents up to 2 amps.

You can use it with different sized LEDs and mixed colours, as well as fewer than 8 LEDs.  As well as using it as a LED chaser it is great for adding effects to toys and models.  See FAQ

However, if you just want a cool LED chaser without having to write any code, a ready written LED chaser program including 34 chase effects with source code and programmer ready HEX files is provided at the bottom of this page. 


Power MOSFET LED Chaser board testing with some 12 volt LED modules.
The LED modules shown I use for testing.  I bought them from an eBay seller from China in 2008


Power MOSFET LED Chaser connected to LED Matrix signs.  This runs from a 12 volt supply. 


This LED light suit uses the MOSFET LED Chaser project on this page to control the LEDs in the suit - built by a customer using bespoke PCBs for the LEDs which he designed and built himself.  



Download schematic in PDF



Circuit Description

The heart of the LED chaser is the PIC 16F628A microcontroller, IC2. The program that runs on this chip controls the LEDs / MOSFET drivers attached to the output port pins.  Resistors R1 thru R8 limit the current through LED1 - LED8 to a safe level that won't damage the PICs I/O ports or LEDs.  These LEDs are provided to monitor the main channel outputs, they can be omitted them if this feature isn't needed.

Resistor R25 provides a pull-up for the input connected to switch S1.  R26 pulls up the PIC's MCLR reset signal during normal operation while allowing the input to be raised to 12.5 volts during in-circuit programming.  The ICSP header provides connection for an ICSP programmer such as a PICkit2 making it easy to reprogram the PIC without removing it from the PCB.

Power is supplied to the circuit through the 3-way terminal block and must be smooth DC between 9 and 18 volts.  The PIC requires a precisely controlled 5 volt supply and this is provided by IC1, a 7805 3-terminal, 5 volt regulator.  Typical current drawn by the circuit with all LEDs on is only around 100mA so the voltage regulator doesn't require any additional heatsink. Capacitor C1 stabilizes the regulator.  Capacitors C2 / C4 are used to decouple the 5 volt power supply to the board.   Diode D1 protects the circuit from accidental reverse polarity of the input voltage.  Diode D14 protects the regulator and is only really needed if you will be using the ICSP feature (doesn't hurt to fit it anyway)

The power output stage comprises eight STP36NF06 N-Channel MOSFETs.  These are logic level devices with a low (logic level) gate threshold making them suitable for driving from a PIC output.  The 120R gate resistors limit the current during switching, the 47K gate pull-down resistors prevent the MOSFETs from turning on during power up and also from ESD (electro-static discharge).

Although rated at maximum of 30amps and 60 volts source/drain voltage, since the MOSFETs are being used without any heatsink do not exceed 2 amps per channel.  In addition to this the connectors and PCB track sizing also limit the maximum current per channel to 2 amps.

Additional information about PCB480C


  • The 3-way terminal block supplied with the kit is rated for 20 amps per terminal.  There are two terminals connected to V- (Ground).  When operating the board at maximum channel output currents it is good practice to wire both inputs to ground.
  • Each channel can handle 3 amps however the combined channel current for the board should not exceed 16 amps in total (2 amps per channel when all channels are active simultaneously)
  • The ICSP header allows programming of the PIC while installed in the circuit.  It is only required if you intend to connect a programmer to modify the sequences or code.  It is not supplied with the kit but is available as an option.
  • The board itself requires around 100mA to operate, however, the power supply used will need to be specified to handle the total power required for whatever LED modules / arrays are connected to the MOSFET output channels.

Component List

Identifier Description Qty
R1-R8 330R 8
R9,R11,R13,R15,R17,R19,R21,R23 120R 8
R10,R12,R14,R16,R18,R20,R22,R24 47K 8
R25,R26 10K 2
C1 330nF, polyester, 5mm pitch (or 470nF) 1
C2,C4 100nF, muli-layer ceramic, 2.5mm pitch 2
D1,D14 1N4003 2
LED1 to LED8 5mm LED, high brightness, Red 8
IC1 7805, 1 amp, 5 volt regulator 1
IC2 PIC16F628A (requires programming) 1
Q1 to Q8 STP36NF06L logic level N-channel MOSFET
(STP20NF06L alternative)
S1 6mm right angle tactile switch 1
CN1 to CN8 2-way terminal block 5.08mm 8
Power connector 3-way terminal block 5.08mm 1
  • Diodes D1 and D14 are shown as 1N4003.  Any 1N400x series diode can be used here.
  • S1 is a 6mm right angle tactile switch, Omron B3F series.
    Rapid Electronics part # 78-0140
    cheaper alternative is Rapid Electronics part # 78-1154
  • IC1 is a 7805, 5 volt, 1 amp regulator IC. 
    For use in automotive applications, or where you need the circuit to operate from input voltages down to 6 volts replace IC1 with an LM2940CT-5 and install a 47
    F/10volt to C3
    Rapid Electronics part # 82-0678 and part # 11-0815 or 11-1502
  • STP36NF06L MOSFETs are logic-level N-channel devices.  For use on this PCB maximum current per channel is 2 amps (do not exceed this).  STP20NF06 can be used as an alternative.

    Maximum current for the whole board should not exceed 16 amps.
  • 3-way and 2-way terminal blocks are 5.08mm pitch but a 5mm part will also fit.
  • The PIC16F628A needs to be programmed with the correct firmware (see firmware section). If you bought the kit, this code is already programmed into the supplied 16F628A.
  • C1 is 5mm polyester box type
  • C2/C4 are 2.5mm radial lead multilayer ceramic Y5V or X7R dielectric
  • Resistors are all 1/4 watt, 5% carbon film type.
  • The LED current limit resistors R1-R8 are 330R.  Don't use a lower value resistor for these as it will affect the output voltage from the PIC I/O pin reducing the voltage at the MOSFET gate.

    All components used in this kit can be sourced from Rapid Electronics

    Standard parts are used in this project and should be easy to source from distributors world wide.

PCB Artwork

The PCB is available to buy from the Picprojects online store.  This a quality double sided, thru-plated board with solder masks and component overlay on FR4 board with RoHS compliant OSP finish to the copper.

The artwork is provided if you want to etch your own board, however it is a double sided board and unless you can thru-plate the holes it will be difficult to solder both sides of some components such as the terminal blocks.


Artwork bottom Artwork top Component overlay

Physical dimensions and centres Buy this PCB from the eShop

Construction notes:

Illustrated guide to assembling the kit.  Please read through the whole of this section before starting assembly and refer back to it during assembly.

click on the photo's for 1024 x 768 version

Step 1

Step 2

Step 3

Step 1. Install the resistors.  The coloured bands denote the resistance value as shown below.  Fit the resistors into the correct location on the PCB.  It doesn't matter which way round the are oriented.

  brown, black, orange, gold - 10K (R25, R26)

orange, orange, brown, gold - 330R (R1-R8)

brown, red, brown, gold - 120R (R9,R11,R13,R15,R17,R19,R21,R23)

yellow, violet, orange, gold - 47K (R10,R12,R14,R16,R18,R20,R22,R24)

Resistor colour codes explained

Step 2.  Fit the two 1N4003 diodes.  These have a silver band at one end of the body and must be fitted the correct way round as shown.

Step 3. Install the three capacitors C1, C2 and C4.  C1 is marked .33 J 63 (alternative part 470nF marked .47K63)Capacitors C2 / C4 are marked 104.
It doesn't matter which way they are oriented when fitting to the PCB

Step 4

Step 5

Step 6

Step 4.  Install the socket for IC2.  Note that it has a small indent at one end, you should fit the socket with indent at the end arrowed in the photo. 

Step 5.  Install the 7805 voltage regulator to IC1. IC1 shares the same TO-220 standard packaging that the MOSFET driver transistors use.  IC1 will have the number 7805 laser-etched on the body.  The MOSFET transistors Q1-Q8 will have STP36NF06 (STP20NF06 alternative) on them.

Step 6.  Install the eight 2-way terminal blocks.  These are 'stackable' connectors so slide them together using the dovetail on the side of each block. It is easiest to make them up into two sets of 8 terminals before fitting to the PCB.

Step 7

Step 8

Step 9

Step 7.  Once the 2-way terminal blocks have been connected to each other solder them onto the PCB.  Ensure they all fit snugly against the PCB.

Step 8 / 9 Install the 8 MOSFETs to the PCB

  • Solder each MOSFET to the PCB one at a time.
  • Ensure you have it positioned the correct way round as shown in Step 8 photo.
  • Solder the pins of each MOSFET in the order shown in Step 9 photo
MOSFETs are static sensitive devices.  Don't handle them until you are ready to fit them to the PCB.  Don't touch the pins, handle the body only. Take anti-static precautions


Step 10

Step 11

Step 12

Step 10. When fitting the monitor LEDs to the PCB use a thin screwdriver to bend the leads of the LED around through 90o in a curve.   One lead of the LED is shorter than the other.  This indicates the Cathode terminal of the LED.  Ensure it is positioned as shown otherwise it will be in the wrong position to fit the PCB.

Step 11.  Fit the LEDs to the PCB with the short lead of each LED to the hole of the square PCB pad.

Step 12. Initially only solder one lead of each LED as shown.

Step 13

Step 14

Step 15

Step 13. Align the LEDs so they are evenly spaced and when viewed horizontally form a neat line.  Once you have then aligned solder the remaining leads of each LED.

  At this point in the assembly.
  • Check the PCB to make sure solder joints are neat and there are no solder bridges between pins. 
  • Make sure all excess component leads have been neatly trimmed.
  • Clear the work area of any component lead off-cuts, solder splashes etc. 

Step 14.  Apply power to the board.  This should be 9-18 volts DC.  Connect the positive power lead to V+ on the 3-way terminal block.  Connect the negative or ground lead to either of the V- connections on the 3-way terminal block.

Now using a multimeter check the 5 volt supply is present and of the correct voltage.   A reading between 4.75 and 5.25 volts is acceptable.  There is a Gnd and 5 volt test point on the right side of the PCB (see Step 14 photo)

If the voltage is NOT within the acceptable range you must resolve the cause before continuing.

  Couple of points, should be obvious really but I'll state it anyway:
  • Do not insert or remove the IC2 when power is applied to the board.
  • Do not solder any connections to or on the PCB while power is applied

Step 15.  Disconnect the power from the board. Now you can fit the PIC microcontroller into the IC2 socket.  You will see a small dot and indent at one end of the body.  This should be fitted so it is towards the end arrowed in the photo.

Step 16.  Reconnect power and turn on, the PCB mounted monitor LEDs should now start to run the sequencer patterns.

  • Press and hold S1 to enter setup mode. 
  • Press S1 to cycle through the 3 modes.
  • Press and hold S1 to exit setup mode.

If everything is working correctly, construction of the main control PCB is complete.

Connecting to the MOSFET channel outputs

How does it work

Each channel output on the control board connects to a MOSFET.  In simple terms a MOSFET is just a fast electrical switch.  With a mechanical switch you operate it by turning the switch on and off with a finger.  With the MOSFET, the PIC microcontroller turns the MOSFET on and off.  Unlike a mechanical switch or relay it can turn on and off 1000's of times/second.

When the MOSFET is switched on, it connects the channel output to V- (ground).   If some type of LED array / module is connected between the channel output and the V+ supply it will light when the MOSFET is turned on by the microcontroller.

Output protection

There is no fused protection on the control PCB therefore depending on your application you may want to add this externally. 

Since the power output channels can switch anything from a few milliamps to 2 Amps and the type of power supply used is going to vary according to the type of load a particular application is driving it is not possible to give specific advice on wiring, fuses and power supplies.

However some points to consider are discussed in this section.

  • Firstly, ensure the wire gauge used for connections is correctly sized for the current it is expected to handle.
  • Consider that each channel is only rated to 2 amps maximum.  Since a fault will typically occur in a single output channel using, for example, a single 16 amp fuse at the input will most probably result in damage to the PCB copper track, MOSFET and wiring  before the fuse blows.  Therefore it is advisable to use an individual fuse in-line with each output particularly where the combined channel current for the board will exceed around 5 amps.
  • Depending on the power supply you are using it may already include adequate fault and overload protection on the output.
  • You should be particularly careful if using this controller in automotive applications since a car battery can deliver 100's of amps which if not correctly protected could result in serious damage and/or fire.
  • A short circuit between the MOSFET channel output and the positive +V power supply will most likely damage or destroy the corresponding MOSFET, particularly if a high current output power supply is in use.  Therefore pay particular attention to wiring of the controller to the load to ensure all connections and cables are correctly wired.

Please note that this is general advise and you should ensure you design the cabling, power supply and suitable over-current protection for your specific application.

Examples of connecting to the channel outputs

The diagram below shows how to wire to the channel outputs of the control PCB.

Some LED module will be designed to operate from a particular voltage, in this case they don't need the in-line current limiting resistor since these will already be built into the module itself.  When using this type of module you must ensure the input voltage to the control PCB is correct for the LED modules being used.

Where individual LEDs are used, current limiting resistors must be included to avoid destroying the LEDs.  The value of the resistor required must be calculated according to the characteristic of the LEDs being used and power supply voltage.

The 'Driving LEDs' document below explains how to calculate the resistors required.  You may also find the excellent LED Calculator app at very useful.  The schematics produced by the LED calculator app show the resistor connected to the cathode or negative end of the LED strings. I always show it connected to the anode or positive end. It doesn't actually matter where it connects as long as it is fitted.

Connecting to the control PCB LED Character Matrix Driving LEDs

User Operation Guide

The program has three modes of operation.

  1. Manual mode will run the same sequence continually. When the switch is pressed it will skip to the next sequence in program memory.
  2. In auto-sequential mode, the program runs through each sequence in program memory until it reaches the end of all defined sequences at which point it restarts from the first one.
  3. In random mode the program selects sequences randomly.

When the code is running in any mode, a short press of the switch will make the controller skip to the next sequence. 

To enter setup mode, press and hold the switch.  Once it enters setup mode one of three LEDs will light indicating the current run mode.  A short press of the switch cycles through the three modes. When the desired run mode has been selected, press and hold the switch to exit setup and return to run mode.

The current mode and selected sequence are automatically saved to the PICs internal non-volatile EEPROM memory 10 seconds after the last switch press.  When the LED chaser is next powered up it will load and start running using the saved mode and sequence.

Update: Variable chase speed option kit now available (see here for details)

Description of Sequence Data

The data used to create the sequences is held in a separate include file.  You can add, remove or edit this data to create your own chaser sequences.

To make the creation of the data file easier a set of macros have been defined which are used to create the sequence data.  This is described in the Sequence data flowchart  (also available as a JPEG image right)

If you download the source code and look at the file named you can see the data used in the project.  You might want to edit this file as a starting point to create some sequences of your own.


  • In manual mode, when the repeat count reaches zero it will restart the same sequence, to advance to the next sequence press the switch.
  • In Random mode it will the select a random sequence number to run. If the Mirror flag is true for that sequence it will also randomly choose to mirror the data or not.
  • In auto-sequential mode if the Mirror flag is true it will run the sequence and then repeat it with the data mirrored.


The PIC microcontroller requires programming with the firmware which you can download below.

The HEX files are ready to program straight into the respective PIC chip.  The latest code version 2.0.7 supports the PIC 16F628/628A.

The Source code will allow you to create your own sequences and then reassemble the code to use them.  Quick guide to reassembling firmware using MPLAB

Description Filename Download link
Source code for 16F628A
V2.0.8 21/02/2021
HEX file ready to program into the PIC.
Use with 16F628 / 16F628A only
V2.0.8  21/02/2021
checksum 0A0A
Link to V3.0.0 Firmware    

Update: Variable chase speed option  (see here for details)

If you need a PIC Programmer I strongly recommend the Microchip PICKit 2, this is available from suppliers world wide or direct from Microchip.  It's reasonably cheap to buy and reliable.  I have a couple of them and I wouldn't use anything else now.


Can you or how can I make it run more than 8 Channels?

This is probably the most frequent of the frequently asked questions :-)

The project is an 8 Channel LED Chaser and the firmware was written to work as an 8 Channel chaser.

There is no quick and easy change to make it a 9, 12 or some other number of Channels.  If you need a chaser with more channels then this project is not suitable for your needs.

Can I use less than 8 LEDs?

Yes, since the sequences are user definable you can create sequences that use less than 8 LEDs.

I only want it to run one sequence, can it do that?

Since the current mode and selected sequence are saved to NVRAM, it always powers up in the last mode and running the last sequence.  Therefore if you select manual mode and the sequence required, it will run only that sequence until you change it.

Can you add a button or potentiometer to change the speed?

Update: Variable chase speed option kit now available (see here for details)

The sequences don't have a speed as such, the data for each step in a sequences includes a hold time which has to elapse before moving to the next step in the sequence.  This hold time is user defined and can be different for each step in a sequence.  The speed a sequence runs at is therefore fixed in the data and there is no option to speed up or slow down a sequence when it is running.  See Description of Sequence Data

Can you modify the code to run on a PIC type xyz?

If you want to modify the source code it could be made to run on other PIC types, however we won't modify the code.