Power factor measurement using ATmega8 /16

Power factor measurement using Atmel AVR Micro-Controllers

To learn about the power factor measurement, you should have a basic knowledge of power factor. There are three types of loads.

  1. Resistive
  2.  Inductive
  3. Capacitive

When we apply AC voltage to resistive loads it will not change the current wave form. But inductive loads will force to lag the current waveform and in the case of capacitive loading it will force to lead the current waveform than voltage waveform.

You can see the waveforms of inductive load. The phase shift of 30 degree is present in the current waveform.

Inductive Load Waveform
Figure 1: Inductive Load Waveform

The power factor is basically the “angle cosine of that lagging current". In simple words, current is lagging by voltage with some angle and if we take the cosine of that angle we will get power factor.

Now how to get that lagging angle? This is only problem left here. If somehow we can measure the time difference of both waveforms then we can find our required angle by using the formula below:

Time difference to angle equation

Where frequency (f) is the frequency of the system which may be 50 or 60 Hz.

Zero Cross Detection:

Zero cross detection is a method which can enable us to measure the time between voltage and current. In this technique we get a high value (i.e. 1) whenever a zero will cross the system. There are many ways to implement it. But remember, this technique is the heart of this project so implementation must be accurate. In this project we implemented zero crossing using LM358 an 8 pin IC having dual amplifiers in it. In zero crossing, we have to get a “high” value during crossing of zero in waveforms. So to get  that  value  we  use  amplifier  as  a  comparator  which  will  compare  the  non  inverting reference value and then act accordingly.

Power Factor Simulation Diagram
Figure 2: Simulation Diagram

We will use a 16x2 LCD to show our results and ATmega 8 or ATmega16 can be used for the project. In the simulation, take upper sine generator as output of Potential Transformer (PT) and lower sine generator as output of Current Transformer (CT). The reason behind using CT and PT is, we cannot give high voltage to the IC LM358. It will burn the IC badly. So first step down the voltage and step down the current at such extent that the highest peak of current and voltage is not more than 5V. If you have no idea of using CT and PT in the real systems then see the links below.

1.AC Voltage Measurement Using Atmel AVR Microcontroller

2. AC Current  Measurement Using Atmel AVR Microcontroller

Now comeback to the zero crossing method, you can see that we set the reference value of zero volts at non - inverting pin (+) of both amplifiers. So, according to comparator action it will give us high value (1) at the output whenever a zero will cross in the waveform.  The output of comparators is shown below in the figure in which yellow is the output of voltage and blue is the output of current having some lag.

Zero Cross detection
Figure 3: Output of comparators (Zero Crossing)


Components required for Power Factor Measurement
Figure 4: Components required (Power Factor Meter)


Circuit Diagram of Power Factor Meter
Figure 5: Complete circuit diagram (power factor meter)

I implemented a voltage divider with PT because the output of PT will be 6 volt. 6 volt PT have peak of 1.4*6 = 8.4 volts which is harmful for the IC. So I placed a voltage divider to cut the peak to the 4.2 volts.  The resistor present in front of the CT is burden resistor which is essential for CT. We never leave secondary of CT as open circuit.

Components Needed:

Click on the component name to buy the product from reliable sources:

Coding part:

The code is written on codevision. You can download whole code from the link present below. If you want code for Atmel Studio email us. Here we will discuss two main functions of code.

//_________function to get the time difference_____________

