Energy Metering Engineering

1. Di/Dt current sensor simulation

To understand di/dt current sensing in the energy meter application, We simulate it by using the schematic as fingure below. 

 - Harmonic wave form f(x)=1.sin(x) + 0.3 sin(3x) + 0.1sin(5x) after pass di/dt function will be swing as r2_1 wave form fater that it be restored by integral circuit.

-  Output wave form quality be affected by RC components (filter factor). 

-  For good in practice the OPAMP-OP07 should be select to reject dc offset component

2. di/dt in practice use OP07 OPAMP

- Blue wave: Current wave form measured by current transofrmer

- Red wave: Current wave form measured by di/dt current transofrmer after integral by OP 07

Schematic

(I will post later)

3. Three phase voltage sensing with resistor divider

3.1 Schematics:

To measure high voltage without using transformer, the resistor divider is the best choise and realiability. In the RDLAB, We had applied this schematics to major our project in the three phase system section

Figure 3.1: Three phases voltage sensing use resistor

3.2 Wave form 

Look on the figure 2.2, in the case of 50% rate voltage V1 and V2 the measurement show that voltage sensing is high accuracy as it is

Fingure 3.2: Wave form of voltage in the case of imbalance system

Electro-Labs

February 6, 2015

Have you ever been curious about the power consumption of an appliance? For example did you wonder how much it will cost you to leave your television in standby mode whole night? Or did you want to learn how much change your refrigerator settings will make on your electric bill? If your answer is yes, you can use a wattmeter to measure the power consumption of a device. In this project we are building one.

This is an AC Watt Meter which can measure the real power consumption of a device connected to the 230Vrms/50Hz mains line. The PIC microcontroller collects the voltage and the current information with the help of ADCs and then calculates the RMS voltage of the mains line, RMS current drawn by the device and the resulting average power consumption. All these information is then displayed on the dot matrix LCD.

The meter itself doesn’t need an external power source. It is powered from the mains. Despite this, the microcontroller side is fully isolated from the parts interfacing to the mains.

Circuit Design

The schematic of the project is drawn in SoloCapture, the schematic editor of SoloPCB tools. SoloCapture makes the schematic drawing process very easy and fast. You can download SoloPCB tools at Fabstream.com for FREE.

You can download the SoloPCB design files of the project by using the link below.

Please check out this video to see how to import the project libraries, open and synchronize the schematic and PCB files.

To calculate the power, we need to know the voltage across the load and the current drawn by the load. The voltage that should be measured is directly the mains voltage. We know that the mains voltage is 230Vrms/50Hz but it has a 10% tolerance. So the voltage can change between 207Vrms and 253Vrms. To make an accurate power measurement, it will be better to measure the mains voltage instead of putting 230Vrms into the calculations.

The mains line is connected to the AC IN connector (J1). For the voltage measurement, a resistor divider network (R1, R2, R3) is connected between the phase and the neutral lines.  With the help of the voltage divider, the mains voltage is down scaled at a factor of R1/(R1 + R2 + R3) = 1/201 which converts ±320V (peak) to ±1.59V. Then 2.5V up shifting is applied which finally maps ±320V to 0.91V – 4.09V that nicely fits between 0-5V with a good level of safety margin.

After this scaling and shifting process, the voltage across R2 is read by MCP3202 ADC. Then the voltage information is read by the microcontroller in 12 bit format over SPI interface. To isolate the microcontroller part from the section interfacing to the mains, HCPL-0630 high speed optocouplers are used. The second analog input channel of MCP is used to read the 2.5V reference voltage and use it as the correction factor in the calculations.

While the neutral and earth lines coming from the AC IN connector are directly connected to the AC OUT connector (J2), the phase line is passing through the ACS712-20A  hall effect based current sensor (U4) for the purpose of current measurement. The sensor outputs 2.5V at 0A. When current flows between the IP+ and IP- terminals, the sensor output changes at a rate of 100mV/A. So the output voltage becomes 4.50V at +20A and 0.500V at -20A. The sensor output is read by another MCP3202 and sent to the microcontroller over SPI.  The ACS712 provides internal isolation so no external precaution is required for isolation.

