/* * e_avg_1t.c * * Created on: 17-05-2016 * Author: Krzysztof Jakubczyk */ #include "tdefs.h" #include "misc.h" #include "e_avg_1t.h" #include "analog_in.h" #include #include int e_avg_1t_initlog(void *arguments, void *logic) { struct e_avg_1t_args *args = (struct e_avg_1t_args *)arguments; struct e_avg_1t_logic *log = (struct e_avg_1t_logic *)logic; // an_params=(struct analog_in_params *)*an_params_ptr; log->probka_ptr = (float *)(log_manager.nets_data + (args->io.probka_float_in >> 3)); if((u8 *)log->probka_ptr > (log_manager.nets_data + sizeof(log_manager.nets_data) - sizeof(float))) return -1; log->avg_t_ptr = (float *)(log_manager.nets_data + (args->io.avg_t_float_out >> 3)); if((u8 *)log->avg_t_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(float))) return -1; memset(&log->plus, 0x00, sizeof(log->plus)); memset(&log->minus, 0x00, sizeof(log->minus)); log->licz_zero = 0; memset(&log->stan_, 0x00, sizeof(log->stan_)); // zerowanie wyjsc return 0; } wylicz_f(struct e_avg_1t_logic *log, struct e_avg_1t_dane_wew *d) { float dopelnienie; float okres; //wyliczenie okresu pojedynczej iteracji dopelnienie = log->probka_n_minus1 / (log->probka_n_minus1 - log->probka_n_); okres = dopelnienie + d->reszta_ + d->il_p_; log->stan_.n++; // zmiana znaczika przejscia przez zero // log->stan_.Usr = d->war_sr_ / okres; //wartosc srednia wyprostowana log->stan_.Uperf = d->war_sr_;// wyliczenie ilorazu wartosci sredniej wyprostowanej z czestotliwoscia log->stan_.T = okres;// okres przebiegu w ilosciach probek d->reszta_ = 1 - dopelnienie; d->war_sr_ = 0; //zerowanie licznika wartosci sredniej wyprostowanej przy przejsciu przez zero d->il_p_ = 0;//zerowanie licznika pelnych probek(odliczanie nowego okresu) } void e_avg_1t(void *arguments, void *logic) { struct e_avg_1t_args *args = (struct e_avg_1t_args *)arguments; struct e_avg_1t_logic *log = (struct e_avg_1t_logic *)logic; u8 przejscie_z_plusa = 0; u8 przejscie_z_minusa = 0; log->probka_n_ = *log->probka_ptr;/* * (float)1.1107;*/ //szukanie przejsc przez zero if ((log->probka_n_minus1 <0 ) && (log->probka_n_ >= 0)) przejscie_z_minusa = 1; if ((log->probka_n_minus1 >0 ) && (log->probka_n_ <= 0)) przejscie_z_plusa = 1; // if(fabs(log->probka_n_)< 0.01) log->licz_zero++; else log->licz_zero = 0; if (log->plus.il_p_> ((MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10) || log->minus.il_p_ > ((MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10) || log->licz_zero > (MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)) { log->licz_zero = 0; log->stan_.n++; // zmiana znaczika przejscia przez zero log->stan_.Usr = 0; //wartosc srednia wyprostowana log->stan_.Uperf = 0;// wyliczenie ilorazu wartosci sredniej wyprostowanej z czestotliwoscia log->stan_.T = (MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10+1;// okres przebiegu w ilosciach probek log->plus.il_p_ = 0; log->minus.il_p_ = 0; } log->plus.war_sr_ +=fabs(log->probka_n_); //wyliczanie wartosci sredniej wyprostowanej za okres dla okresu od przejscia z plusa log->minus.war_sr_ +=fabs(log->probka_n_); //wyliczanie wartosci sredniej wyprostowanej za okres dla okresu od przejscia z minusa if(przejscie_z_plusa) { wylicz_f(log,&log->plus); // wyliczenie nowej czestotliwosci } else log->plus.il_p_++; if(przejscie_z_minusa) { wylicz_f(log,&log->minus); //wyliczenie nowej czestotliwosci } else log->minus.il_p_++; log->probka_n_minus1 = log->probka_n_;//zapamietanie poprzedniej probki //wskazniki[nast.adr.bufor] = (void *)&stan_; if(args->io.avg_t_float_out) *log->avg_t_ptr=log->stan_.Usr; }