void pf_func(){
if ( PINC.4==1 ){
TCCR1B = 0x01; // Start timer at Fcpu/1
else {
if ( PINC.3 == 1 ){
TCCR1B = 0x00; //Stop timer
else {

In this function, I started the Timer1 of microcontroller when zero crossing of voltage occurs at PINC.4 and turned off the Timer2 at PINC.5 when zero crossing of current occurs. “g variable” has the final time count of the difference.

//________function to calculate the power factor______

int powerfactor(){
// To complete number of counts
g=g+1; //Value from the timer
//To convert into seconds
//To convert into radians
//power facor
pf = cos(pf);
//power factor into percentage
return k;

In this function, I just converted the delay into seconds and then converted that seconds into angle using the formula I mentioned above.

Warning: If you know how to handle electricity then implement this project with precautions. Don't use any component without understanding completely about it.

If you need more help feel free to comment below and don't forget to like our facebook page.

To download the proteus file and complete code click the buttons below. 

Complete Code Proteus File

Ismail Sarwar

Electrical engineering is my profession, my hobby and my passion. I completed bachelors of electrical engineering in 2015. Currently I am working with an Electric Utility Company. Power Electronics, Embedded Systems and Energy Metering are my fields of specialization. In free time I listen music and watch movies.

56 thoughts to “Power factor measurement using ATmega8 /16”

  1. i instilled "atmel studio" but it gives an error "reciep for target 'main.o' failed" while building the same programe...
    what i have to do now.
    please help me any one...

    thanks in advance

  2. hello sir!
    while building this code on ''MicroC PRO for AVR'' it gives error in #include and
    #include ,
    i think these file are not present in its source files...
    i need your help, please give me suggestion ,

  3. Sir as I extracted above file there are 3 file .dbk .dsn and .pwi so which file is associated with proteus schematic please help me

  4. In above senario most probably it will work according
    But what for capacitive load, in which current leads and there's 1 on pin 3 first so timer will give wrong durations
    What do u think??

    1. Yes you are right. But the issue is capacitive load is not a real world thing. It's just an ideal assumption for calculations. You cannot achieve capacitive load while doing work on practical things.

  5. Hi Ismail, i used your code on16f877a pic controller but it dosent gets out of loop function,
    Any idea what might be the problem?? Any kind of help will be greatly appreciated
    Thanks in Advance!!

  6. sir i have burned the hex file given in the folder but it is not working,. what should i do now ? please help me . kindly mail me the atmel studio code of this project that can be burn and can be implement.

  7. Sir, I have used some of the pins of the arduino for other measuring purposes. how do i know which pin is to be connected for powerfactor? can you please provide the code that we usually use in arduino IDE. Please.

    1. No I can't provide you that. Instead you should study some basics of Atmel AVR microcontrollers and how to control thier pins.

  8. Hi,, Please do help me. Its very urgent. I would like to find the powerfactor as a part of my project. Circuits are available. but I couldnt make a program for the same. I am using aTmega 328 p. And the code given above is entirely different language than I use. please do provide me a program and circuit for measuring power factor. My main project is based on Demand Response .. email id- pranavs405@gmail.com ..

  9. i used dtostr in order to convert the float pf value into string, but its giving an error
    "undefined reference to dtostr"

  10. Sir. I read this given article but in this article only explain about the relay. i want programming of ATMEGA8 for conditions if pf less than 0.8 then PD0 (pin no.-2) goes high.

    how to apply this logic in ATMEGA8 programming ?

    " If pf<0.8 then PD0 (pin no.-2) goes HIGH else PD0 goes LOW "

    Cause I don't know how to apply pf<0.8 and how to enable PD0 (pin no.-2) in ATMEGA8.

    Thank you.

  11. Sir. Which instructions can i use if pf is less than 0.7 then pin-0 of port-D goes high and connect the capacitor through the relay for improving pf.
    Any examples ?

  12. Thank you so much sir.

    It is worked power factor indicate between 0 to 1.

    It took some minor changes.
    Just this three lines are removed and it is worked.


  13. k=abs(ceil(pf*100));

    This code is used for converting pf into percentage right.

    If i remove this line then simulation not work.

    How to get pf in between 0 to 1 ??

  14. Sir. Is it required in this programme to convert pf into percentage ??

    Because i put this line ftoa(x,2,buf);
    Instead itoa but power factor indicates 88.00 instead it must be like 0.88

  15. Thank u Ismail​ sir. For your quick reply.

    Can u send me the code for measuring Power factor between 0 to 1. And if the Power factor is bellow 0.8 then i want any output pin of ATMEGA goes High for improving the power factor by connecting capacitor.
    Because i don't know about the programming.

    Please help me sir.
    Send me the code on my mail.

  16. Hello, sir

    I want the power factor in between 0 to 1 not in percentage.

    What can i do ??
    What changes can i make in this programme​ ???

    1. pf = cos(pf); Take pf from this line and through ftoa function convert pf to character type and then display it on LCD.

  17. sir.. good day to you... i have a question pertaining to the connection of PT and CT in between the load and source, if i substitute all of the PT and CT circuit with a voltage sensor and current sensor and fed it to the arduino will it work ?

    1. In timer counter formula of Atmel AVR, you will see a '-1'. It is the reason, I am adding +1 to complete the number of counts.

  18. Sir can you give a suggestion for the CT ? like a brand link or Amazon link ? Because i didnt find the "1:1500" ct at the stores..I mean i didt get actually,which CT is i have to use for this project?

    1. You can change this code for atmel studio. A little bit hard work will be required which will help you further in understanding the things as well.

          1. Put different serial commands in loops and try to figure out at which loop and at which state of comparators you are having issue.

What do you think?