ACS712-20A is capable of reading ±20A. But considering the current limitations of the terminal blocks and the fuse holder, the AC current path is protected by a 16A fuse which is connected in series to the phase line.

There are two isolated 5V sources to power the mains and the microcontroller sides. The transformer generates 2x6Vrms from the 230Vrms. Each output is rectified by the bridge diodes and then regulated by the 78L05 linear regulators. D2 and D3 are the LEDs indicating the status of each 5V.

The microcontroller of the wattmeter is PIC18F252. Basically it reads the voltage and the current and calculates the RMS voltage, the RMS current and the average power. Then it interfaces with the LCD and shows all these values. It has a hardware SPI module which lets communicating with the MCP3202 ADCs. On the other hand it interfaces to the LCD over 4-bit or 8-bit interface.  The microcontroller’s master clock becomes 5Mhz when 20Mhz crystal oscillator is used. There is an onboard ICSP connector (J3) which is used to program the PIC.

PCB Design

The PCB of the project is designed in SoloPCB. SoloPCB is a pack of powerful tools consisting of schematic capture, PCB layout, and integrated autorouting. You can download SoloPCB tools at Fabstream.com for FREE and start using immediately.

You can download the SoloPCB design files of the project by using the link below.

Please check out this video to see how to import the project libraries, open and synchronize the schematic and PCB files.

Designing the wattmeter as a handheld device was a good idea. The outline of the PCB was drawn accordingly. Autocad was used to draw the outline and the .dxf file was imported in SoloPCB.

All the footprints which are not included in the SoloPCB libraries were created manually. They can be found in the SoloPCB design files.

The lines (phase, neutral and earth) connecting AC IN connector to AC OUT connector were drawn as thick as possible.  The bypass capacitors are placed as close to the ICs as possible. Two separate ground planes are drawn for AGND and DGND to keep the ground resistance low.

All the components were placed at the top layer. An acrylic cover was planned to use as a cover for both the top and bottom layers. So the height of the bottom layer would be as low as possible.

Software

Basically the MCU reads the voltage and the current samples every 1 ms and collects 40 sample pairs which means two periods for the 50Hz. Then calculates the RMS values and the average power. 1ms period is generated by using the Timer A module. The module runs in 16 bit mode and generates an interrupt at each overflow. So we assign a start value in each cycle and wait for the 1ms trigger.

After collecting all of the samples, the calculation processes begin. The RMS voltage is calculated by using the equation below,

The RMS current is also calculated by using the same equation.

The voltage and the current samples include the phase relation between the voltage and the current. So active (real) AC power which is V * I* cosθ can be achieved by calculating the average power by using the equation below.

Calculated RMS and power values are displayed on the LCD by using the lcd.h library of CCS C compiler.

The whole CCS C code is provided at the end of the article.

Assembly and Test

The part list of the project is given below

 

You can see the power consumption of a solder station while heating up below.

You can see another measurement below. 2KW water boiler is connected to the meter.

PIC Code

The PIC code is written in CCS C compiler.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

#include <18F252.h>

#device ADC=16

 

#FUSES NOWDT                    //No Watch Dog Timer

#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale

#FUSES NOBROWNOUT               //No brownout reset

#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

 

#use delay(crystal=20000000)

#define ADC0_EN   PIN_C2

#define ADC1_EN   PIN_C6

 

#INCLUDE

 

#define LCD_ENABLE_PIN PIN_A0

#define LCD_RS_PIN PIN_A2

#define LCD_RW_PIN PIN_A1

#define LCD_DATA4 PIN_B4

#define LCD_DATA5 PIN_B5

#define LCD_DATA6 PIN_B6

#define LCD_DATA7 PIN_B7

 

#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H)

 

#include

 

char read_count=0;

char tick=0;

unsigned int32 adc_accum_v=0;

unsigned int32 adc_accum_i=0;

 

unsigned int16 adc0_ref=0;

unsigned int16 adc1_ref=0;

 

float rms_v=0;

float rms_i=0;

 

float rms_v_cor=1.04245;

 

float rms_v_accum=0;

