/* * e_avg_dt.c * * Created on: 31-05-2016 * Author: Krzysztof Jakubczyk */ #include "tdefs.h" #include "misc.h" #include "config.h" #include "e_avg_dt.h" #include "analog_in.h" #include #include int e_avg_dt_initlog(void *arguments, void *logic) { struct e_avg_dt_args *args = (struct e_avg_dt_args *)arguments; struct e_avg_dt_logic *log = (struct e_avg_dt_logic *)logic; struct analog_in_params *an_params; u32 *an_params_ptr; u32 *buf_ptr; an_params_ptr = (u32 *)(log_manager.nets_data + (args->io.param_an_ptr_in >> 3)); if((u8*)an_params_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(void *))) return -1; if(!*an_params_ptr) // param in not connected or wrong elements order (analog_in should be run before) return -1; an_params=(struct analog_in_params *)*an_params_ptr; buf_ptr = (u32 *)(log_manager.nets_data + (args->io.buf_u16_ptr_in >> 3)); if((u8*)buf_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(void *))) return -1; if(!*buf_ptr) // param in not connected or wrong elements order (analog_in should be run before) return -1; log->buf_ptr=(u16*)*buf_ptr; log->avg_dt_ptr = (float *)(log_manager.nets_data + (args->io.avg_dt_float_out >> 3)); if((u8 *)log->avg_dt_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(float))) return -1; memset(&log->bufor, 0x00, sizeof(log->bufor)); // zerowanie bufora pamieci srednich wartosci za polokresu log->n = (short)(args->params.dt * (SAMPLES_PER_MS*1000)); // przeliczenie milisekund na ilosc probek log->mnoznik = an_params->multiplier/log->n; log->n10 = (short)(args->params.dt * (1000/LOOP_CYCLE_MS) / (MAIN_FREQ_PERIOD_MS/2)); // ilosc polokresow usredniania log->mnoznik10 = an_params->multiplier / log->n10 / (SAMPLES_PER_MS*10); log->licznik_polokresow = 0; log->licznik_probek = 0; log->zakres = 1; if (log->n > (SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS*2)) log->zakres = 0; *log->avg_dt_ptr = 0; log->offset = 32767 + an_params->offset; log->offset10 = log->offset * log->n10 * (SAMPLES_PER_MS*10); return 0; } void e_avg_dt(void *arguments, void *logic) { struct e_avg_dt_args *args = (struct e_avg_dt_args *)arguments; struct e_avg_dt_logic *log = (struct e_avg_dt_logic *)logic; float wynik; float pr; int i; if(log->zakres) //jesli nastawa mniejsza od wielkosci bufora probek - srednia co i probka { wynik = 0; log->licznik_probek = bus_an_cur_sample_num; for (i=0;in;i++) { pr = (float)log->buf_ptr[log->licznik_probek] - log->offset; wynik += fabs(pr);//(float)log->buf_ptr[log->licznik_probek]; log->licznik_probek--; if(log->licznik_probek<0) log->licznik_probek +=(SAMPLES_PER_MS*2*MAIN_FREQ_PERIOD_MS); } //wynik -= log->offset; wynik *= log->mnoznik; if(args->io.avg_dt_float_out) *log->avg_dt_ptr=wynik; } } void e_avg_dt_100hz(void *arguments, void *logic) { struct e_avg_dt_args *args = (struct e_avg_dt_args *)arguments; struct e_avg_dt_logic *log = (struct e_avg_dt_logic *)logic; float wynik; float pr; int i; if (!log->zakres) { // jezeli nastawa wieksza od bufora probek - srednia co polokresu log->licznik_probek = bus_an_cur_sample_num; wynik = 0; for (i=0;i<(SAMPLES_PER_MS*10);i++) // wyliczenie sredniej za ostatnie polokresu { pr = (float)log->buf_ptr[log->licznik_probek] - log->offset; wynik += fabs(pr); log->licznik_probek--; if(log->licznik_probek<0) log->licznik_probek +=(SAMPLES_PER_MS*2*MAIN_FREQ_PERIOD_MS); } if(log->licznik_polokresow<20) log->bufor[log->licznik_polokresow] = wynik; wynik = 0; // wyliczenie sredniej za czas nastawiony for (i=0;in10;i++ ) { wynik += log->bufor[i]; } //wynik -= log->offset10; wynik *= log->mnoznik10; // log->licznik_polokresow++; if(log->licznik_polokresow>log->n10) // aktualizacja wskaznika bufora { log->licznik_polokresow = 0; } if(args->io.avg_dt_float_out) *log->avg_dt_ptr=wynik; } }