57 uint32_t freq_sum = 0;
58 uint16_t frequency = 0, max_demand = 0;
59 uint16_t Vrms[5] = {0}, Irms[5] = {0}, Nrms = 0;
60 int16_t p_mean = 0, Vmean = 0, n_mean = 0;
61 int32_t phase_mean=0, neutral_mean=0, volt_mean=0;
62 uint64_t phase_sum = 0, volt_sum = 0, neutral_sum = 0;
63 int64_t watts_sum = 0, watts_sum_neutral = 0,watts_sum_calib = 0;
64 uint16_t adc_samples = 0;
65 int32_t active_energy_signed = 0, neutral_power = 0;
66 uint16_t active_power[5] = {0},apparent_power = 0;
67 int16_t power_factor, offset[7] = {0};
68 int32_t volt_temp,ct_temp, shunt_temp;
69 volatile int16_t adc_read_ch0, adc_read_ch1;
70 int16_t lp_phase[LP_ORDER] = {0}, lp_power[LP_ORDER] = {0}, lp_volt[LP_ORDER] = {0};
71 uint8_t freq_cnt,offset_cnt = 0;
72 const int16_t lp_coeff[LP_ORDER] ={5252, 5568, 5728, 5728, 5568, 5252};
73 float pulse_energy_2_5ms = 0;
74 uint8_t pulse_count = 0,On_Time_counter = 0;
75 float pulse_energy_acc = 0;
87 SLEEP.CTRL &= ~SLEEP_SEN_bm;
94 pulse_energy_acc = pulse_energy_acc + pulse_energy_2_5ms ;
95 if(pulse_energy_acc >= ONE_PULSE_ENERGY_THRESHOLD)
97 pulse_energy_acc = pulse_energy_acc - ONE_PULSE_ENERGY_THRESHOLD;
99 PORTD.OUTSET = PIN0_bm;
101 On_Time_counter = PULSE_ON_TIME;
104 if(On_Time_counter !=0)
107 if(On_Time_counter == 0)
110 PORTD.OUTCLR = PIN0_bm;
122 SLEEP.CTRL &= ~SLEEP_SEN_bm;
135 SLEEP.CTRL &= ~SLEEP_SEN_bm;
157 SLEEP.CTRL &= ~SLEEP_SEN_bm;
158 int32_t i_temp, n_temp, v_temp;
159 int16_t lp_powerout = 0;
160 int16_t phase_read, neutral_read, volt_read, volt_read_filt1;
161 static int16_t volt_read_filt2 = 0;
164 phase_mean += (int32_t)adc_read_ch0;
165 lp_phase[0] = adc_read_ch0 - p_mean;
170 volt_mean += (int32_t)adc_read_ch1;
171 lp_volt[0] = adc_read_ch1 - Vmean;
175 volt_read = (int16_t)(meter.A1[
gain_stage] * (volt_read_filt1 + meter.B1[
gain_stage]*(
float)volt_read_filt2));
176 volt_read_filt2 = volt_read_filt1;
179 phase_sum += (uint64_t)((int32_t)phase_read * (int32_t)phase_read);
182 volt_sum += (uint64_t)((int32_t)volt_read * (int32_t)volt_read);
186 neutral_mean += (int32_t)neutral_read;
187 neutral_read -= n_mean;
189 neutral_sum += (uint64_t)((int32_t)(neutral_read) * (int32_t)(neutral_read));
192 i_temp = ((int32_t)meter.shunt_const[
gain_stage] * (int32_t)phase_read);
193 n_temp = (1583 * (int32_t)neutral_read)>>16;
194 v_temp = ((int32_t)meter.volt_const * (int32_t)volt_read);
195 lp_power[0] = ((int64_t)i_temp * (int64_t)v_temp)>>32;
197 watts_sum = watts_sum + lp_powerout;
198 watts_sum_neutral += (n_temp * v_temp);
211 int16_t lp_output = 0;
213 for (i = 0; i< LP_ORDER; i++)
214 lp_output += ((int32_t)lp_coeff[i] * (int32_t)*inp_array++)>>15;
216 for (i = LP_ORDER-1; i > 0; i--)
219 *inp_array = *(inp_array-1);
236 for(int8_t avg_count = 1; avg_count <4; avg_count++)
238 Irms[avg_count] = Irms[avg_count+1];
239 Vrms[avg_count] = Vrms[avg_count+1];
240 active_power[avg_count] = active_power[avg_count+1];
243 shunt_temp = (int32_t)((phase_sum/adc_samples)- meter.shunt_offset[offset_cnt]);
246 Irms[4] = ((meter.shunt_const[
gain_stage] * (int32_t)(sqrt(shunt_temp)*1000))>>16);
248 Irms[0] = ((int32_t)Irms[1] + (int32_t)Irms[2] + (int32_t)Irms[3] + (int32_t)Irms[4])>>2;
252 volt_temp = (int32_t)(volt_sum/adc_samples);
253 if(volt_temp < 35000)
255 Vrms[4] = ((meter.volt_const * (int32_t)(sqrt(volt_temp)*100))>>16);
257 Vrms[0] = ((int32_t)Vrms[1] + (int32_t)Vrms[2] + (int32_t)Vrms[3] + (int32_t)Vrms[4])>>2;
261 ct_temp = (int32_t) (neutral_sum/adc_samples);
264 Nrms = ( 1583 * (int64_t)((sqrt(ct_temp))*1000))>>16;
267 apparent_power = ((uint64_t)Vrms[0] * (uint64_t)Irms[0])/100000;
269 active_energy_signed = ((watts_sum + meter.watt_offset[offset_cnt]) / adc_samples);
270 watts_sum_calib = watts_sum;
274 active_power[4] = (uint16_t)(meter.watt_const[
gain_stage] * abs(active_energy_signed));
275 active_power[0] = ( (uint16_t)(active_power[1]) + (uint16_t)(active_power[2]) + (uint16_t)(active_power[3]) + (uint16_t)(active_power[4]) )>>2;
276 active_power[2] = active_power[0];
279 neutral_power = (watts_sum_neutral /adc_samples);
287 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
290 else if(Irms[4] > 500 && Irms[4] < 1500 &&
gain_stage != 5)
295 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
298 else if(Irms[4] > 1500 && Irms[4] < 2500 &&
gain_stage != 4)
303 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
306 else if (Irms[4] > 2500 && Irms[4] < 4000 &&
gain_stage != 3)
311 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
314 else if (Irms[4] > 4000 && Irms[4] < 7000 &&
gain_stage != 2)
319 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
322 else if (Irms[4] > 7000 && Irms[4] < 14500 &&
gain_stage != 1)
327 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
335 ADC_CH_INPUTMODE_DIFFWGAIN_gc,
340 if(active_energy_signed < 3 && active_energy_signed > -3)
356 power_factor = (int16_t)(1000 * (
float)active_power[0]/(float)apparent_power);
357 if(power_factor >1000)
359 apparent_power = active_power[0];
362 else if(power_factor < 0)
368 kwh_temp = ((float)(active_power[0])/3600000);
369 meter.kwh += kwh_temp;
370 pulse_energy_2_5ms = kwh_temp / 400;
374 Vmean = (int16_t)(volt_mean/adc_samples);
375 p_mean = (int16_t)(phase_mean/adc_samples);
376 n_mean = (int16_t)(neutral_mean/adc_samples);
386 watts_sum_neutral = 0;
401 freq_avg = (uint16_t)(freq_sum/freq_cnt);
402 frequency = (uint16_t)((F_TIMER *100) /freq_avg);
404 if(frequency > 10100 || frequency < 2000)
422 static uint8_t sign_flag = 0;
424 if(adc_read_ch1 < 0 && sign_flag != 0)
428 else if(adc_read_ch1 >= 0 && sign_flag != 1)
433 if(freq_val > FREQUENCY_MAX && freq_val < FREQUENCY_MIN)
435 freq_sum += freq_val;
452 for(
int j=0; j < 5; j++)
468 watts_sum_neutral = 0;