720 lines
19 KiB
C
720 lines
19 KiB
C
#include <math.h>
|
|
#include <stdlib.h>
|
|
//#include "project.h"
|
|
|
|
#include "IQmathLib.h"
|
|
//#include "f281xpwm.h"
|
|
//
|
|
////#include "SpaceVectorPWM.h"
|
|
//#include "MemoryFunctions.h"
|
|
//#include "PWMTools.h"
|
|
//#include "pwm_vector_regul.h"
|
|
//#include "PWMTMSHandle.h"
|
|
//#include "TuneUpPlane.h"
|
|
//#include "RS_Functions.h"
|
|
//#include "CAN_setup.h"
|
|
//#include "global_time.h"
|
|
#include "params.h"
|
|
#include "vector.h"
|
|
//#include "rmp_cntl_my1.h"
|
|
//#include "vhzprof.h"
|
|
//#include "adc_tools.h"
|
|
//#include "v_pwm24.h"
|
|
//#include "break_regul.h"
|
|
//#include "break_tools.h"
|
|
//#include "detect_phase.h"
|
|
//#include "mathlib.h"
|
|
//#include "project.h"
|
|
//#include "log_to_memory.h"
|
|
//#include "rotation_speed.h"
|
|
//#include "detect_overload.h"
|
|
//#include "xp_write_xpwm_time.h"
|
|
//#include "errors.h"
|
|
//#include "sync_tools.h"
|
|
//#include "optical_bus.h"
|
|
//#include "IQmathLib.h"
|
|
|
|
#define DEF_FREQ_PWM_XTICS (3750000 / FREQ_PWM / 2)
|
|
#define DEF_PERIOD_MIN_XTICS 400 //375 ~ 100mks //315 ~ 84 mks //460//(3750000 * mks / 1000000)
|
|
#define DEF_PERIOD_MIN_BR_XTICS 165
|
|
|
|
#define DEF_FREQ_PWM_XTICS_MIN = 4261
|
|
#define DEF_FREQ_PWM_XTICS_MAX = 4687
|
|
|
|
#define STOP_ROTOR_LIMIT 27962 //2 rpm
|
|
#define STOP_ROTOR_MIN_CURRENT 4194304 //750A //3355443 //600A
|
|
|
|
#define K_MODUL_MAX 15770583 //13421772 //80% //10066329 //60% //5033164 //30% 15099494 ~ 90% //15435038 ~ 0.92%
|
|
//15770583 ~ 0.94%
|
|
#define MIN_Fsl_WHEN_STOPED 41943 //0.05 //67108 //0.08Hz
|
|
|
|
#define PWM_ONE_INTERRUPT_RUN 1
|
|
#define PWM_TWICE_INTERRUPT_RUN 0
|
|
|
|
|
|
//4464
|
|
// ×àñòîòà ØÈÌ â xilinx òèêàõ (60000000 / 16 / FREQ_PWM = 3750000 / FREQ_PWM)
|
|
#pragma DATA_SECTION(VAR_FREQ_PWM_XTICS,".fast_vars1");
|
|
int VAR_FREQ_PWM_XTICS = DEF_FREQ_PWM_XTICS;
|
|
|
|
// Ìèíèìàëüíîå çíà÷åíèå ØÈÌà â xilinx òèêàõ
|
|
#pragma DATA_SECTION(VAR_PERIOD_MAX_XTICS,".fast_vars1");
|
|
int VAR_PERIOD_MAX_XTICS = DEF_FREQ_PWM_XTICS - DEF_PERIOD_MIN_XTICS;
|
|
|
|
// Ìèíèìàëüíîå çíà÷åíèå ØÈÌà â xilinx òèêàõ (mintime+deadtime) (Fïèëû * Tìèí.êëþ÷à.ñåê = (60 / 16 / 2) * Tìêñ = (60 * Tìêñ / 16 / 2))
|
|
#pragma DATA_SECTION(VAR_PERIOD_MIN_XTICS,".fast_vars1");
|
|
int VAR_PERIOD_MIN_XTICS = DEF_PERIOD_MIN_XTICS;//
|
|
|
|
// Ìèíèìàëüíîå çíà÷åíèå ØÈÌà â xilinx òèêàõ äëÿ òîðìîçíûõ êëþ÷åé (mintime) (Fïèëû * Tìèí.êëþ÷à.ñåê = (60 / 16 / 2) * Tìêñ = (60 * Tìêñ / 16 / 2))
|
|
#pragma DATA_SECTION(VAR_PERIOD_MIN_BR_XTICS,".fast_vars1");
|
|
int VAR_PERIOD_MIN_BR_XTICS = DEF_PERIOD_MIN_BR_XTICS;//
|
|
|
|
#pragma DATA_SECTION(freq1,".fast_vars1");
|
|
_iq freq1;
|
|
|
|
#pragma DATA_SECTION(k1,".fast_vars1");
|
|
_iq k1 = 0;
|
|
|
|
RMP_MY1 rmp_freq = RMP_MY1_DEFAULTS;
|
|
//VHZPROF vhz1 = VHZPROF_DEFAULTS;
|
|
|
|
// WINDING a;
|
|
// FLAG f;
|
|
|
|
#define COUNT_SAVE_LOG_OFF 100 //Ñêîëüêî òàêòîâ ØÈÌ ñîõðàíÿåòñÿ ïîñëå îñòàíîâêè
|
|
#define COUNT_START_IMP 2
|
|
|
|
int i = 0;
|
|
/*void InitPWM()
|
|
{
|
|
WriteMemory(ADR_PWM_MODE_0, 0x0000); //Âûáèðàåì â êà÷åñòâå èñòî÷íèêà ØÈÌ TMS
|
|
}*/
|
|
|
|
static void write_swgen_pwm_times();
|
|
void write_swgen_pwm_times_split_eages(unsigned int mode_reload);
|
|
void fix_pwm_freq_synchro_ain();
|
|
void detect_level_interrupt(void);
|
|
void detect_current_saw_val(void);
|
|
|
|
void InitXPWM(void)
|
|
{
|
|
|
|
#ifdef XPWMGEN
|
|
/* Start of PWM Generator initialization*/
|
|
for(i = 0; i < 16; i++) // Îáíóëÿåì
|
|
{
|
|
WriteMemory(ADR_PWM_KEY_NUMBER, i);
|
|
WriteMemory(ADR_PWM_TIMING, 0);
|
|
|
|
}
|
|
WriteMemory(ADR_PWM_DIRECT, 0xffff);
|
|
WriteMemory(ADR_PWM_DRIVE_MODE, 0); //Choose PWM sourse PWMGenerator on Spartan 200e
|
|
WriteMemory(ADR_PWM_DEAD_TIME, 360); //Dead time in tics. 1 tic = 16.67 nsec
|
|
#ifndef _test_without_power
|
|
// OFF WDOG
|
|
WriteMemory(ADR_PWM_WDOG, 0x8005); //TODO turn on
|
|
#else
|
|
// ON WDOG
|
|
WriteMemory(ADR_PWM_WDOG, 0x0005); //TODO turn on
|
|
#endif
|
|
WriteMemory(ADR_PWM_PERIOD, VAR_FREQ_PWM_XTICS); // Saw period in tics. 1 tic = 16.67 nsec
|
|
WriteMemory(ADR_PWM_SAW_DIRECT, 0x0555);
|
|
WriteMemory(ADR_TK_MASK_0, 0);
|
|
WriteMemory(ADR_TK_MASK_1, 0xffff); //Turn off additional 16 tk lines
|
|
#if C_PROJECT_TYPE == PROJECT_BALZAM
|
|
WriteMemory(ADR_PWM_IT_TYPE, 1); //1 interrupt per PWM period
|
|
#else
|
|
WriteMemory(ADR_PWM_IT_TYPE, 0); //interrupt on each counter twist
|
|
#endif
|
|
// WriteMemory(ADR_PWM_WDOG, 0x8008);//ðàçðåøåíèå îøèáêè ïî PWM
|
|
#endif
|
|
|
|
#ifdef TMSPWMGEN
|
|
|
|
WriteMemory(ADR_PWM_MODE_0, 0x0000); //Âûáèðàåì â êà÷åñòâå èñòî÷íèêà ØÈÌ TMS
|
|
|
|
#endif
|
|
|
|
/* End îf PWM Gen init */
|
|
}
|
|
|
|
void initPWM_Variables(void)
|
|
{
|
|
//Äëÿ ïåðâîé ïèëû çàêðûòî, êîãäà âûøå çàäàííîãî óðîâíÿ, äëÿ âòîðîé íèæå
|
|
// xpwm_time.Tclosed_0 = 0;
|
|
// xpwm_time.Tclosed_1 = VAR_FREQ_PWM_XTICS + 1;
|
|
// xpwm_time.pwm_tics = VAR_FREQ_PWM_XTICS;
|
|
// xpwm_time.saw_direct.all = 0;//0x0555;
|
|
// xpwm_time.one_or_two_interrupts_run = PWM_TWICE_INTERRUPT_RUN;
|
|
|
|
|
|
init_alpha_pwm24(VAR_FREQ_PWM_XTICS);
|
|
InitVariablesSvgen(VAR_FREQ_PWM_XTICS);
|
|
init_DQ_pid();
|
|
break_resistor_managment_init();
|
|
|
|
rmp_freq.RampLowLimit = _IQ(-4); //0
|
|
rmp_freq.RampHighLimit = _IQ(4);
|
|
|
|
rmp_freq.RampPlus = _IQ(0.00005); //_IQ(0.0002);_IQ(0.000005);
|
|
|
|
rmp_freq.RampMinus = _IQ(-0.00005); //_IQ(-0.000005);
|
|
rmp_freq.DesiredInput = 0;
|
|
rmp_freq.Out = 0;
|
|
|
|
a.k = 0;
|
|
a.k1 = 0;
|
|
a.k2 = 0;
|
|
|
|
k1 = 0;
|
|
freq1 = 0;
|
|
}
|
|
|
|
#pragma CODE_SECTION(start_PWM24,".fast_run2")
|
|
void start_PWM24(int O1, int O2)
|
|
{
|
|
if ((O1 == 1) && (O2 == 1))
|
|
{
|
|
start_pwm();
|
|
}
|
|
else
|
|
{
|
|
if ((O1 == 0) && (O2 == 1))
|
|
{
|
|
start_pwm_b();
|
|
}
|
|
if ((O1 == 1) && (O2 == 0))
|
|
{
|
|
start_pwm_a();
|
|
}
|
|
}
|
|
}
|
|
|
|
inline void init_regulators()
|
|
{
|
|
if(f.Mode != 0)
|
|
{
|
|
pwm_vector_model_titov(f.iq_p_zad, f.iq_fzad, rotor.direct_rotor,
|
|
rotor.iqFout, f.Mode, 1, 1);
|
|
}
|
|
}
|
|
|
|
#define select_working_channels(go_a, go_b) go_a = !f.Obmotka1; \
|
|
go_b = !f.Obmotka2;
|
|
|
|
void PWM_interrupt()
|
|
{
|
|
static unsigned int pwm_run = 0;
|
|
static _iq Uzad1, Fzad, Uzad2;
|
|
static int count_step=0;
|
|
static int count_step_ram_off = 0;
|
|
static int count_start_impuls = 0;
|
|
static int flag_record_log = 0;
|
|
static int log_saved_to_const_mem = 0;
|
|
static int prevGo = -1;
|
|
static volatile unsigned int go_a = 0;
|
|
static volatile unsigned int go_b = 0;
|
|
|
|
static int stop_rotor_counter = 0;
|
|
|
|
static int prev_go_a = 1;
|
|
static int prev_go_b = 1;
|
|
|
|
int pwm_enable_calc_main = 0;
|
|
|
|
int start_int_xtics = 0, end_int_xtics = 0;
|
|
|
|
// i_led1_on_off(1);
|
|
if (pwm_run == 1)
|
|
{
|
|
// stop_pwm();
|
|
// errors.slow_stop.bit.PWM_interrupt_to_long |= 1;
|
|
return;
|
|
}
|
|
pwm_run = 1;
|
|
|
|
|
|
// detect_level_interrupt();
|
|
// start_int_xtics = xpwm_time.current_period;
|
|
if (xpwm_time.where_interrupt == PWM_LOW_LEVEL_INTERRUPT
|
|
|| xpwm_time.one_or_two_interrupts_run == PWM_ONE_INTERRUPT_RUN)
|
|
{
|
|
pwm_enable_calc_main = 1;
|
|
if (f.flag_second_PCH) {
|
|
fix_pwm_freq_synchro_ain();
|
|
}
|
|
}
|
|
else {
|
|
// i_sync_pin_on();
|
|
pwm_enable_calc_main = 0;
|
|
}
|
|
|
|
|
|
// project.cds_in[0].read_pbus(&project.cds_in[0]); //read direction
|
|
// project.read_all_pbus();
|
|
// optical_bus_read();
|
|
|
|
update_rot_sensors();
|
|
global_time.calc(&global_time);
|
|
//
|
|
inc_RS_timeout_cicle();
|
|
inc_CAN_timeout_cicle();
|
|
detect_I_M_overload();
|
|
DetectI_Out_BreakFase();
|
|
Rotor_measure();
|
|
|
|
if ((f.Go == 1) && (f.Stop == 0)
|
|
&& (f.rotor_stopped == 0)
|
|
// && (faults.faults5.bit.rotor_stopped == 0)
|
|
/* && (f.Ready2 == 1)*/)
|
|
{
|
|
if (f.Ready2) {f.flag_turn_On_Pump = 1;} //Íà âñ-êèé ñëó÷àé
|
|
if (f.Go != prevGo) {
|
|
set_start_mem(FAST_LOG);
|
|
// clear_mem(FAST_LOG);
|
|
// count_start_impuls = 0;
|
|
count_step = 0;
|
|
count_step_ram_off = COUNT_SAVE_LOG_OFF;
|
|
|
|
init_regulators();
|
|
stop_rotor_counter = 0;
|
|
} else {
|
|
if (f.Mode == 0) {
|
|
rmp_freq.DesiredInput = freq1;
|
|
rmp_freq.calc(&rmp_freq);
|
|
// Fzad = rmp_freq.Out;
|
|
Fzad = freq1;
|
|
// if(k1 < 87772)
|
|
// { k1 = 87772;}
|
|
Uzad1 = k1;
|
|
Uzad2 = k1;
|
|
}
|
|
|
|
select_working_channels(go_a, go_b);
|
|
|
|
if (go_a == 0 && prev_go_a != go_a) {
|
|
stop_pwm_a();
|
|
}
|
|
if (go_a == 1 && prev_go_a != go_a) {
|
|
start_pwm_a();
|
|
}
|
|
if (go_b == 0 && prev_go_b != go_b) {
|
|
stop_pwm_b();
|
|
}
|
|
if (go_b == 1 && prev_go_b != go_b) {
|
|
start_pwm_b();
|
|
}
|
|
|
|
prev_go_a = go_a;
|
|
prev_go_b = go_b;
|
|
|
|
if (count_start_impuls < COUNT_START_IMP) {
|
|
count_start_impuls++;
|
|
|
|
Fzad = 0;
|
|
rmp_freq.Out = 0;
|
|
|
|
// set_start_mem(FAST_LOG);
|
|
// set_start_mem(SLOW_LOG);
|
|
} else {
|
|
|
|
if (count_start_impuls==2)
|
|
{
|
|
if (go_a == 1 && go_b == 1) {
|
|
// òóò âûñòàâëåíî middle ñîñòîÿíèå êëþ÷åé ïåðåä ðàçðåøåíèåì âûõîäîâ pwm
|
|
// start_pwm(); äîëæåí âûçâàòüñÿ îäèí ðàç çà èçìåíåíèå f.Go
|
|
start_pwm();
|
|
} else if (go_a == 1) {
|
|
write_swgen_pwm_times(); //TODO: Check with new PWM
|
|
start_pwm_a();
|
|
} else if (go_b == 1) {
|
|
write_swgen_pwm_times();
|
|
start_pwm_b();
|
|
}
|
|
} // end if (count_start_impuls==1)
|
|
|
|
count_start_impuls++;
|
|
if (count_start_impuls > 2 * COUNT_START_IMP) {
|
|
count_start_impuls = 2 * COUNT_START_IMP;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
flag_record_log = 1;
|
|
log_saved_to_const_mem = 0;
|
|
} else {
|
|
if (f.Discharge
|
|
&& (errors.slow_stop2.bit.Break_Resistor == 0)
|
|
&& (errors.plains_and_others.bit.er0_setted == 0)
|
|
&& (errors.umu_errors.bit.Voltage380_BSU_Off == 0))
|
|
// && !f.Stop)
|
|
{
|
|
start_break_pwm();
|
|
break_resistor_managment_calc();
|
|
} else {
|
|
//Do not stop, when come for the first time, to write to xilinx times to close keys.
|
|
//Otherwise mintime error can occure.
|
|
//Also we do not stop pwm wile break_resistor keys working
|
|
if (!count_start_impuls) {
|
|
// ýòî ïðîèçîéäåò òîëüêî íà âòîðîì òàêòå âûêëþ÷åíèÿ
|
|
stop_pwm();
|
|
}
|
|
break_resistor_set_closed();
|
|
}
|
|
if (count_step_ram_off > 0) {
|
|
count_step_ram_off--;
|
|
flag_record_log = 1;
|
|
} else {
|
|
flag_record_log = 0;
|
|
}
|
|
|
|
pwm_vector_model_titov(f.iq_p_zad, f.iq_fzad, rotor.direct_rotor,
|
|
rotor.iqFout, 0, 1, 1);
|
|
|
|
if (count_start_impuls > 0) {
|
|
count_start_impuls -= 1;
|
|
} else {
|
|
count_start_impuls = 0;
|
|
}
|
|
|
|
Uzad1 = 87772; //0.5%
|
|
Uzad2 = 87772;
|
|
k1 = Uzad1;
|
|
svgen_pwm24_1.Gain = Uzad1;
|
|
svgen_pwm24_2.Gain = Uzad1;
|
|
svgen_dq_1.Ualpha = 0;
|
|
svgen_dq_1.Ubeta = 0;
|
|
svgen_dq_2.Ualpha = 0;
|
|
svgen_dq_2.Ubeta = 0;
|
|
a.iqk = Uzad1;
|
|
}
|
|
// a.iqk1 = Uzad1;
|
|
// a.iqk2 = Uzad2;
|
|
// a.iqk = (a.iqk1 + a.iqk2) >> 1;
|
|
// a.iqf = Fzad;
|
|
prevGo = f.Go;
|
|
|
|
break_resistor_recup_calc();
|
|
break_resistor_managment_update();
|
|
|
|
if (count_start_impuls >= (2 * COUNT_START_IMP) ) {
|
|
|
|
if (f.Mode == 0) {
|
|
// test_calc_pwm24(Uzad1, Uzad2, Fzad);
|
|
if (pwm_enable_calc_main) {
|
|
test_calc_simple_dq_pwm24(Uzad1, Uzad2, Fzad, Fzad, K_MODUL_MAX);
|
|
}
|
|
analog_dq_calc_const();
|
|
} else {
|
|
if ((_IQabs(rotor.iqFout) < STOP_ROTOR_LIMIT)
|
|
&& (_IQabs(analog.iqIq1) > STOP_ROTOR_MIN_CURRENT)) {
|
|
if ((stop_rotor_counter >= 2520)) {
|
|
stop_rotor_counter = 2520;
|
|
// faults.faults5.bit.rotor_stopped |= 1;
|
|
f.rotor_stopped |= 1;
|
|
} else {
|
|
stop_rotor_counter += 1;
|
|
}
|
|
if (_IQabs(analog.Fsl) < MIN_Fsl_WHEN_STOPED) {
|
|
// faults.faults5.bit.rotor_stopped |= 1;
|
|
f.rotor_stopped |= 1;
|
|
}
|
|
} else {
|
|
if (stop_rotor_counter > 0) {
|
|
stop_rotor_counter -= 1;
|
|
} else {
|
|
stop_rotor_counter = 0;
|
|
}
|
|
}
|
|
|
|
pwm_vector_model_titov(f.iq_p_zad, f.iq_fzad, rotor.direct_rotor,
|
|
rotor.iqFout, f.Mode, 0, pwm_enable_calc_main);
|
|
}
|
|
|
|
} else {
|
|
// òóò îïÿòü middle ñîñòîÿíèå ïåðåä âûêëþ÷åíèåì êëþ÷åé
|
|
if (count_start_impuls)
|
|
{
|
|
// svgen_set_time_keys_closed(&svgen_pwm24_1);
|
|
// svgen_set_time_keys_closed(&svgen_pwm24_2);
|
|
svgen_set_time_middle_keys_open(&svgen_pwm24_1);
|
|
svgen_set_time_middle_keys_open(&svgen_pwm24_2);
|
|
}
|
|
else
|
|
// à òóò ìû óæå âûêëþ÷èëèñü
|
|
{
|
|
svgen_set_time_keys_closed(&svgen_pwm24_1);
|
|
svgen_set_time_keys_closed(&svgen_pwm24_2);
|
|
//Ñíèìàåì çàïðåò ØÈÌà
|
|
// if (faults.faults5.bit.rotor_stopped == 1) {
|
|
if (f.rotor_stopped == 1) {
|
|
if (stop_rotor_counter > 0) {
|
|
stop_rotor_counter -= 1;
|
|
} else {
|
|
// faults.faults5.bit.rotor_stopped = 0;
|
|
f.rotor_stopped = 0;
|
|
stop_rotor_counter = 0;
|
|
}
|
|
} else {
|
|
stop_rotor_counter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (f.Mode) {
|
|
a.iqf = analog.iqFstator;
|
|
} else {
|
|
a.iqf = Fzad;
|
|
analog.iqFstator = Fzad;
|
|
a.iqk1 = _IQsqrt(_IQmpy(svgen_dq_1.Ualpha, svgen_dq_1.Ualpha) + _IQmpy(svgen_dq_1.Ubeta, svgen_dq_1.Ubeta)); //For output Kmodul to terminal
|
|
a.iqk2 = _IQsqrt(_IQmpy(svgen_dq_2.Ualpha, svgen_dq_2.Ualpha) + _IQmpy(svgen_dq_2.Ubeta, svgen_dq_2.Ubeta)); //end counting Uout
|
|
}
|
|
a.iqk = (a.iqk1 + a.iqk2) / 2;
|
|
|
|
// write_swgen_pwm_times();
|
|
|
|
if (xpwm_time.one_or_two_interrupts_run == PWM_ONE_INTERRUPT_RUN)
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_FORCE);
|
|
else
|
|
{
|
|
if (f.Go == 1)
|
|
{
|
|
if (count_start_impuls == (2 * COUNT_START_IMP))
|
|
{
|
|
if (pwm_enable_calc_main)
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_LEVEL_HIGH);
|
|
else
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_LEVEL_LOW);
|
|
}
|
|
else
|
|
// if (pwm_enable_calc_main)
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_FORCE);
|
|
}
|
|
else
|
|
{
|
|
if (count_start_impuls == (2 * COUNT_START_IMP) - 1)
|
|
{
|
|
if (pwm_enable_calc_main)
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_LEVEL_HIGH);
|
|
else
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_LEVEL_LOW);
|
|
|
|
}
|
|
else
|
|
write_swgen_pwm_times_split_eages(PWM_MODE_RELOAD_FORCE);
|
|
}
|
|
|
|
// if (pwm_enable_calc_main)
|
|
// prev_run_calc_uf = run_calc_uf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// logs recording
|
|
// if ((flag_record_log && !f.stop_Log) || f.Startstoplog)
|
|
// //if (f.Log1_Log2 == 1)// && f.Go == 1 && (!f.Stop))
|
|
// //if(f.Go == 1)
|
|
// {
|
|
// test_mem_limit(FAST_LOG, !f.Ciclelog);
|
|
// count_step++;
|
|
//
|
|
// if (count_step >= 0) {
|
|
// fillADClogs();
|
|
//// logpar.log13 = flag_record_log;
|
|
//// logpar.log14 = count_start_impuls;
|
|
//// logpar.log10 = (int16)_IQtoIQ15(analog.iqIq1_filter);
|
|
//// logpar.log11 = (int16)_IQtoIQ15(rotor.iqFrotFromOptica);
|
|
// logpar.log15 = (int16) _IQtoIQ15(analog.iqIq2);
|
|
// logpar.log16 = (int16) _IQtoIQ15(a.iqk1);
|
|
// logpar.log17 = (int16) _IQtoIQ15(analog.iqId1);
|
|
// logpar.log18 = (int16) _IQtoIQ15(analog.iqIq1);
|
|
//
|
|
//// logpar.log24 = (int16) break_result_1;
|
|
//// logpar.log25 = (int16) break_result_2;
|
|
// logpar.log27 = (int16)(_IQtoIQ15(analog.iqIbtr1_1));
|
|
// logpar.log28 = (int16)(_IQtoIQ15(analog.iqIbtr2_1));
|
|
//
|
|
// getFastLogs(!f.Ciclelog);
|
|
// count_step = 0;
|
|
// }
|
|
// } else {
|
|
// if (f.Stop && log_saved_to_const_mem == 0) {
|
|
// logpar.copy_log_to_const_memory = 1;
|
|
// log_saved_to_const_mem = 1;
|
|
// }
|
|
// }
|
|
|
|
// optical_bus_write();
|
|
|
|
// detect_current_saw_val();
|
|
end_int_xtics = xpwm_time.current_period;
|
|
f.PWMcounterVal = labs(start_int_xtics - end_int_xtics);
|
|
|
|
pwm_run = 0;
|
|
|
|
i_sync_pin_off();
|
|
// i_led1_on_off(0);
|
|
|
|
}
|
|
|
|
void slow_vector_update()
|
|
{
|
|
_iq iqKzad = 0;
|
|
freq1 = _IQ (f.fzad/F_STATOR_MAX);//f.iqFRotorSetHz;
|
|
iqKzad = _IQ(f.kzad);
|
|
k1 = zad_intensiv_q(30000, 30000, k1, iqKzad); //20000
|
|
|
|
|
|
}
|
|
|
|
//#pragma CODE_SECTION(write_swgen_pwm_times,".fast_run");
|
|
//void write_swgen_pwm_times()
|
|
//{
|
|
// xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tc_0.Ti;
|
|
// xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tc_1.Ti;
|
|
// xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tb_0.Ti;
|
|
// xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tb_1.Ti;
|
|
// xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Ta_0.Ti;
|
|
// xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Ta_1.Ti;
|
|
//
|
|
// xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tc_0.Ti;
|
|
// xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tc_1.Ti;
|
|
// xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tb_0.Ti;
|
|
// xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tb_1.Ti;
|
|
// xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Ta_0.Ti;
|
|
// xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Ta_1.Ti;
|
|
//
|
|
// xpwm_time.Tbr0_0 = break_result_1;
|
|
// xpwm_time.Tbr0_1 = break_result_2;
|
|
// xpwm_time.Tbr1_0 = break_result_3;
|
|
// xpwm_time.Tbr1_1 = break_result_4;
|
|
//
|
|
// xpwm_time.write_1_2_winding_break_times(&xpwm_time);
|
|
//
|
|
//
|
|
//// logpar.log29 = xpwm_time.Ta0_0;
|
|
//// logpar.log30 = xpwm_time.Ta0_1;
|
|
//// logpar.log10 = xpwm_time.Tb0_0;
|
|
//// logpar.log11 = xpwm_time.Tb0_1;
|
|
//// logpar.log12 = xpwm_time.Tc0_0;
|
|
//// logpar.log13 = xpwm_time.Tc0_1;
|
|
//// logpar.log7 = _IQtoIQ12(svgen_pwm24_1.Alpha);
|
|
//// logpar.log8 = xpwm_time.Ta0_0 - xpwm_time.Tb0_0;
|
|
//// logpar.log9 = xpwm_time.Ta0_1 - xpwm_time.Tb0_1;
|
|
//// logpar.log10 = xpwm_time.Tb0_0 - xpwm_time.Tc0_0;
|
|
//// logpar.log11 = xpwm_time.Tb0_1 - xpwm_time.Tc0_1;
|
|
//// logpar.log12 = xpwm_time.Tc0_0 - xpwm_time.Ta0_0;
|
|
//// logpar.log13 = xpwm_time.Tc0_1 - xpwm_time.Ta0_1;
|
|
//
|
|
//}
|
|
|
|
//#pragma CODE_SECTION(write_swgen_pwm_times_split_eages,".fast_run2");
|
|
//void write_swgen_pwm_times_split_eages(unsigned int mode_reload)
|
|
//{
|
|
//
|
|
// xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tc_0.Ti;
|
|
// xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tc_1.Ti;
|
|
// xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tb_0.Ti;
|
|
// xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tb_1.Ti;
|
|
// xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Ta_0.Ti;
|
|
// xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Ta_1.Ti;
|
|
//
|
|
// xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tc_0.Ti;
|
|
// xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tc_1.Ti;
|
|
// xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tb_0.Ti;
|
|
// xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tb_1.Ti;
|
|
// xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Ta_0.Ti;
|
|
// xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Ta_1.Ti;
|
|
//
|
|
// xpwm_time.Tbr0_0 = break_result_1;
|
|
// xpwm_time.Tbr0_1 = break_result_2;
|
|
// xpwm_time.Tbr1_0 = break_result_3;
|
|
// xpwm_time.Tbr1_1 = break_result_4;
|
|
//
|
|
// xpwm_time.mode_reload = mode_reload;
|
|
//
|
|
// xpwm_time.write_1_2_winding_break_times_split(&xpwm_time);
|
|
//}
|
|
|
|
#define CONST_IQ_1 16777216 //1
|
|
|
|
//#pragma CODE_SECTION(fix_pwm_freq_synchro_ain,".fast_run");
|
|
//void fix_pwm_freq_synchro_ain()
|
|
//{
|
|
//// if (f.Sync_input_or_output == SYNC_INPUT)
|
|
// {
|
|
// sync_inc_error();
|
|
//
|
|
// if (f.disable_sync || f.sync_ready == 0)
|
|
// {
|
|
//
|
|
//
|
|
// return;
|
|
// }
|
|
//
|
|
// if (f.pwm_freq_plus_minus_zero==1)
|
|
// {
|
|
//
|
|
//
|
|
// //Increment xtics
|
|
// VAR_FREQ_PWM_XTICS = DEF_FREQ_PWM_XTICS + 1;
|
|
// WriteMemory(ADR_PWM_PERIOD, VAR_FREQ_PWM_XTICS); // Saw period in tics. 1 tic = 16.67 nsec
|
|
//
|
|
// change_freq_pwm(VAR_FREQ_PWM_XTICS);
|
|
//
|
|
//
|
|
// }
|
|
//
|
|
// if (f.pwm_freq_plus_minus_zero==-1)
|
|
// {
|
|
// //4464
|
|
// //Decrement xtics
|
|
// VAR_FREQ_PWM_XTICS = DEF_FREQ_PWM_XTICS - 1;
|
|
// WriteMemory(ADR_PWM_PERIOD, VAR_FREQ_PWM_XTICS); // Saw period in tics. 1 tic = 16.67 nsec
|
|
//
|
|
// change_freq_pwm(VAR_FREQ_PWM_XTICS);
|
|
//
|
|
// }
|
|
//
|
|
// if (f.pwm_freq_plus_minus_zero==0)
|
|
// {
|
|
// VAR_FREQ_PWM_XTICS = DEF_FREQ_PWM_XTICS - 1;
|
|
// WriteMemory(ADR_PWM_PERIOD, VAR_FREQ_PWM_XTICS);
|
|
// change_freq_pwm(VAR_FREQ_PWM_XTICS);
|
|
// }
|
|
//
|
|
// }
|
|
//
|
|
//
|
|
//
|
|
//}
|
|
|
|
|
|
//void detect_level_interrupt(void)
|
|
//{
|
|
//
|
|
// WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
// xpwm_time.current_period = ReadMemory(ADR_SAW_VALUE);
|
|
//
|
|
// if (xpwm_time.current_period<xpwm_time.pwm_tics/2)
|
|
// xpwm_time.where_interrupt = PWM_LOW_LEVEL_INTERRUPT;
|
|
//
|
|
// if (xpwm_time.current_period>xpwm_time.pwm_tics/2)
|
|
// xpwm_time.where_interrupt = PWM_HIGH_LEVEL_INTERRUPT;
|
|
//
|
|
//}
|
|
//
|
|
//void detect_current_saw_val(void)
|
|
//{
|
|
// WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
// xpwm_time.current_period = ReadMemory(ADR_SAW_VALUE);
|
|
//}
|
|
|
|
|
|
|
|
|