Files
dist_tester/src/e_avg_1t.c

110 lines
3.6 KiB
C

/*
* 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 <math.h>
#include <string.h>
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;
}