The article will help the readers to use microcontroller for power factor measurement using a very simple external circuitry. The article will cover the design calculation, explanation of connection diagram and program to be embedded in microcontroller. In the end, the simulation results of designed power factor meter are presented with brief description.
One of the important quantities in the power system is the power factor. It is defined as
Ratio of active power to the total power in the system
Cosine of angle between voltage and current.
It is always expressed either in percentage or in decimal less than 1. It shows the part of total power consumed as by the load. It is kept near to unity or 100%.
The following figure shows the block diagram. For power factor measurement, two quantities are required to be monitored. One is current and second is voltage. High current and voltage can damage electronics component. Therefore they are step down by using their respective transformers.
The detail description and function of each block is given separately.
CT & PT
CT stands for current transformer. It is an electrical device which steps down the high current to low current with a certain ratio so that it can be used for measurement. Further details about working of CT can be found in the following link
VT stands for Voltage transformer. It also serves the same purpose as that of CT. It reduces the voltage level so that it can be used by delicate meters and other electronic devices. The detail description of VT can be found in my article
The current and voltage in power lines contain harmonics or noise which can lead to incorrect measurement of power factor. Therefore it is necessary to remove noise and harmonics from voltage and current signal before they are given to microcontroller. Active filters employ op-amps for this purpose. Connections of active filters can be seen in schematic diagram (later in article).
Zero crossing detectors.
As it is already been mentioned that power factor is the phase difference between voltage and current. These signals are sine waves having no sharp edges. However, to measure precise phase difference between two signals they must have sharp edges. So they are converted into square waves of the same frequency and time priod. It is achieved by using zero crossing detectors based on operational amplifier. Zero crossing detectors used in this circuit are shown in the schematic. Zero crossing detectors are op-amp comparators which compares the input signal with reference voltage which is zero in this case. So if the input signal is greater than 0, output is +5 and if input signal is less than 0, output signal is -5V.
Components which are required for power factor measurement are
- Capacitors (2.5uF, 1.25 uF)
- Resistors (1k, 2K) etc.
- Op-Amps (741)
- Microcontroller 16F877
- LCD (16×2)
Following figure shows the connection diagram
It can be seen from above figure that there are two input terminals. One is for current and second is for voltage. The signal applied to these input terminals must come from CT and PT.
Active filter is constructed using op-amp 741 along with resistors and capacitors. The values of resistors and capacitors define the cutoff frequency which is given by following equation.
Where R, R2, C1 and C2 are capacitors in the low pass filter.
Two Zener diodes are connected at the output of each zero crossing detector. Their function is to keep the output voltage at 5V maximum. Voltage above 5V can damage the microcontroller therefore Zener diode keep it under limit of 5V.
In order to verify our circuit, it is simulated in ISIS Proteus. For different values of phase difference, the results are displayed.
In the first case, Current lags the voltage by 30ᵒ.
LCD shows two results. First line shows the phase difference while the second line shows the power factor. Both the results shown by LCD are correct.
Now consider current is leading voltage by 30ᵒ
Now LCD shows phase difference of 330 (334 exactly) which means current is leading. Also power factor displayed by LCD is 0.8 which is correct.
The program for the power factor measurement using microcontroller is written in C language and compiled in MIKRO C.
|// LCD module connections|
|sbit LCD_RS at RB2_bit;|
|sbit LCD_EN at RB3_bit;|
|sbit LCD_D4 at RB4_bit;|
|sbit LCD_D5 at RB5_bit;|
|sbit LCD_D6 at RB6_bit;|
|sbit LCD_D7 at RB7_bit;|
|sbit LCD_RS_Direction at TRISB2_bit;|
|sbit LCD_EN_Direction at TRISB3_bit;|
|sbit LCD_D4_Direction at TRISB4_bit;|
|sbit LCD_D5_Direction at TRISB5_bit;|
|sbit LCD_D6_Direction at TRISB6_bit;|
|sbit LCD_D7_Direction at TRISB7_bit;|
|// End LCD module connections|
|unsigned int cnt_pf=0;|
|unsigned int sample;|
|unsigned int avg_pf;|
|unsigned int final_pf_cnt;|
|unsigned int i;|
|TMR0IF_bit = 0;|
|TMR0L = 0xCD;|
|else if(INT1IF_bit)||//first zerocrossing found|
|TMR0IE_bit = 1;||// enables timer0|
|TMR0IF_bit = 0;||// clear flag|
|cnt_pf = 0;|
|INT1IF_bit = 0;||// clear flag for INT1|
|else if (INT0IF_bit)||// second zerocrossing found|
|TMR0IE_bit = 0;||//disable timer0|
|TMR0IF_bit = 0;||// clear flag|
|INT0IF_bit = 0;||//clear flag for INT0|
|sample[i] = cnt_pf;|
|i = 0;|
|final_pf_cnt = avg_pf;|
| char message1 = “pf: %”;
char message2 = “powerfactor: “;
|TRISA = 0XFF;// All input|
|TRISB0_bit = 1;//set as input|
|TRISB1_bit = 1;//set as input|
|// ADC initialization…|
|ADCON0 = 0x00;// all digital inputs|
|ADCON1 = 0xFF;|
|// Initialize LCD configuration…|
|Lcd_Cmd(_LCD_CLEAR);||// Clear display|
|Lcd_Cmd(_LCD_CURSOR_OFF);||// Cursor off|
|// interrupt enable settings…|
|//Timer0 settings for 10us timer|
|T0CON = 0xC8;|
|TMR0L = 0xCD;|
|GIE_bit = 1;||//global interrupt enable|
|TMR0IE_bit = 1;||//enable timer0|
|TMR0IF_bit = 0;||//cler flag|
|// Int0 settings…|
|INT0IE_bit = 1;||//enable INT1|
|INTEDG0_bit = 0;||//interrupt on falling edge|
|INT0IF_bit = 0;||//clear flag|
|// INT1 settings…|
|INT1IE_bit = 1;||//enable INT1|
|INTEDG1_bit = 0;||//interrupt on falling edge|
|INT1IF_bit = 0;||//clear flag|
|message1 = final_pf_cnt/1000+48;|
|message1 = (final_pf_cnt/100)%10 +48;|
|message1 = (final_pf_cnt/10)%10 +48;|
|message1 = final_pf_cnt%10 +48;|
| angle = cosE3(final_pf_cnt);
tlong = ((angle));
message2 = (tlong/1000)%10 +48;
message2 = ‘.’;
message2 = (tlong/100)%10 +48;
message2 = (tlong/10)%10 + 48;
message2 = (tlong) + 48;
If you have any questions please ask in comments.