110 lines
3.6 KiB
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;
|
|
|
|
}
|