|
Taner
Ранг: Новодошъл
Регистриран на: Пет Юли 08, 2005 3:46 pm Мнения: 112 Местоположение: Пловдив
|
Ето една подпрограма, която мери средната стоиност на мрежата и неговата честота, реализирана е с PIC18F2520,
написана на CCS PCWH.
int inv_mode, inv_mode_change, avg_counter, mppt_delta, v_out_delta, inv_on_off, mppt_blink;
int mppt_change, delta_change, avg_ok, positive, negative, up_start, down_start, freq_start, freq_stop;
int p_pv_mppt, v_pv_avg, i_pv_avg, v_ref_avg, v_ref_h, v_ref_l;
int v_avg_counter, i_avg_counter, v_out_avg_counter;
int v_grid_over_v_fault, v_grid_under_v_fault, grid_freq_fault, i_out_fault, i_in_fault, v_in_min_fault;
signed int delta_p_pv_mppt;
long v_grid_temp, i_out_temp, v_out_temp, v_pv_temp, i_pv_temp, v_ref_temp, grid_freq;
long charger_pwm, p_pv_old, green_led_blink;
const int write_command=0x11, shutdown_command=0x21, p_pv_delta=16, delta_min=32, delta_max=255, delta_v=16, delta_vout=32;
const int v_grid_max=180, v_grid_min=140, avg_count=32;
const int over_curr=145, short_curr=240, i_in_max=240, period_max=128;
const int v_in_max=200, v_in_max_stop=220, v_in_min=80, v_in_min_stop=60, v_out_ref=100, v_out_min=80, v_out_max=120;
const long grid_freq_max=26000, grid_freq_min=24000, green_led_blink_max=1024;
void grid_voltage_and_freq_detect(void)
{
int v_grid, v_grid_avg;
restart_wdt();
v_grid=adc_read(v_grid_ch);
if(v_grid>=v_ref_h) {
//v_grid -=v_ref_avg;
v_grid_temp +=v_grid;
positive++;
if(negative) {
negative=0;
up_start++;
//down_start=0;
}
}
else if(v_grid<=v_ref_l) {
v_grid=255-v_grid;
//v_grid=v_ref_avg-v_grid;
v_grid_temp +=v_grid;
negative++;
if(positive) {
positive=0;
//up_start=0;
down_start++;
}
}
if(up_start||down_start) {
if(!freq_start) {
set_timer1(0);
clear_interrupt(INT_TIMER1);
output_high(PIN_C6);
freq_start++;
}
else if(up_start==2||down_start==2) {
if(!freq_stop) {
grid_freq=get_timer1();
output_low(PIN_C6);
freq_stop++;
}
}
}
v_avg_counter++;
set_pwm1_duty(v_grid);
if(v_avg_counter>=period_max) {
v_grid_avg=v_grid_temp>>7;
v_grid_temp=0;
positive=0;
negative=0;
up_start=0;
down_start=0;
freq_start=0;
freq_stop=0;
output_low(PIN_C6);
//set_pwm1_duty(v_ref_avg);
//delay_ms(20);
//set_pwm1_duty(v_grid_avg);
//delay_ms(20);
//set_pwm1_duty(v_ref_avg);
//delay_ms(20);
//set_pwm1_duty(grid_freq>>6);
//delay_ms(20);
//set_pwm1_duty(v_ref_avg);
//delay_ms(20);
v_avg_counter=0;
if(v_grid_avg>v_grid_max) v_grid_over_v_fault++;
else {
if(v_grid_over_v_fault) v_grid_over_v_fault--;
else inv_state.over_v=0;
}
if(v_grid_over_v_fault>25) inv_state.over_v=1;
if(v_grid_avg<v_grid_min) v_grid_under_v_fault++;
else {
if(v_grid_under_v_fault) v_grid_under_v_fault--;
else inv_state.under_v=0;
}
if(v_grid_under_v_fault>25) inv_state.under_v=1;
if((grid_freq>grid_freq_max)||(grid_freq<grid_freq_min)) grid_freq_fault++;
else {
if(grid_freq_fault) grid_freq_fault--;
else inv_state.uneq_freq=0;
}
grid_freq=0;
if(grid_freq_fault>25) inv_state.uneq_freq=1;
if(inv_state.over_v||inv_state.under_v||inv_state.uneq_freq) inv_mode=1;
else inv_mode=0;
}
}
|