PWM pulse generation using PIC12F675 micro-controller

Published by MKDas on

To generate PWM(Pulse Width Modulation) both analog and digital circuit can be used. But using a micro-controller is much more easier than other methods. To generate PWM, the micro-controller have a built-in PWM module. But if there is no such PWM module then how can you generate PWM? Yes, in this article we are going to learn how we can generate a PWM signal if there is no such module built-in. Let’s start!

Disclaimer: Electricity is always dangerous. Skill required to work with electricity. Do work with your own risk. Author will not be responsible for any misuse or harmful act. This website contents is also copyright protected. Anything copied and directly posted in your website and claiming it as yours is prohibited and nonsensical. Author published all the articles as opensource to help you making your project and learning purpose only. Learn and make one for yourself. If need any help feel free to ask the author. Author will be helpful to you. Thanks.

What is PWM?

PWM is a method of reducing the average power delivery by an electrical signal. You can read about PWM from wiki.

As you see, the Pulse duration is the main in PWM. Here, the duty cycle is measured as the (total on time)/(Total on time + Total off time). This duty cycle can be varied keeping the total time (ON+OFF) fixed. That means the frequency is fixed. If the duty cycle is 0% that means there is not on time, only off time. And duty is 100% means there is no off time, only on time. Besides, a 50% duty cycle means 50% on time and 50% off time.

How can we generate PWM?

Usually, there is built-in module in micro-controllers. But not all the micro-controllers have this feature. When there is such a module, you can not generate PWM using the built-in modules. But you can use some programming skill to generate a PWM signal.

Using timer interrupt, we can generate a PWM signal from any micro-controller. The method is very simple. First, use a timer interrupt to call interrupt say 100 times per second. Then, count each interrupt and set it zero at 100, besides create a condition that until a duty (say 40 for 40%) the output is high, then the output is 0 until the counter is 0 again. So what will happen? Until 40 the pulse will be on and the rest 60 pulses will be off. So, we can get a 40% duty cycle at a frequency 1Hz. Now to increase this frequency simply increase timer interrupt speed i.e. reduce time.

Let’s do it in programming. but before that we need a test circuit.

Circuit diagram:


Program for, PWM generation using PIC12F675
Program Written by_ Engr. Mithun K. Das;
MCU:PIC12F675; X-Tal: 4MHz(internal). Compiler: mikroC pro for PIC v7.6.0
Date: 30-03-2021; ©
#define  pwm_pin     GP0_bit
unsigned int scale=0,duty=0;

void InitTimer0()
  OPTION_REG     = 0x80;
  TMR0           = 200;
  INTCON         = 0xA0;

void Timer_interrupt() iv 0x0004 ics ICS_AUTO
  if (TMR0IF_bit)
    TMR0IF_bit         = 0;
    TMR0         = 200; // change this value [0-255] to change the total frequency. 
        pwm_pin = 1;
        pwm_pin = 0;

void main()
  TRISIO = 0b00000000;//set I/O
  GPIO = 0x00;
  CMCON = 0x07;//comparator off
  ANSEL = 0b00000000;
         duty = 90;

  }//end of while(1)
}//end of void main


Here, duty can be set from 1 to 99. If you understand the concept and are smart to utilize this code, you can generate a range of PWM signal using this small micro-controller.


Duty = 10
Duty = 50
Duty = 90


If you read this article, I hope you can not generate your own PWM signal using similar micro-controllers too. Only one this you must keep in mind that, as you are using timer interrupt at high speed, other work will be slow. You must select suitable timing for your project between the general work and timer interrupt speed.

I hope this project was helpful to you. If you make one for yourself, it will be a great pleasure for me. Anywhere you need help, let me know. Please share this project and subscribe to my blog. Thank you.


Mithun K. Das; B.Sc. in EEE from KUET. Blog:


Asimiyu · March 31, 2021 at 2:37 pm

Hummm. Good work sir. I always learn new…new… things from your blog. I am very happy to see this. You are BLESSED ALREADY. continue your good work. How I wish I have the money to donate to your company. I love anything knowledge!!!.

    Mithun K. Das · April 1, 2021 at 3:12 am

    Thanks. Subscribe if you did not yet for more interesting articles.

Leave a Reply

Your email address will not be published. Required fields are marked *