float rms_i_accum=0;

 

float adc0_step=0;

 

unsigned int32 adc_value_v[41];

unsigned int32 adc_value_i[41];

 

unsigned int32 sampling_period=60536; // 65536-60536=5000 >> 5000x200ns=1ms

 

float apparent_power=0;

float average_power_accum=0;

float vi_accum=0;

 

char i,k;

 

#INT_RTCC

void  RTCC_isr(void)

{

 

set_rtcc(sampling_period);

tick=1;

read_count++;

return;

}

 

void initialize() {

   setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64);

   lcd_init();

  

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);      //13.1 ms overflow

  

   output_high(ADC0_EN);

   output_high(ADC1_EN);

      

}

 

 

unsigned int16 mcp3202_read(char adc_no, char ch_no) {

 

   unsigned int16 reading = 0;

   unsigned char MSbyte=0x00;

   unsigned char LSbyte=0x00;

 

 

   // Chip Select

   if (adc_no==0) {output_low(ADC0_EN);}

   else {output_low(ADC1_EN);}

 

   // Send Start Bit

   Spi_Write(0x01);

 

 

   // Channel Select and Read High Byte

   if (ch_no==0) {MSbyte=Spi_Read(0xA0);}

   else {MSbyte=Spi_Read(0xE0);}

 

 

   // Read Low Byte

   LSbyte=Spi_Read(0x00);

 

   // Join the Bytes

   reading=make16((MSbyte & 0x0F),LSbyte);

 

   output_high(ADC0_EN);

   output_high(ADC1_EN);

 

   return reading;

}

 

void main()

{

   delay_ms(100);

  

   initialize();

  

   adc1_ref = 2048;

   adc0_ref = mcp3202_read(0,1);

   adc0_step = 2.5/adc0_ref;

  

   k=0;

  

   while (1) {

      

      set_rtcc(sampling_period);

      enable_interrupts(INT_RTCC);

      enable_interrupts(GLOBAL);

      

      while (read_count<40) {

      

         while(tick==0) {}

         tick=0;

 

         adc_value_v[read_count-1] = mcp3202_read(0,0);

         adc_value_i[read_count-1] = mcp3202_read(1,0);

 

      }

      

      

      disable_interrupts(INT_RTCC);

      disable_interrupts(GLOBAL);

      read_count=0;

 

    

      for (i=0;i<40;i++) {

        

         if (adc_value_v[i]>=adc0_ref) {adc_value_v[i] = adc_value_v[i] - adc0_ref;}

         else {adc_value_v[i] = adc0_ref - adc_value_v[i];}

        

         if (adc_value_i[i]>=adc1_ref) {adc_value_i[i] -= adc1_ref;}

         else {adc_value_i[i] = adc1_ref - adc_value_i[i];}

  

        

         adc_accum_v +=  (adc_value_v[i] * adc_value_v[i]);

         adc_accum_i +=  (adc_value_i[i] * adc_value_i[i]);    

        

         vi_accum += ((adc_value_v[i]*adc0_step*201) * rms_v_cor) * (adc_value_i[i] * ((5/4096)/0.100))  ;

       }

      

      

      average_power_accum += vi_accum /40;

      

      vi_accum=0;

      

      rms_v = ((sqrt(adc_accum_v /40))*adc0_step*201) * rms_v_cor ;

      rms_i = sqrt(adc_accum_i /40) * ((5/4096)/0.100);

      

      rms_v_accum += rms_v;

      rms_i_accum += rms_i;

      

      k++;

      

      if (k == 20) {

         k=0;

        

         printf(lcd_putc,"\f%3.1f V",(rms_v_accum/20));

         lcd_gotoxy(9,1);

         printf(lcd_putc,"%2.2f A",abs(((rms_i_accum/20) - 0.1)));

        

         lcd_gotoxy(5,2);

  

         printf(lcd_putc,"%4.1fW",average_power_accum/20);

        

         rms_v_accum=0;

         rms_i_accum=0;

        

         average_power_accum=0;

     }

 

      adc_accum_v=0;

      adc_accum_i=0;

      

 

      

   }

 

}