949 lines
27 KiB
C
949 lines
27 KiB
C
#include "DSP281x_Examples.h" // DSP281x Examples Include File
|
|
#include "DSP281x_SWPrioritizedIsrLevels.h" // DSP281x Examples Include File
|
|
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
|
|
#include "IQmathLib.h"
|
|
|
|
#include <break_regul.h>
|
|
#include <params_pwm24.h>
|
|
#include <project_setup.h>
|
|
#include <PWMTMSHandle.h>
|
|
#include <v_pwm24_v2.h>
|
|
#include <vector.h>
|
|
|
|
#include "rmp_cntl_v1.h"
|
|
#include "svgen_mf.h"
|
|
#include "uf_alg_ing.h"
|
|
#include "vhzprof.h"
|
|
#include "DSP281x_Examples.h" // DSP281x Examples Include File
|
|
#include "DSP281x_Device.h"
|
|
#include "MemoryFunctions.h"
|
|
#include "Spartan2E_Adr.h"
|
|
#include "TuneUpPlane.h"
|
|
#include "x_wdog.h"
|
|
#include "xp_write_xpwm_time.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ×àñòîòà ØÈÌ â 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;//
|
|
|
|
|
|
|
|
|
|
#define IQ_ALFA_SATURATION1 15099494//16441671//15099494
|
|
#define IQ_ALFA_SATURATION2 1677721//16441671//15099494
|
|
|
|
|
|
#define PI 3.1415926535897932384626433832795
|
|
|
|
//#pragma DATA_SECTION(iq_alfa_coef,".fast_vars");
|
|
//_iq iq_alfa_coef = 16777216;
|
|
|
|
|
|
//#pragma DATA_SECTION(pidCur_Ki,".fast_vars");
|
|
//_iq pidCur_Ki = 0;
|
|
|
|
//#pragma DATA_SECTION(ar_tph,".fast_vars");
|
|
//_iq ar_tph[7];
|
|
|
|
//#pragma DATA_SECTION(winding_displacement,".fast_vars");
|
|
//_iq winding_displacement = CONST_IQ_PI6;
|
|
|
|
|
|
|
|
#pragma DATA_SECTION(svgen_pwm24_1,".v_24pwm_vars");
|
|
SVGEN_PWM24 svgen_pwm24_1 = SVGEN_PWM24_DEFAULTS;
|
|
#pragma DATA_SECTION(svgen_pwm24_2,".v_24pwm_vars");
|
|
SVGEN_PWM24 svgen_pwm24_2 = SVGEN_PWM24_DEFAULTS;
|
|
|
|
|
|
|
|
|
|
ALG_PWM24 alg_pwm24 = ALG_PWM24_DEFAULTS;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma CODE_SECTION(start_PWM24,".fast_run2")
|
|
void start_PWM24(int O1, int O2)
|
|
{
|
|
if ((O1 == 1) && (O2 == 1))
|
|
{
|
|
soft_start_x24_pwm_1_2();
|
|
}
|
|
else
|
|
{
|
|
if ((O1 == 0) && (O2 == 1))
|
|
{
|
|
soft_start_x24_pwm_2();
|
|
}
|
|
if ((O1 == 1) && (O2 == 0))
|
|
{
|
|
soft_start_x24_pwm_1();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void InitPWM_Variables(int n_pch)
|
|
{
|
|
|
|
// init_DQ_pid();
|
|
// break_resistor_managment_init();
|
|
|
|
|
|
/////////////
|
|
|
|
|
|
//////////////
|
|
// a.k = 0;
|
|
// a.k1 = 0;
|
|
// a.k2 = 0;
|
|
|
|
alg_pwm24.k1 = 0;
|
|
alg_pwm24.k2 = 0;
|
|
|
|
alg_pwm24.freq1 = 0;
|
|
|
|
///////////////////
|
|
|
|
|
|
///////////////////
|
|
svgen_pwm24_1.prev_level = V_PWM24_PREV_PWM_CLOSE;
|
|
svgen_pwm24_1.saw_direct.all = xpwm_time.saw_direct.all & 0x3f;
|
|
svgen_pwm24_1.Tclosed_saw_direct_0 = xpwm_time.Tclosed_saw_direct_0;// xpwm_time.Tclosed_high;//var_freq_pwm_xtics + 1;
|
|
svgen_pwm24_1.Tclosed_saw_direct_1 = xpwm_time.Tclosed_saw_direct_1;
|
|
svgen_pwm24_1.Tclosed_high = xpwm_time.Tclosed_high;
|
|
|
|
svgen_pwm24_2.prev_level = V_PWM24_PREV_PWM_CLOSE;
|
|
svgen_pwm24_2.saw_direct.all = (xpwm_time.saw_direct.all >> 6) & 0x3f;
|
|
svgen_pwm24_2.Tclosed_saw_direct_0 = xpwm_time.Tclosed_saw_direct_0;// xpwm_time.Tclosed_high;//var_freq_pwm_xtics + 1;
|
|
svgen_pwm24_2.Tclosed_saw_direct_1 = xpwm_time.Tclosed_saw_direct_1;
|
|
svgen_pwm24_2.Tclosed_high = xpwm_time.Tclosed_high;
|
|
|
|
|
|
svgen_pwm24_1.XilinxFreq = CONST_IQ_1 / xpwm_time.Tclosed_high;//(var_freq_pwm_xtics + 1);
|
|
svgen_pwm24_2.XilinxFreq = svgen_pwm24_1.XilinxFreq;
|
|
|
|
svgen_pwm24_1.number_svgen = 1;
|
|
svgen_pwm24_2.number_svgen = 2;
|
|
|
|
// pwm_minimal_impuls_zero = DEF_PERIOD_MIN_XTICS_80;
|
|
|
|
svgen_pwm24_1.pwm_minimal_impuls_zero_minus = (float)DEF_PERIOD_MIN_MKS*1000.0*FREQ_INTERNAL_GENERATOR_XILINX_TMS/1000000000.0;// DEF_PERIOD_MIN_XTICS_100;//DEF_PERIOD_MIN_XTICS_80;
|
|
svgen_pwm24_1.pwm_minimal_impuls_zero_plus = (float)DEF_PERIOD_MIN_MKS*1000.0*FREQ_INTERNAL_GENERATOR_XILINX_TMS/1000000000.0;// DEF_PERIOD_MIN_XTICS_80;
|
|
|
|
svgen_pwm24_2.pwm_minimal_impuls_zero_minus = svgen_pwm24_1.pwm_minimal_impuls_zero_minus;
|
|
svgen_pwm24_2.pwm_minimal_impuls_zero_plus = svgen_pwm24_1.pwm_minimal_impuls_zero_plus;
|
|
|
|
|
|
if (n_pch==0)
|
|
{
|
|
svgen_pwm24_1.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_CBA;
|
|
svgen_pwm24_2.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_CBA;
|
|
}
|
|
else
|
|
{
|
|
// svgen_pwm24_1.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_ACB; // íå ïîøëî
|
|
// svgen_pwm24_2.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_ACB;
|
|
svgen_pwm24_1.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_BAC;
|
|
svgen_pwm24_2.phase_sequence = V_PWM24_PHASE_SEQ_REVERS_BAC;
|
|
}
|
|
|
|
|
|
InitVariablesSvgen_Ing(xpwm_time.freq_pwm);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void InitXPWM(unsigned int freq_pwm)
|
|
{
|
|
int i;
|
|
unsigned int pwm_t;//, freq_pwm_xtics;
|
|
|
|
|
|
|
|
|
|
pwm_t = (FREQ_INTERNAL_GENERATOR_XILINX_TMS / freq_pwm );
|
|
// freq_pwm_xtics = (FREQ_INTERNAL_GENERATOR_XILINX_TMS / freq_pwm );
|
|
|
|
// write init pwm
|
|
// Äëß ïåðâîé ïèëû çàêðûòî, êîãäà âûøå çàäàííîãî óðîâíß, äëß âòîðîé íèæå
|
|
xpwm_time.Tclosed_saw_direct_1 = pwm_t + 2;//1; // äëÿ òèïà ïèëû=1 íóæíî âûñòàâèòü çíà÷åíèå âûøå ïåðèîäà, ÷òîá øèì íå îòêðûëñÿ
|
|
xpwm_time.Tclosed_saw_direct_0 = 0; // äëÿ òèïà ïèëû=0 íóæíî âûñòàâèòü çíà÷åíèå íèæå ïåðèîäà, ÷òîá øèì íå îòêðûëñÿ
|
|
|
|
xpwm_time.Tclosed_high = pwm_t + 2;//1;
|
|
|
|
// âûáðàëè íàïðàâëåíèå ïèë
|
|
// "íàïðàâëåíèå ïèë äëÿ ØÈÌà òèïà=0x0
|
|
//Åñëè SAW_DIRECTbit = 0 òî çíà÷åíèå ïèëû>óñòàâêè âûñòàâèò àêòèâíîå âêëþ÷åííîå ñîñòîÿíèå=0
|
|
//íà âûõîäå ØÈÌà
|
|
//Åñëè SAW_DIRECTbit = 1 òî çíà÷åíèå ïèëû<=óñòàâêè âûñòàâèò àêòèâíîå âêëþ÷åííîå ñîñòîÿíèå=0
|
|
//íà âûõîäå ØÈÌà
|
|
xpwm_time.saw_direct.all = 0x0555;
|
|
|
|
|
|
// ïåðèîä â òèêàõ
|
|
xpwm_time.pwm_tics = pwm_t;
|
|
xpwm_time.freq_pwm = freq_pwm;
|
|
xpwm_time.half_pwm_tics = xpwm_time.pwm_tics >> 1;
|
|
|
|
xpwm_time.one_or_two_interrupts_run = PWN_COUNT_RUN_PER_INTERRUPT;
|
|
xpwm_time.init(&xpwm_time);
|
|
|
|
// write to xilinx regs
|
|
xpwm_time.write_zero_winding_break_times(&xpwm_time);
|
|
|
|
|
|
//
|
|
i_WriteMemory(ADR_PWM_DIRECT, 0xffff);
|
|
i_WriteMemory(ADR_PWM_DRIVE_MODE, 0); //Choose PWM sourse PWMGenerator on Spartan 200e
|
|
// DeadTime äëÿ ýòîãî òèïà ØÈÌà íå èñïîëüçóåòñÿ
|
|
i_WriteMemory(ADR_PWM_DEAD_TIME, 360); //Dead time in tics.
|
|
stop_wdog();
|
|
|
|
i_WriteMemory(ADR_PWM_PERIOD, pwm_t); // Saw period in tics. 1 tic = FREQ_INTERNAL_GENERATOR_XILINX_TMS
|
|
// çàïèñàëè âûáðàëè íàïðàâëåíèå ïèë
|
|
i_WriteMemory(ADR_PWM_SAW_DIRECT, xpwm_time.saw_direct.all);
|
|
//"Ìàñêà íà ëèíèè òê (15 ïî 0). 0 - ìàñêè íåò, 1 - ìàñêà íàëîæåíà.
|
|
//Åñëè èñïîëüçóåòñÿ ØÈÌãåíåðàòîð Xilinx, òî ìàñêà ïðèìåíÿåòñÿ ëèáîñðàçó 0x2006(15) = 0,
|
|
//ëèáî â ìîìåíò ïðåãèáà ïèëû 0x2006(15) = 1, "
|
|
i_WriteMemory(ADR_TK_MASK_0, 0);
|
|
// "Ìàñêà íà ëèíèè òê (31 ïî 16) Åñëè èñïîëüçóåòñÿ ØÈÌãåíåðàòîð Xilinx, òî ìàñêà ïðèìåíÿåòñÿ ëèáîñðàçó 0x2006(15) = 0,
|
|
// ëèáî â ìîìåíò ïðåãèáà ïèëû 0x2006(15) = 1, "
|
|
i_WriteMemory(ADR_TK_MASK_1, 0xffff); //Turn off additional 16 tk lines
|
|
|
|
|
|
i_WriteMemory(ADR_PWM_IT_TYPE, PWN_COUNT_RUN_PER_INTERRUPT); //1 or 2 interrupt per PWM period
|
|
|
|
//
|
|
//#if (C_PROJECT_TYPE == PROJECT_BALZAM) || (C_PROJECT_TYPE == PROJECT_23550)
|
|
// i_WriteMemory(ADR_PWM_IT_TYPE, 1); //1 interrupt per PWM period
|
|
//#else
|
|
// i_WriteMemory(ADR_PWM_IT_TYPE, 0); //interrupt on each counter twist
|
|
//#endif
|
|
|
|
/* End îf PWM Gen init */
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
void init_freq_array(void)
|
|
{
|
|
unsigned int i = 0;
|
|
//unsigned int j = 0;
|
|
int var1 = 0;
|
|
|
|
var1 = 32767 / (FREQ_PWM_MAX - FREQ_PWM_MIN);
|
|
|
|
for (i = 0; i < COUNT_VAR_FREQ; i++)
|
|
{
|
|
//j = rand() / 1023;
|
|
//freq_array[i] = array_optim_freq[j];
|
|
//do
|
|
freq_array[i] = FREQ_PWM_MIN + (rand() / var1);
|
|
//while ((freq_array[i] < 945) && (freq_array[i] > 930));
|
|
}
|
|
|
|
//freq_array[0] = 991;
|
|
//freq_array[1] = 1430;
|
|
}
|
|
*/
|
|
|
|
|
|
//#pragma CODE_SECTION(calc_freq_pwm,".v_24pwm_run");
|
|
//#pragma CODE_SECTION(calc_freq_pwm,".fast_run");
|
|
/*void calc_freq_pwm()
|
|
{
|
|
static int prev_freq_pwm = 0;
|
|
static float pwm_period = 0;
|
|
static float var0 = 0;
|
|
//static int line = 0;
|
|
//static int i = 0;
|
|
static unsigned int proc_ticks = 1;
|
|
int var1 = 0;
|
|
//static int i = 0;
|
|
|
|
if ((f.flag_change_pwm_freq == 1) && (f.flag_random_freq == 1))
|
|
{
|
|
if (proc_ticks >= 1)
|
|
{
|
|
proc_ticks = 0;
|
|
|
|
|
|
if (line == 0)
|
|
{
|
|
VAR_FREQ_PWM_HZ = VAR_FREQ_PWM_HZ + 1;
|
|
if (VAR_FREQ_PWM_HZ > FREQ_PWM_MAX)
|
|
{
|
|
VAR_FREQ_PWM_HZ = FREQ_PWM_MAX;
|
|
line = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
VAR_FREQ_PWM_HZ = VAR_FREQ_PWM_HZ - 1;
|
|
if (VAR_FREQ_PWM_HZ < FREQ_PWM)
|
|
{
|
|
VAR_FREQ_PWM_HZ = FREQ_PWM;
|
|
line = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
//VAR_FREQ_PWM_HZ = freq_array[i];
|
|
//i_led2_on_off(1);
|
|
|
|
var1 = 32767 / (freq_pwm_max_hz - freq_pwm_min_hz);
|
|
VAR_FREQ_PWM_HZ = freq_pwm_min_hz + (rand() / var1);
|
|
|
|
//i_led2_on_off(0);
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
if (VAR_FREQ_PWM_HZ > freq_pwm_max_hz)
|
|
{
|
|
VAR_FREQ_PWM_HZ = freq_pwm_max_hz;
|
|
}
|
|
else
|
|
{
|
|
if (VAR_FREQ_PWM_HZ < freq_pwm_min_hz)
|
|
{
|
|
VAR_FREQ_PWM_HZ = freq_pwm_min_hz;
|
|
}
|
|
}
|
|
//i++;
|
|
|
|
//if (i >= COUNT_VAR_FREQ)
|
|
//{
|
|
//i = 0;
|
|
//}
|
|
|
|
}
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
//if (VAR_FREQ_PWM_HZ == FREQ_PWM_MIN)
|
|
//{
|
|
//VAR_FREQ_PWM_HZ = FREQ_PWM_MAX;
|
|
//}
|
|
//else
|
|
//{
|
|
//VAR_FREQ_PWM_HZ = FREQ_PWM_MIN;
|
|
//}
|
|
|
|
//if (f.Rele1 == 1)
|
|
//{
|
|
//if (i == 0)
|
|
//{
|
|
//VAR_FREQ_PWM_HZ = 1192;;
|
|
//i = 1;
|
|
//}
|
|
//else
|
|
//{
|
|
//VAR_FREQ_PWM_HZ = 792;
|
|
//}
|
|
//}
|
|
//else
|
|
//{
|
|
//i = 0;
|
|
//VAR_FREQ_PWM_HZ = 1192;
|
|
//}
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
}
|
|
//else
|
|
//{
|
|
//VAR_FREQ_PWM_HZ = FREQ_PWM;
|
|
//}
|
|
|
|
|
|
if (prev_freq_pwm != VAR_FREQ_PWM_HZ)
|
|
{
|
|
prev_freq_pwm = VAR_FREQ_PWM_HZ;
|
|
FREQ_MAX = _IQ(2.0*PI*F_STATOR_MAX/VAR_FREQ_PWM_HZ);
|
|
|
|
var0 = (float)VAR_FREQ_PWM_HZ;
|
|
//pwm_period = ((float64)HSPCLK) / ((float64)VAR_FREQ_PWM_HZ);
|
|
|
|
pwm_period = HSPCLK / var0;
|
|
|
|
pwm_period = pwm_period / 2.0;
|
|
|
|
FREQ_PWM_XTICS = ((int) pwm_period) >> 3;
|
|
|
|
XILINX_FREQ = 16777216/(FREQ_PWM_XTICS + 1);
|
|
|
|
FLAG_CHANGE_FREQ_PWM = 1;
|
|
}
|
|
|
|
proc_ticks++;
|
|
}
|
|
*/
|
|
/*
|
|
#pragma CODE_SECTION(test_calc_pwm24_dq,".v_24pwm_run");
|
|
void test_calc_pwm24_dq(_iq U_zad1, _iq U_zad2,_iq teta)
|
|
{
|
|
svgen_pwm24_1.Freq = 0;
|
|
svgen_pwm24_2.Freq = 0;
|
|
|
|
svgen_pwm24_1.Gain = U_zad1;
|
|
svgen_pwm24_2.Gain = U_zad2;
|
|
|
|
svgen_pwm24_1.Alpha = teta;
|
|
svgen_pwm24_2.Alpha = teta;
|
|
|
|
svgen_pwm24_1.delta_U = filter.iqU_1_fast - filter.iqU_2_fast;
|
|
svgen_pwm24_2.delta_U = filter.iqU_1_fast - filter.iqU_2_fast;
|
|
// svgen_pwm24_2.delta_U = filter.iqU_3_fast - filter.iqU_4_fast;
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
svgen_pwm24_1.delta_U = 0;
|
|
svgen_pwm24_2.delta_U = 0;
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
svgen_pwm24_1.Ia = analog.iqIu_1;
|
|
svgen_pwm24_1.Ib = analog.iqIv_1;
|
|
svgen_pwm24_1.Ic = analog.iqIw_1;;
|
|
|
|
svgen_pwm24_2.Ia = analog.iqIu_2;
|
|
svgen_pwm24_2.Ib = analog.iqIv_2;
|
|
svgen_pwm24_2.Ic = analog.iqIw_2;
|
|
|
|
svgen_pwm24_1.calc_dq(&svgen_pwm24_1);
|
|
svgen_pwm24_2.calc_dq(&svgen_pwm24_2);
|
|
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
set_predel_dshim24(&svgen_pwm24_1.Ta_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_1.Ta_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
set_predel_dshim24(&svgen_pwm24_1.Tb_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_1.Tb_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
set_predel_dshim24(&svgen_pwm24_1.Tc_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_1.Tc_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
set_predel_dshim24(&svgen_pwm24_2.Ta_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_2.Ta_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
set_predel_dshim24(&svgen_pwm24_2.Tb_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_2.Tb_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
set_predel_dshim24(&svgen_pwm24_2.Tc_0,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
set_predel_dshim24(&svgen_pwm24_2.Tc_1,VAR_PERIOD_MIN_XTICS,VAR_FREQ_PWM_XTICS);
|
|
|
|
|
|
}
|
|
*/
|
|
|
|
/*
|
|
#pragma CODE_SECTION(svgen_pwm24_calc,".v_24pwm_run");
|
|
void svgen_pwm24_calc_dq(SVGEN_PWM24 *vt)
|
|
{
|
|
|
|
if (vt->Alpha > CONST_IQ_2PI)
|
|
{
|
|
vt->Alpha -= CONST_IQ_2PI;
|
|
}
|
|
|
|
if (vt->Alpha < 0)
|
|
{
|
|
vt->Alpha += CONST_IQ_2PI;
|
|
}
|
|
|
|
|
|
calc_time_one_tk(vt->Gain, vt->Alpha, vt->delta_U, vt->Ia, vt->Ib, vt->Ic,
|
|
vt->number_svgen,vt->direct_rotor, &vt->Ta_0, &vt->Ta_1,&vt->Tb_0, &vt->Tb_1,&vt->Tc_0, &vt->Tc_1);
|
|
|
|
|
|
vt->Ta_0.Ti = vt->Ta_0.Ti/vt->XilinxFreq;
|
|
vt->Ta_1.Ti = vt->Ta_1.Ti/vt->XilinxFreq;
|
|
|
|
vt->Tb_0.Ti = vt->Tb_0.Ti/vt->XilinxFreq;
|
|
vt->Tb_1.Ti = vt->Tb_1.Ti/vt->XilinxFreq;
|
|
|
|
vt->Tc_0.Ti = vt->Tc_0.Ti/vt->XilinxFreq;
|
|
vt->Tc_1.Ti = vt->Tc_1.Ti/vt->XilinxFreq;
|
|
|
|
}
|
|
*/
|
|
|
|
|
|
|
|
|
|
void svgen_set_time_keys_closed(SVGEN_PWM24 *vt)
|
|
{
|
|
//a
|
|
if (vt->saw_direct.bits.bit0)
|
|
vt->Ta_0 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Ta_0 = vt->Tclosed_saw_direct_0;
|
|
|
|
if (vt->saw_direct.bits.bit1)
|
|
vt->Ta_1 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Ta_1 = vt->Tclosed_saw_direct_0;
|
|
//b
|
|
if (vt->saw_direct.bits.bit2)
|
|
vt->Tb_0 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Tb_0 = vt->Tclosed_saw_direct_0;
|
|
|
|
if (vt->saw_direct.bits.bit3)
|
|
vt->Tb_1 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Tb_1 = vt->Tclosed_saw_direct_0;
|
|
//c
|
|
if (vt->saw_direct.bits.bit4)
|
|
vt->Tc_0 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Tc_0 = vt->Tclosed_saw_direct_0;
|
|
|
|
if (vt->saw_direct.bits.bit5)
|
|
vt->Tc_1 = vt->Tclosed_saw_direct_1;
|
|
else
|
|
vt->Tc_1 = vt->Tclosed_saw_direct_0;
|
|
|
|
vt->prev_level = V_PWM24_PREV_PWM_CLOSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#pragma CODE_SECTION(correct_balance_uzpt_pwm24,".fast_run2");
|
|
_iq correct_balance_uzpt_pwm24(_iq Tinput, _iq Kplus)
|
|
{
|
|
//_iq pwm_t, timpuls_corr;
|
|
volatile _iq timpuls_corr;
|
|
|
|
if (Tinput >= (-Kplus))
|
|
timpuls_corr = CONST_IQ_1 - _IQdiv(CONST_IQ_1-Tinput, CONST_IQ_1+Kplus);
|
|
else
|
|
timpuls_corr = -CONST_IQ_1 + _IQdiv(CONST_IQ_1+Tinput, CONST_IQ_1-Kplus);
|
|
|
|
|
|
return timpuls_corr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#pragma CODE_SECTION(recalc_time_pwm_minimal_2_xilinx_pwm24,".fast_run2");
|
|
void recalc_time_pwm_minimal_2_xilinx_pwm24(SVGEN_PWM24 *pwm24,
|
|
unsigned int *T0, unsigned int *T1,
|
|
int *T_imp,
|
|
_iq timpuls_corr )
|
|
{
|
|
//_iq pwm_t, timpuls_corr;
|
|
|
|
volatile unsigned long pwm_t;
|
|
volatile unsigned int minimal_plus, minimal_minus;
|
|
|
|
|
|
|
|
minimal_plus = pwm24->pwm_minimal_impuls_zero_plus;
|
|
minimal_minus = pwm24->pwm_minimal_impuls_zero_minus;
|
|
|
|
// if (pwm24->prev_level == V_PWM24_PREV_PWM_CLOSE || pwm24->prev_level == V_PWM24_PREV_PWM_MIDDLE || pwm24->prev_level == V_PWM24_PREV_PWM_WORK_KM0)
|
|
// {
|
|
// minimal_plus *= 2;
|
|
// minimal_minus *= 2;
|
|
// }
|
|
|
|
pwm_t = timpuls_corr / pwm24->XilinxFreq;
|
|
|
|
*T_imp = pwm_t;
|
|
|
|
// if (pwm_t>(pwm24->Tclosed_high-4*minimal_minus))
|
|
// pwm_t=(pwm24->Tclosed_high-4*minimal_minus);
|
|
|
|
|
|
if (timpuls_corr >= 0)
|
|
{
|
|
*T0 = pwm_t + minimal_plus;
|
|
*T1 = pwm24->Tclosed_high - minimal_minus;
|
|
}
|
|
else
|
|
{
|
|
*T0 = minimal_plus;
|
|
*T1 = pwm24->Tclosed_high + pwm_t - minimal_minus;
|
|
}
|
|
|
|
|
|
if (*T0 < minimal_plus)
|
|
*T0 = minimal_plus;
|
|
|
|
if (*T0 > (pwm24->Tclosed_high - 2 * minimal_plus))
|
|
*T0 = (pwm24->Tclosed_high - 2 * minimal_plus);
|
|
|
|
if (*T1 < (2 * minimal_minus))
|
|
*T1 = 2 * minimal_minus;
|
|
|
|
if (*T1 > (pwm24->Tclosed_high - minimal_minus))
|
|
*T1 = (pwm24->Tclosed_high - minimal_minus);
|
|
|
|
}
|
|
|
|
#define WRITE_SWGEN_PWM_TIMES_VER 2//1
|
|
|
|
#if (WRITE_SWGEN_PWM_TIMES_VER==1)
|
|
#pragma CODE_SECTION(write_swgen_pwm_times,".fast_run2");
|
|
void write_swgen_pwm_times(unsigned int mode_reload)
|
|
{
|
|
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_ABC)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
}
|
|
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_ABC)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
}
|
|
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_BCA)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
}
|
|
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_BCA)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
}
|
|
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_CAB)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
}
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_NORMAL_CAB)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
}
|
|
|
|
// fix revers
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_BAC)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
}
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_BAC)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
}
|
|
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_ACB)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
}
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_ACB)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
}
|
|
|
|
if (svgen_pwm24_1.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_CBA)
|
|
{
|
|
xpwm_time.Ta0_0 = (unsigned int) svgen_pwm24_1.Tc_0;
|
|
xpwm_time.Ta0_1 = (unsigned int) svgen_pwm24_1.Tc_1;
|
|
xpwm_time.Tb0_0 = (unsigned int) svgen_pwm24_1.Tb_0;
|
|
xpwm_time.Tb0_1 = (unsigned int) svgen_pwm24_1.Tb_1;
|
|
xpwm_time.Tc0_0 = (unsigned int) svgen_pwm24_1.Ta_0;
|
|
xpwm_time.Tc0_1 = (unsigned int) svgen_pwm24_1.Ta_1;
|
|
}
|
|
if (svgen_pwm24_2.phase_sequence == V_PWM24_PHASE_SEQ_REVERS_CBA)
|
|
{
|
|
xpwm_time.Ta1_0 = (unsigned int) svgen_pwm24_2.Tc_0;
|
|
xpwm_time.Ta1_1 = (unsigned int) svgen_pwm24_2.Tc_1;
|
|
xpwm_time.Tb1_0 = (unsigned int) svgen_pwm24_2.Tb_0;
|
|
xpwm_time.Tb1_1 = (unsigned int) svgen_pwm24_2.Tb_1;
|
|
xpwm_time.Tc1_0 = (unsigned int) svgen_pwm24_2.Ta_0;
|
|
xpwm_time.Tc1_1 = (unsigned int) svgen_pwm24_2.Ta_1;
|
|
}
|
|
|
|
xpwm_time.Tbr0_0 = break_result_1;
|
|
xpwm_time.Tbr0_1 = break_result_2;
|
|
xpwm_time.Tbr1_0 = 0;//break_result_3;
|
|
xpwm_time.Tbr1_1 = 0;//break_result_4;
|
|
xpwm_time.mode_reload = mode_reload;
|
|
|
|
xpwm_time.write_1_2_winding_break_times(&xpwm_time);
|
|
}
|
|
#endif
|
|
///////////////////////////////////////////////////////
|
|
// ver 2
|
|
///////////////////////////////////////////////////////
|
|
#if (WRITE_SWGEN_PWM_TIMES_VER==2)
|
|
|
|
#pragma CODE_SECTION(set_pwm_times,".fast_run2");
|
|
void set_pwm_times(unsigned int Ta0, unsigned int Ta1, unsigned int Tb0, unsigned int Tb1, unsigned int Tc0, unsigned int Tc1, unsigned int winding_num)
|
|
{
|
|
if (winding_num == 0)
|
|
{
|
|
xpwm_time.Ta0_0 = Ta0;
|
|
xpwm_time.Ta0_1 = Ta1;
|
|
xpwm_time.Tb0_0 = Tb0;
|
|
xpwm_time.Tb0_1 = Tb1;
|
|
xpwm_time.Tc0_0 = Tc0;
|
|
xpwm_time.Tc0_1 = Tc1;
|
|
}
|
|
else
|
|
{
|
|
xpwm_time.Ta1_0 = Ta0;
|
|
xpwm_time.Ta1_1 = Ta1;
|
|
xpwm_time.Tb1_0 = Tb0;
|
|
xpwm_time.Tb1_1 = Tb1;
|
|
xpwm_time.Tc1_0 = Tc0;
|
|
xpwm_time.Tc1_1 = Tc1;
|
|
}
|
|
}
|
|
|
|
#pragma CODE_SECTION(process_phase_sequence,".fast_run2");
|
|
void process_phase_sequence(SVGEN_PWM24 svgen_pwm, unsigned int winding_num)
|
|
{
|
|
switch (svgen_pwm.phase_sequence)
|
|
{
|
|
case V_PWM24_PHASE_SEQ_NORMAL_ABC:
|
|
set_pwm_times(svgen_pwm.Ta_0, svgen_pwm.Ta_1, svgen_pwm.Tb_0, svgen_pwm.Tb_1, svgen_pwm.Tc_0, svgen_pwm.Tc_1, winding_num);
|
|
break;
|
|
case V_PWM24_PHASE_SEQ_NORMAL_BCA:
|
|
set_pwm_times(svgen_pwm.Tb_0, svgen_pwm.Tb_1, svgen_pwm.Tc_0, svgen_pwm.Tc_1, svgen_pwm.Ta_0, svgen_pwm.Ta_1, winding_num);
|
|
break;
|
|
case V_PWM24_PHASE_SEQ_NORMAL_CAB:
|
|
set_pwm_times(svgen_pwm.Tc_0, svgen_pwm.Tc_1, svgen_pwm.Ta_0, svgen_pwm.Ta_1, svgen_pwm.Tb_0, svgen_pwm.Tb_1, winding_num);
|
|
break;
|
|
case V_PWM24_PHASE_SEQ_REVERS_BAC:
|
|
set_pwm_times(svgen_pwm.Tb_0, svgen_pwm.Tb_1, svgen_pwm.Ta_0, svgen_pwm.Ta_1, svgen_pwm.Tc_0, svgen_pwm.Tc_1, winding_num);
|
|
break;
|
|
case V_PWM24_PHASE_SEQ_REVERS_ACB:
|
|
set_pwm_times(svgen_pwm.Ta_0, svgen_pwm.Ta_1, svgen_pwm.Tc_0, svgen_pwm.Tc_1, svgen_pwm.Tb_0, svgen_pwm.Tb_1, winding_num);
|
|
break;
|
|
case V_PWM24_PHASE_SEQ_REVERS_CBA:
|
|
set_pwm_times(svgen_pwm.Tc_0, svgen_pwm.Tc_1, svgen_pwm.Tb_0, svgen_pwm.Tb_1, svgen_pwm.Ta_0, svgen_pwm.Ta_1, winding_num);
|
|
break;
|
|
}
|
|
}
|
|
#pragma CODE_SECTION(write_swgen_pwm_times,".fast_run2");
|
|
void write_swgen_pwm_times(unsigned int mode_reload)
|
|
{
|
|
process_phase_sequence(svgen_pwm24_1, 0);
|
|
process_phase_sequence(svgen_pwm24_2, 1);
|
|
|
|
// fix breaks
|
|
xpwm_time.Tbr0_0 = break_result_1;
|
|
xpwm_time.Tbr0_1 = break_result_2;
|
|
xpwm_time.Tbr1_0 = 0; // break_result_3;
|
|
xpwm_time.Tbr1_1 = 0; // break_result_4;
|
|
xpwm_time.mode_reload = mode_reload;
|
|
|
|
xpwm_time.write_1_2_winding_break_times(&xpwm_time);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
|
|
void svgen_set_time_middle_keys_open(SVGEN_PWM24 *vt)
|
|
{
|
|
//a
|
|
if (vt->saw_direct.bits.bit0)
|
|
vt->Ta_0 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Ta_0 = vt->Tclosed_saw_direct_1;
|
|
|
|
if (vt->saw_direct.bits.bit1)
|
|
vt->Ta_1 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Ta_1 = vt->Tclosed_saw_direct_1;
|
|
//b
|
|
if (vt->saw_direct.bits.bit2)
|
|
vt->Tb_0 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Tb_0 = vt->Tclosed_saw_direct_1;
|
|
|
|
if (vt->saw_direct.bits.bit3)
|
|
vt->Tb_1 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Tb_1 = vt->Tclosed_saw_direct_1;
|
|
//c
|
|
if (vt->saw_direct.bits.bit4)
|
|
vt->Tc_0 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Tc_0 = vt->Tclosed_saw_direct_1;
|
|
|
|
if (vt->saw_direct.bits.bit5)
|
|
vt->Tc_1 = vt->Tclosed_saw_direct_0;
|
|
else
|
|
vt->Tc_1 = vt->Tclosed_saw_direct_1;
|
|
|
|
|
|
vt->prev_level = V_PWM24_PREV_PWM_MIDDLE;
|
|
|
|
/*
|
|
|
|
vt->Ta_0 = 0;
|
|
vt->Ta_1 = vt->Tclosed;//var_freq_pwm_xtics + 1;
|
|
|
|
vt->Tb_0 = 0;
|
|
vt->Tb_1 = vt->Tclosed;// var_freq_pwm_xtics + 1;
|
|
|
|
vt->Tc_0 = 0;
|
|
vt->Tc_1 = vt->Tclosed;// var_freq_pwm_xtics + 1;
|
|
*/
|
|
}
|
|
|
|
///////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////
|
|
|
|
|
|
#pragma CODE_SECTION(detect_level_interrupt,".fast_run");
|
|
unsigned int detect_level_interrupt(int flag_second_PCH)
|
|
{
|
|
unsigned int curr_period1, curr_period2, curr_period0;
|
|
static unsigned int count_err_read_pwm_xilinx = 0;
|
|
|
|
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
curr_period0 = ReadMemory(ADR_SAW_VALUE);
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
curr_period1 = ReadMemory(ADR_SAW_VALUE);
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
curr_period2 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
xpwm_time.current_period = curr_period2;
|
|
|
|
|
|
// ìû íàõîäèìñÿ â íèæíåé ÷àñòè ïèëû?
|
|
if (xpwm_time.current_period<xpwm_time.half_pwm_tics)
|
|
{
|
|
xpwm_time.where_interrupt = PWM_LOW_LEVEL_INTERRUPT;
|
|
xpwm_time.what_next_interrupt = PWM_HIGH_LEVEL_INTERRUPT;
|
|
xpwm_time.do_sync_out = (flag_second_PCH==0);
|
|
}
|
|
else // ìû íàõîäèìñÿ â âåðõíåé ÷àñòè ïèëû?
|
|
{
|
|
xpwm_time.where_interrupt = PWM_HIGH_LEVEL_INTERRUPT;
|
|
xpwm_time.what_next_interrupt = PWM_LOW_LEVEL_INTERRUPT;
|
|
xpwm_time.do_sync_out = !(flag_second_PCH==0);
|
|
}
|
|
|
|
// ïî èäåå ýòîò êîä âûïîëíèòñÿ ïðè êàêèõ òî î÷åíü áîëüøèõ ðàñõîæäåíèé â ïîêàçàíèÿõ
|
|
if (curr_period2>curr_period1) // èäåì ââåðõ ïî ïèëå
|
|
{
|
|
if ((curr_period2-curr_period1)>xpwm_time.half_pwm_tics)// î÷åíü áîëüøîé ðàçáðîñ
|
|
{
|
|
// xpwm_time.what_next_interrupt = 1;
|
|
// âîçâðàùàåì îøèáêó
|
|
return 1;
|
|
}
|
|
}
|
|
else// èäåì âíèç ïî ïèëå
|
|
{
|
|
if ((curr_period1-curr_period2)>xpwm_time.half_pwm_tics)// î÷åíü áîëüøîé ðàçáðîñ
|
|
{
|
|
// âîçâðàùàåì îøèáêó
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// íåò îøèáîê, îê!
|
|
return 0;
|
|
|
|
|
|
}
|
|
|