Razvalyaev
7e0063eee0
Все основные файлы подтянуты без изменений Изменены (только папка main_matlab): - заглушки для ненужных функций (main_matlab.c) - iq библиотека (IQmathLib_matlab.c) - библиотеки DSP281x
266 lines
9.7 KiB
C
266 lines
9.7 KiB
C
/*
|
|
* calc_rms_vals.c
|
|
*
|
|
* Created on: 14 äåê. 2020 ã.
|
|
* Author: star
|
|
*/
|
|
#include <adc_tools.h>
|
|
#include <calc_rms_vals.h>
|
|
#include <edrk_main.h>
|
|
#include <params_norma.h>
|
|
#include <params_pwm24.h>
|
|
|
|
#include "IQmathLib.h"
|
|
#include "mathlib.h"
|
|
|
|
#define NUM_OF_CHANNELS 6
|
|
|
|
//#define USE_CALC_U_IN_RMS 1
|
|
//#define USE_CALC_I_OUT_RMS 1
|
|
|
|
|
|
#pragma DATA_SECTION(in_U_rms_calc_buffer,".slow_vars")
|
|
RMS_BUFFER in_U_rms_calc_buffer[NUM_OF_CHANNELS] = {RMS_BUFFER_DEFAULTS, RMS_BUFFER_DEFAULTS, \
|
|
RMS_BUFFER_DEFAULTS, RMS_BUFFER_DEFAULTS, \
|
|
RMS_BUFFER_DEFAULTS, RMS_BUFFER_DEFAULTS};
|
|
|
|
#pragma DATA_SECTION(out_I_rms_calc_buffer,".slow_vars")
|
|
RMS_BUFFER_WITH_THINNING out_I_rms_calc_buffer[6] = {RMS_BUFFER_WITH_THINNING_DEFAULTS, RMS_BUFFER_WITH_THINNING_DEFAULTS, \
|
|
RMS_BUFFER_WITH_THINNING_DEFAULTS, RMS_BUFFER_WITH_THINNING_DEFAULTS, \
|
|
RMS_BUFFER_WITH_THINNING_DEFAULTS, RMS_BUFFER_WITH_THINNING_DEFAULTS};
|
|
|
|
///////////////////////////////////////////////////
|
|
void init_Uin_rms(void)
|
|
{
|
|
int k,l;
|
|
// ÷èñòêà áóôåðà íóëÿìè è íå òîëüêî
|
|
for (k=0;k<NUM_OF_CHANNELS;k++)
|
|
{
|
|
for (l=0;l<RMS_BUFFER_SIZE;l++)
|
|
in_U_rms_calc_buffer[k].values[l] = 0;
|
|
in_U_rms_calc_buffer[k].position = 0;
|
|
in_U_rms_calc_buffer[k].array_size = RMS_BUFFER_SIZE;
|
|
}
|
|
}
|
|
///////////////////////////////////////////////////
|
|
|
|
void add_to_buff(RMS_BUFFER *b, _iq val) {
|
|
b->values[b->position++] = val;
|
|
if (b->position >= b->array_size) { b->position = 0;}
|
|
}
|
|
|
|
#define add_to_buff_def(b, val) { (b)->values[(b)->position++] = (val); if ((b)->position >= (b)->array_size) { (b)->position = 0;}}
|
|
|
|
static void calc_Uin_rms(void);
|
|
static void calc_Iout_rms(void);
|
|
|
|
#define CONST_PI 52707178
|
|
|
|
//#pragma CODE_SECTION(fill_rms_array_IQ15,".fast_run1");
|
|
void fill_rms_array_IQ15(RMS_BUFFER_WITH_THINNING *v) {
|
|
static _iq norma_f_rot = NORMA_FROTOR;
|
|
int period_by_teta = 0;
|
|
// int freq = _IQtoF(v->signal_freq) * NORMA_FROTOR;
|
|
// int freq = _IQtoF(v->signal_freq * norma_f_rot); //Max IQ24 = 127. ×àñòîòà â Ãö îáû÷íî ìåíüøå
|
|
int freq = (v->signal_freq * norma_f_rot) / (1LL << GLOBAL_Q); // 10 ðàç áûñòðåå, ìåíüøå òî÷íîñòü
|
|
int count_miss_writing = 100;
|
|
if (freq != 0) {
|
|
freq *= v->elements_in_period; //"îïòèìèçàöèÿ"
|
|
count_miss_writing = (int)(v->freq_pwm / freq);
|
|
if (count_miss_writing > 100) {count_miss_writing = 100;}
|
|
}
|
|
|
|
if (v->use_teta) {
|
|
v->internal.teta_period_counter += 1;
|
|
if ((v->teta < CONST_PI && v->internal.teta_prev > CONST_PI) ||
|
|
(v->teta > CONST_PI && v->internal.teta_prev < CONST_PI)) {
|
|
v->internal.zero_teta_period = v->internal.teta_period_counter;
|
|
v->internal.teta_period_counter = 0;
|
|
}
|
|
v->internal.teta_prev = v->teta;
|
|
period_by_teta = v->internal.zero_teta_period / v->elements_in_period;
|
|
if (period_by_teta != 0) {
|
|
count_miss_writing = (count_miss_writing + period_by_teta) / 2;
|
|
}
|
|
}
|
|
|
|
|
|
if (v->internal.miss_write_counter++ < count_miss_writing) {
|
|
return;
|
|
}
|
|
|
|
v->internal.miss_write_counter = 0;
|
|
v->values[v->position++] = _IQtoIQ15(v->val);
|
|
if (v->position >= v->array_size) {
|
|
v->position = 0;
|
|
}
|
|
}
|
|
|
|
void fill_RMS_buff_interrupt(_iq teta_ch1, _iq teta_ch2) {
|
|
#ifdef USE_CALC_U_IN_RMS
|
|
// add_to_buff(&in_U_rms_calc_buffer[0], analog.iqUin_A1B1);
|
|
// add_to_buff(&in_U_rms_calc_buffer[1], analog.iqUin_B1C1);
|
|
// add_to_buff(&in_U_rms_calc_buffer[2], analog.iqUin_C1A1);
|
|
// add_to_buff(&in_U_rms_calc_buffer[3], analog.iqUin_A2B2);
|
|
// add_to_buff(&in_U_rms_calc_buffer[4], analog.iqUin_B2C2);
|
|
// add_to_buff(&in_U_rms_calc_buffer[5], analog.iqUin_C2A2);
|
|
//
|
|
add_to_buff_def(&in_U_rms_calc_buffer[0], analog.iqUin_A1B1); //define â 10 ðàç áûñòðåå
|
|
add_to_buff_def(&in_U_rms_calc_buffer[1], analog.iqUin_B1C1);
|
|
add_to_buff_def(&in_U_rms_calc_buffer[2], analog.iqUin_C1A1);
|
|
add_to_buff_def(&in_U_rms_calc_buffer[3], analog.iqUin_A2B2);
|
|
add_to_buff_def(&in_U_rms_calc_buffer[4], analog.iqUin_B2C2);
|
|
add_to_buff_def(&in_U_rms_calc_buffer[5], analog.iqUin_C2A2);
|
|
#endif //USE_CALC_U_IN_RMS
|
|
#ifdef USE_CALC_I_OUT_RMS
|
|
out_I_rms_calc_buffer[0].val = analog.iqIu_1;
|
|
out_I_rms_calc_buffer[0].teta = teta_ch1;
|
|
out_I_rms_calc_buffer[0].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[0].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[0].add_value(&out_I_rms_calc_buffer[0]);
|
|
out_I_rms_calc_buffer[1].val = analog.iqIv_1;
|
|
out_I_rms_calc_buffer[1].teta = teta_ch1;
|
|
out_I_rms_calc_buffer[1].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[1].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[1].add_value(&out_I_rms_calc_buffer[1]);
|
|
out_I_rms_calc_buffer[2].val = analog.iqIw_1;
|
|
out_I_rms_calc_buffer[2].teta = teta_ch1;
|
|
out_I_rms_calc_buffer[2].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[2].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[2].add_value(&out_I_rms_calc_buffer[2]);
|
|
|
|
out_I_rms_calc_buffer[3].val = analog.iqIu_1;
|
|
out_I_rms_calc_buffer[3].teta = teta_ch2;
|
|
out_I_rms_calc_buffer[3].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[3].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[3].add_value(&out_I_rms_calc_buffer[3]);
|
|
out_I_rms_calc_buffer[4].val = analog.iqIu_1;
|
|
out_I_rms_calc_buffer[4].teta = teta_ch2;
|
|
out_I_rms_calc_buffer[4].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[4].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[4].add_value(&out_I_rms_calc_buffer[4]);
|
|
out_I_rms_calc_buffer[5].val = analog.iqIu_1;
|
|
out_I_rms_calc_buffer[5].teta = teta_ch2;
|
|
out_I_rms_calc_buffer[5].freq_pwm = FREQ_PWM * 2;
|
|
out_I_rms_calc_buffer[5].signal_freq = edrk.f_stator;
|
|
out_I_rms_calc_buffer[5].add_value(&out_I_rms_calc_buffer[5]);
|
|
#endif //USE_CALC_I_OUT_RMS
|
|
}
|
|
|
|
|
|
void calc_Uin_rms(void) {
|
|
|
|
RMS_CALC_ARRAY rc = RMS_CALC_DEFAULTS;
|
|
|
|
rc.size_array = in_U_rms_calc_buffer[0].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[0].values;
|
|
analog.iqUin_A1B1_rms = rc.calc(&rc);
|
|
rc.size_array = in_U_rms_calc_buffer[1].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[1].values;
|
|
analog.iqUin_B1C1_rms = rc.calc(&rc);
|
|
rc.size_array = in_U_rms_calc_buffer[2].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[2].values;
|
|
analog.iqUin_C1A1_rms = rc.calc(&rc);
|
|
|
|
rc.size_array = in_U_rms_calc_buffer[3].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[3].values;
|
|
analog.iqUin_A2B2_rms = rc.calc(&rc);
|
|
rc.size_array = in_U_rms_calc_buffer[4].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[4].values;
|
|
analog.iqUin_B2C2_rms = rc.calc(&rc);
|
|
rc.size_array = in_U_rms_calc_buffer[5].array_size;
|
|
rc.data_array = in_U_rms_calc_buffer[5].values;
|
|
analog.iqUin_C2A2_rms = rc.calc(&rc);
|
|
|
|
}
|
|
|
|
|
|
void calc_Iout_rms() {
|
|
int i = 0;
|
|
_iq results[NUM_OF_CHANNELS];
|
|
RMS_CALC_ARRAY_THINNING rc_Iout = RMS_CALC_THINNING_DEFAULTS;
|
|
|
|
//Calc rms
|
|
for (i = 0; i < NUM_OF_CHANNELS; i++) {
|
|
rc_Iout.data_array = out_I_rms_calc_buffer[i].values;
|
|
rc_Iout.last_elem_position = out_I_rms_calc_buffer[i].position;
|
|
rc_Iout.size_array = out_I_rms_calc_buffer[i].array_size;
|
|
rc_Iout.signal_period = out_I_rms_calc_buffer[i].elements_in_period;
|
|
results[i] = rc_Iout.calc(&rc_Iout);
|
|
}
|
|
analog.iqIu_1_rms = results[0];
|
|
analog.iqIv_1_rms = results[1];
|
|
analog.iqIw_1_rms = results[2];
|
|
analog.iqIu_2_rms = results[3];
|
|
analog.iqIv_2_rms = results[4];
|
|
analog.iqIw_2_rms = results[5];
|
|
}
|
|
|
|
void calc_RMS_values_main() {
|
|
#ifdef USE_CALC_U_IN_RMS
|
|
calc_Uin_rms();
|
|
#endif
|
|
// i_led2_off();
|
|
// i_led2_on();
|
|
#ifdef USE_CALC_I_OUT_RMS
|
|
calc_Iout_rms();
|
|
#endif
|
|
}
|
|
|
|
//float signal_amplitude = 141;
|
|
//_iq data_arr[RMS_BUFFER_SIZE];
|
|
//_iq16 data_arr_IQ16[RMS_BUFFER_SIZE];
|
|
//_iq position = 0;
|
|
//_iq result_simple = 0;
|
|
//_iq result_simple_t = 0;
|
|
//
|
|
//RMS_BUFFER_WITH_THINNING buffer_var_freq = RMS_BUFFER_WITH_THINNING_DEFAULTS;
|
|
//int freq_mian_signal = 1;
|
|
//int counter_wait_change_freq = 0;
|
|
//#define WAIT_CHANGE_FREQ_TICS 2000
|
|
/*
|
|
void test_calc_rms (_iq teta) {
|
|
_iq amplitude = _IQ (signal_amplitude / NORMA_ACP);
|
|
_iq current_val = 0;
|
|
_iq add_var_freq = 0;
|
|
static _iq add_50hz = _IQ(6.28 * 50.0 / FREQ_PWM / 2.0);
|
|
static _iq teta_50hz = 0, teta_Low = 0;
|
|
RMS_CALC_ARRAY rc = RMS_CALC_DEFAULTS;
|
|
|
|
RMS_CALC_ARRAY_THINNING rct = RMS_CALC_THINNING_DEFAULTS;
|
|
|
|
current_val = _IQmpy(amplitude, _IQcos(teta_50hz));
|
|
data_arr[position] = current_val;
|
|
data_arr_IQ16[position] = _IQtoIQ16(current_val);
|
|
position += 1;
|
|
if (position >= RMS_BUFFER_SIZE) position = 0;
|
|
teta_50hz += add_50hz;
|
|
rc.data_array = data_arr;
|
|
rc.size_array = RMS_BUFFER_SIZE;
|
|
result_simple = rc.calc(&rc);
|
|
|
|
if (counter_wait_change_freq >= WAIT_CHANGE_FREQ_TICS) {
|
|
if (freq_mian_signal < 20) { freq_mian_signal +=1;}
|
|
counter_wait_change_freq = 0;
|
|
} else {
|
|
counter_wait_change_freq += 1;
|
|
}
|
|
|
|
add_var_freq = _IQ(6.28 * freq_mian_signal / FREQ_PWM / 2.0);
|
|
teta_Low += add_var_freq;
|
|
current_val = _IQmpy(amplitude, _IQcos(teta_Low));
|
|
buffer_var_freq.val = current_val;
|
|
buffer_var_freq.signal_freq = _IQ((float)freq_mian_signal / NORMA_FROTOR);
|
|
buffer_var_freq.teta = teta_Low;
|
|
buffer_var_freq.add_value(&buffer_var_freq);
|
|
|
|
|
|
|
|
rct.data_array = buffer_var_freq.values;
|
|
rct.size_array = buffer_var_freq.array_size;
|
|
rct.last_elem_position = buffer_var_freq.position;
|
|
rct.signal_period = buffer_var_freq.array_size;
|
|
result_simple_t = rct.calc(&rct);
|
|
}
|
|
*/
|