dodany kod c od Krzyska po wielu modyfikacjach przez Gemini zeby usunac zalezność od TI-RTOS
This commit is contained in:
139
src/e_avg_dt.c
Normal file
139
src/e_avg_dt.c
Normal file
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* 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 <math.h>
|
||||
#include <string.h>
|
||||
|
||||
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;i<log->n;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;i<log->n10;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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user