dodany kod c od Krzyska po wielu modyfikacjach przez Gemini zeby usunac zalezność od TI-RTOS
This commit is contained in:
109
src/e_avg_1t.c
Normal file
109
src/e_avg_1t.c
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user