Начал векторное управление

This commit is contained in:
Eugene 2023-09-20 17:43:56 +03:00
parent 25d268d3d0
commit 9fa169da27
10 changed files with 428 additions and 32 deletions

View File

@ -120,12 +120,12 @@ void PWMInitInterruptEn(void)
//
// Enable EPWM INTn in the PIE: Group 3 interrupt 1-3
//
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
// PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
// PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
PieCtrlRegs.PIEIER3.bit.INTx5 = 1;
PieCtrlRegs.PIEIER3.bit.INTx6 = 1;
// PieCtrlRegs.PIEIER3.bit.INTx6 = 1;
}

View File

@ -12,7 +12,7 @@
#define SYS_PWM_FREQUENCY 100000000.0 //Hz
#define FREQUENCY_BRAKE 20000.0 //Hz
#define FREQUENCY_BRAKE 200000.0 //Hz
#define FREQUENCY_MOTOR 10000.0 //Hz
#define EPWM_DB_mkS 3.0 //mkS

View File

@ -11,11 +11,32 @@
#include "gpio_init.h"
#include "i2c_init.h"
#include "timer_base.h"
#include "vector.h"
#include "pwm_interrupts.h"
volatile uint16_t AutoChange = 0;
volatile uint16_t PWM_out = 0;
volatile uint16_t PWM_motor = PERIOD_2;
//volatile uint16_t PWM_motor = PERIOD_2;
uint16_t Fault = 0, Fault_fix = 0, Ready = 0;
uint16_t counter1s=0, Step = 0;
TMode Mode = OffMode;
typedef struct
{
int16_t UA;
int16_t UB;
int16_t UC;
}strPWMABC;
volatile strPWMABC PWM_motor = {PERIOD_2, PERIOD_2, PERIOD_2};
void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC)
{
PWM_motor.UA = PERIOD_2 + (int16_t)(phaseA*PERIOD_2/100.0);
PWM_motor.UB = PERIOD_2 + (int16_t)(phaseB*PERIOD_2/100.0);
PWM_motor.UC = PERIOD_2 + (int16_t)(phaseC*PERIOD_2/100.0);
}
//
// epwm1_isr - EPWM1 ISR
//
@ -46,9 +67,15 @@ __interrupt void epwm2_isr(void)
Gpio20out(1);
// if(AutoChange) pwm_AutoChange(2);
// else
EPwm2Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor;
EPwm2Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor.UA;
EPwm3Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor.UB;
EPwm4Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor.UC;
// GpioDataRegs.GPADAT.bit.GPIO0 = 1;
Step++;
if(Mode == StepMode) vector_set_angle(Step);
vector_inversion();
FMSTR_enable_set();
Step++;
//
// Clear INT flag for this timer
//
@ -69,7 +96,7 @@ __interrupt void epwm3_isr(void)
{
// if(AutoChange) pwm_AutoChange(3);
// else
EPwm3Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor;
EPwm3Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor.UB;
//
// Clear INT flag for this timer
@ -87,7 +114,7 @@ __interrupt void epwm4_isr(void)
{
// if(AutoChange) pwm_AutoChange(4);
// else
EPwm4Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor;
EPwm4Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor.UC;
//
// Clear INT flag for this timer
//

View File

@ -8,6 +8,11 @@
#ifndef SRC_PWM_INTERRUPTS_H_
#define SRC_PWM_INTERRUPTS_H_
typedef enum
{
OffMode, //Ìîòîð îñòàíîâëåí
StepMode, //
}TMode;
__interrupt void epwm1_isr(void);
__interrupt void epwm2_isr(void);
@ -15,6 +20,9 @@ __interrupt void epwm3_isr(void);
__interrupt void epwm4_isr(void);
__interrupt void epwm5_isr(void);
__interrupt void epwm6_isr(void);
void pwm_set_volt_3F(float phaseA, float phaseB, float phaseC);
#endif /* SRC_PWM_INTERRUPTS_H_ */

View File

@ -8,6 +8,7 @@
#include "f28x_project.h"
#include "f2838x_sdfm_drivers.h"
#include "gpio_init.h"
#include "sdfm.h"
//
// Defines
//
@ -19,10 +20,11 @@
#define SDFM_PIN_MUX_OPTION3 3
#define EPWM_TIMER_TBPRD 65535 // ePWM Period register
#define SDFM_INT_MASK 0x80001000U
//
// Globals
//
uint16_t gPeripheralNumber;
//uint16_t gPWM_number = 1; // ePWM 1 for synchronizing SDFM1 filters
int16_t Filter1_Result[MAX_SAMPLES];
@ -39,16 +41,39 @@ uint16_t startInitCurrent = 0;
uint16_t initDone = 0;
__interrupt void Sdfm1_ISR(void);
__interrupt void Sdfm2_ISR(void);
volatile float CurrentFactorBrake = FACTOR_CURRENT_BRAKE;
volatile float CurrentFactorMotor = FACTOR_CURRENT_MOTOR;
void SdfmGpioInit(void)
{
EALLOW;
GPIO_SetupPinOptions(16, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(16,GPIO_MUX_CPU1,7);
GPIO_SetupPinMux(16,GPIO_MUX_CPU1,7); //SDFM-1 Channel 1 Data Input
GPIO_SetupPinOptions(17, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(17,GPIO_MUX_CPU1,7);
GPIO_SetupPinMux(17,GPIO_MUX_CPU1,7); //SDFM-1 Channel 1 Clock Input
GPIO_SetupPinOptions(22, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(22,GPIO_MUX_CPU1,7); //SDFM-1 Channel 4 Data Input
GPIO_SetupPinOptions(23, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(23,GPIO_MUX_CPU1,7); //SDFM-1 Channel 4 Clock Input
GPIO_SetupPinOptions(24, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(24,GPIO_MUX_CPU1,7); //SDFM-2 Channel 1 Data Input
GPIO_SetupPinOptions(25, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(25,GPIO_MUX_CPU1,7); //SDFM-2 Channel 1 Clock Input
GPIO_SetupPinOptions(58, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(58,GPIO_MUX_CPU1,7); //SDFM-2 Channel 2 Data Input
GPIO_SetupPinOptions(59, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(59,GPIO_MUX_CPU1,7); //SDFM-2 Channel 2 Clock Input
GPIO_SetupPinOptions(60, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(60,GPIO_MUX_CPU1,7); //SDFM-2 Channel 3 Data Input
GPIO_SetupPinOptions(61, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinMux(61,GPIO_MUX_CPU1,7); //SDFM-2 Channel 3 Clock Input
EDIS;
}
@ -57,22 +82,26 @@ void SdfmInitEnable(void)
{
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
CpuSysRegs.PCLKCR6.bit.SD1 = 1;
CpuSysRegs.PCLKCR6.bit.SD2 = 1;
}
void SdfmInitInterruptEn(void)
{
EALLOW;
PieVectTable.SDFM1_INT = &Sdfm1_ISR;
PieVectTable.SDFM2_INT = &Sdfm2_ISR;
IER |= M_INT5;
PieCtrlRegs.PIEIER5.bit.INTx9 = 1; // SDFM1 interrupt enabled
// PieCtrlRegs.PIEIER5.bit.INTx10 = 1; // SDFM2 interrupt enabled
EDIS;
}
void SdfmInit(uint16_t Num)
void SdfmInit(void)
{
uint16_t HLT, LLT;
gPeripheralNumber = Num;
//
// Configure SDFM type to 0
//
@ -86,9 +115,11 @@ void SdfmInit(uint16_t Num)
//
// Configure Input Control Mode: Modulator Clock rate = Modulator data rate
//
Sdfm_configureInputCtrl(gPeripheralNumber, FILTER1, MODE_0);
Sdfm_configureInputCtrl(SDFM1, FILTER1, MODE_0);
// Sdfm_configureInputCtrl(SDFM1, FILTER4, MODE_0);
// Sdfm_configureInputCtrl(SDFM2, FILTER1, MODE_0);
// Sdfm_configureInputCtrl(SDFM2, FILTER2, MODE_0);
// Sdfm_configureInputCtrl(SDFM2, FILTER3, MODE_0);
//
// Comparator Module
//
@ -99,9 +130,11 @@ void SdfmInit(uint16_t Num)
// Configure Comparator module's comparator filter type and comparator's OSR
// value, higher threshold, lower threshold
//
Sdfm_configureComparator(gPeripheralNumber, FILTER1, SINC3, OSR_32,
HLT, LLT);
Sdfm_configureComparator(SDFM1, FILTER1, SINC3, OSR_32, HLT, LLT);
// Sdfm_configureComparator(SDFM1, FILTER4, SINC3, OSR_32, HLT, LLT);
// Sdfm_configureComparator(SDFM2, FILTER1, SINC3, OSR_32, HLT, LLT);
// Sdfm_configureComparator(SDFM2, FILTER2, SINC3, OSR_32, HLT, LLT);
// Sdfm_configureComparator(SDFM2, FILTER3, SINC3, OSR_32, HLT, LLT);
//
// Enable Master filter bit: Unless this bit is set none of the filter modules
// can be enabled. All the filter modules are synchronized when master filter
@ -109,17 +142,19 @@ void SdfmInit(uint16_t Num)
// modules are asynchronized when master filter bit is enabled before
// individual filter modules are enabled.
//
Sdfm_enableMFE(gPeripheralNumber);
Sdfm_enableMFE(SDFM1);
// Sdfm_enableMFE(SDFM2);
//
// Data filter Module
//
// Configure Data filter modules filter type, OSR value and
// enable / disable data filter
//
Sdfm_configureData_filter(gPeripheralNumber, FILTER1, FILTER_ENABLE, SINC3,
OSR_256, DATA_16_BIT, SHIFT_9_BITS);
Sdfm_configureData_filter(SDFM1, FILTER1, FILTER_ENABLE, SINC3, OSR_256, DATA_16_BIT, SHIFT_9_BITS);
// Sdfm_configureData_filter(SDFM1, FILTER4, FILTER_ENABLE, SINC3, OSR_256, DATA_16_BIT, SHIFT_9_BITS);
// Sdfm_configureData_filter(SDFM2, FILTER1, FILTER_ENABLE, SINC3, OSR_256, DATA_16_BIT, SHIFT_9_BITS);
// Sdfm_configureData_filter(SDFM2, FILTER2, FILTER_ENABLE, SINC3, OSR_256, DATA_16_BIT, SHIFT_9_BITS);
// Sdfm_configureData_filter(SDFM2, FILTER3, FILTER_ENABLE, SINC3, OSR_256, DATA_16_BIT, SHIFT_9_BITS);
EALLOW;
// Sdfm1Regs.SDSYNC1.bit.SYNCSEL = 0;
@ -130,7 +165,7 @@ void SdfmInit(uint16_t Num)
Sdfm_configureInterrupt(gPeripheralNumber, FILTER1, IEH_DISABLE,
Sdfm_configureInterrupt(SDFM1, FILTER1, IEH_DISABLE,
IEL_DISABLE, MFIE_ENABLE, AE_ENABLE);
@ -139,7 +174,7 @@ void SdfmInit(uint16_t Num)
// Enable master interrupt so that any of the filter interrupts can trigger
// by SDFM interrupt to CPU
//
Sdfm_enableMIE(gPeripheralNumber);
Sdfm_enableMIE(SDFM1);
}
@ -158,7 +193,72 @@ __interrupt void Sdfm1_ISR(void)
// Wait for result from all the filters (SDIFLG)
//
uint32_t IntFlags = Sdfm_readFlagRegister(gPeripheralNumber);
uint32_t IntFlags = Sdfm_readFlagRegister(SDFM1);
// while((Sdfm_readFlagRegister(SDFM1) &
// SDFM_INT_MASK) != SDFM_INT_MASK);
if (IntFlags & 0x1000)
{
if(loopCounter1 >= (MAX_SAMPLES-1))
{
loopCounter1 = 0;
if(startInitCurrent < SKIP_FIRST) startInitCurrent++;
else if(!initDone)
{
for(i = 0; i <= (MAX_SAMPLES-1); i++)
{
OffsetCount += Filter1_Result[i];
}
sdfmOffset = OffsetCount>>FILTER_BIT;
initDone = 1;
}
}
Filter1_Result[loopCounter1++] = SDFM1_READ_FILTER1_DATA_16BIT;
ADC_ampere = Filter1_Result[loopCounter1-1] - sdfmOffset;
}
if(IntFlags & 0x100)
{
ADC_ampere = 0;
EALLOW;
Sdfm1Regs.SDCPARM1.bit.MFIE = 0;
EDIS;
}
else
{
EALLOW;
Sdfm1Regs.SDCPARM1.bit.MFIE = 1;
EDIS;
}
//
// Clear SDFM flag register
//
Sdfm_clearFlagRegister(SDFM1,IntFlags);
//
// Acknowledge this __interrupt to receive more __interrupts from group 5
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
Gpio21out(0);
}
//
// Sdfm1_ISR - SDFM 1 ISR
//
__interrupt void Sdfm2_ISR(void)
{
static uint16_t loopCounter1 = 0;
uint16_t i = 0;
int32_t OffsetCount = 0;
Gpio21out(1);
//
// Wait for result from all the filters (SDIFLG)
//
uint32_t IntFlags = Sdfm_readFlagRegister(SDFM2);
// while((Sdfm_readFlagRegister(gPeripheralNumber) &
// SDFM_INT_MASK) != SDFM_INT_MASK);
@ -200,7 +300,7 @@ __interrupt void Sdfm1_ISR(void)
//
// Clear SDFM flag register
//
Sdfm_clearFlagRegister(gPeripheralNumber,IntFlags);
Sdfm_clearFlagRegister(SDFM2,IntFlags);
//
// Acknowledge this __interrupt to receive more __interrupts from group 5

View File

@ -8,10 +8,17 @@
#ifndef SRC_SDFM_H_
#define SRC_SDFM_H_
#define SDFM_VOLTAGE_MAX 320.0 //mV
#define R_BRAKE 220.0 //mOM
#define R_DRW 4.0 //mOM
#define FACTOR_CURRENT_BRAKE (SDFM_VOLTAGE_MAX/R_BRAKE) //mOM
#define FACTOR_CURRENT_MOTOR (SDFM_VOLTAGE_MAX/R_DRW) //mOM
void SdfmGpioInit(void);
void SdfmInitEnable(void);
void SdfmInitInterruptEn(void);
void SdfmInit(uint16_t Num);
void SdfmInit(void);

View File

@ -6,7 +6,7 @@
*/
#include "f28x_project.h"
#include "init_perif.h"
#include"frm_uart.h"
#include "frm_uart.h"
volatile uint16_t counter=0 ;
volatile uint16_t counter1=0 ;

View File

@ -67,7 +67,7 @@ void InitPerif(void)
PWMInitInterruptEn();
PWMAllInit();
SdfmInitInterruptEn();
SdfmInit(SDFM1);
SdfmInit();
SpiBInit();
I2CMasterInit(I2C_OWN_ADDRESS,I2C_SLAVE_ADDRESS);
//

View File

@ -0,0 +1,216 @@
/*
* vector.c
*
* Created on: 20 ñåíò. 2023 ã.
* Author: seklyuts
*/
#include "f28x_project.h"
#include "pwm_interrupts.h"
#include "vector.h"
#include "iqmath.h"
const int16_t mcgenSineTable256[257] = \
{ 0,-201,-402,-603,-804,-1005,-1206,-1407,-1607,-1808,
-2009,-2210,-2410,-2611,-2811,-3011,-3211,-3411,-3611,-3811,
-4011,-4210,-4409,-4609,-4808,-5006,-5205,-5403,-5602,-5800,
-5997,-6195,-6392,-6589,-6786,-6983,-7179,-7375,-7571,-7766,
-7961,-8156,-8351,-8545,-8739,-8933,-9126,-9319,-9512,-9704,
-9896,-10087,-10278,-10469,-10659,-10849,-11039,-11228,-11416,-11605,
-11793,-11980,-12167,-12353,-12539,-12725,-12910,-13094,-13278,-13462,
-13645,-13828,-14010,-14191,-14372,-14552,-14732,-14912,-15090,-15269,
-15446,-15623,-15800,-15976,-16151,-16325,-16499,-16673,-16846,-17018,
-17189,-17360,-17530,-17700,-17869,-18037,-18204,-18371,-18537,-18703,
-18868,-19032,-19195,-19358,-19519,-19681,-19841,-20001,-20159,-20318,
-20475,-20631,-20787,-20942,-21097,-21250,-21403,-21555,-21706,-21856,
-22005,-22154,-22301,-22448,-22594,-22740,-22884,-23027,-23170,-23312,
-23453,-23593,-23732,-23870,-24007,-24144,-24279,-24414,-24547,-24680,
-24812,-24943,-25073,-25201,-25330,-25457,-25583,-25708,-25832,-25955,
-26077,-26199,-26319,-26438,-26557,-26674,-26790,-26905,-27020,-27133,
-27245,-27356,-27466,-27576,-27684,-27791,-27897,-28002,-28106,-28208,
-28310,-28411,-28511,-28609,-28707,-28803,-28898,-28993,-29086,-29178,
-29269,-29359,-29447,-29535,-29621,-29707,-29791,-29874,-29956,-30037,
-30117,-30196,-30273,-30350,-30425,-30499,-30572,-30644,-30714,-30784,
-30852,-30919,-30985,-31050,-31114,-31176,-31237,-31298,-31357,-31414,
-31471,-31526,-31581,-31634,-31685,-31736,-31785,-31834,-31881,-31927,
-31971,-32015,-32057,-32098,-32138,-32176,-32214,-32250,-32285,-32319,
-32351,-32383,-32413,-32442,-32469,-32496,-32521,-32545,-32568,-32589,
-32610,-32629,-32647,-32663,-32679,-32693,-32706,-32718,-32728,-32737,
-32745,-32752,-32758,-32762,-32765,-32767,-32767 };
typedef struct
{
float q; //íàïðÿæåíèå Uq, Â
float d; //íàïðÿæåíèå Ud, Â
}Tvector2dq;
typedef struct
{
float Alfa; //íàïðÿæåíèå Uq, Â
float Beta; //íàïðÿæåíèå Ud, Â
}Tvector2ph;
typedef struct
{
float a; //íàïðÿæåíèå Uq, Â
float b; //íàïðÿæåíèå Ud, Â
float c; //íàïðÿæåíèå Ud, Â
}Tvector3abc;
typedef struct
{
int16_t Angle;
float sin; //íàïðÿæåíèå Uq, Â
float cos; //íàïðÿæåíèå Ud, Â
}TvectorSinCos;
Tvector2dq vectorUdq, vectorIdq;
Tvector2ph vectorU2ph, vectorI2ph;
Tvector3abc vectorUabc, vectorIabc;
TvectorSinCos vectorSinCos;
uint16_t VecSector;
void vector_set_angle(int16_t val)
{
vectorSinCos.Angle = val;
}
int16_t mcsinPIxLUT(int16_t Value, int16_t *psinTable)
{
// set saturation on
if (Value>=0)
{
return ( Value > ANGLE_PI_DIVIDE_2_F16 ? -psinTable[(2*SIN_LENGTH_TABLE- \
(Value>> SIN_INDEX_SHIFT))] : -psinTable[(Value >> SIN_INDEX_SHIFT)] );
}
else
{
return ( Value < -ANGLE_PI_DIVIDE_2_F16 ? psinTable[(2*SIN_LENGTH_TABLE- \
-(Value >> SIN_INDEX_SHIFT))] : psinTable[(-(Value >> SIN_INDEX_SHIFT))] );
}
}
void vector_inversion(void)
{
float temp1, temp2, temp3;
vectorSinCos.sin = ((float)mcsinPIxLUT(vectorSinCos.Angle, (int16_t *)&mcgenSineTable256))/32768.0;
vectorSinCos.cos = ((float)mcsinPIxLUT((vectorSinCos.Angle + ANGLE_PI_DIVIDE_2_F16),(int16_t *)&mcgenSineTable256))/32768.0;
vectorU2ph.Alfa = _IQmpy(vectorUdq.d,vectorSinCos.cos) - _IQmpy(vectorUdq.q,vectorSinCos.sin);
vectorU2ph.Beta = _IQmpy(vectorUdq.q,vectorSinCos.cos) + _IQmpy(vectorUdq.d,vectorSinCos.sin);
temp1= vectorU2ph.Beta;
temp2= _IQdiv2(vectorU2ph.Beta) + (_IQmpy(_IQ(0.866),vectorU2ph.Alfa));
temp3= temp2 - temp1;
VecSector=3;
VecSector=(temp2> 0)?( VecSector-1):VecSector;
VecSector=(temp3> 0)?( VecSector-1):VecSector;
VecSector=(temp1< 0)?(7-VecSector) :VecSector;
if (VecSector==1 || VecSector==4)
{
vectorUabc.a= temp2;
vectorUabc.b= temp1-temp3;
vectorUabc.c=-temp2;
}
else if(VecSector==2 || VecSector==5)
{
vectorUabc.a= temp3+temp2;
vectorUabc.b= temp1;
vectorUabc.c=-temp1;
}
else
{
vectorUabc.a= temp3;
vectorUabc.b=-temp3;
vectorUabc.c=-(temp1+temp2);
}
pwm_set_volt_3F(vectorUabc.a,vectorUabc.b,vectorUabc.c);
}
void vector_klark_park(uint16_t SectorOn)
{
//Ôèëüòðóåì íàïðÿæåíèå â çâåíå ïîñòîÿííîãî òîêà(ïåðåâîäèì åãî èç îòñ÷åòîâ ÀÖÏ â Âîëüòû)
// FILTER_FL(PmsmVect.UdcFilter, ((float)Inputs->UdcAdc * PmsmVect.FactorUdc));
/* if (Inputs->UpdateUdc)
{
//Çàïîìèíàåì Udc äëÿ êîíòóðà òîêà(îãðàíè÷åíèå Umax è Umin â ÏÈ-ðåãóëÿòîðå)
Outputs->Udc = PmsmVect.UdcFilter.Output;
//Çàùèòà îò äåëåíèÿ íà 0 è îòðèöàòåëüíûõ ÷èñåë
if (Outputs->Udc <= 0.0f)
Outputs->Udc = VOLTAGE_UDC;
//Ðàñ÷åò êîýôôèöèåíòà äëÿ ðàñ÷åòà ñêâàæíîñòè ØÈÌ(îäèí ðàç äåëèì, ïîòîì êàæäûé öèêë ØÈÌ óìíîæàåì, ýòî ýôôåêòèâíåå)
PmsmVect.UdcPwmFactor = 1.0f/Outputs->Udc;
//Ñáðîñ ôëàãà
Inputs->UpdateUdc = false;
}*/
//Âûïîëíåíèå ïðåîáðàçîâàíèå Êëàðêà
/* PmsmVect.AdcZeroCurr[e_phaseA] = PmsmVect.AdcZeroLvl[e_phaseA] - Inputs->Adc[e_phaseA];
PmsmVect.AdcZeroCurr[e_phaseB] = PmsmVect.AdcZeroLvl[e_phaseB] - Inputs->Adc[e_phaseB];
PmsmVect.AdcZeroCurr[e_phaseC] = PmsmVect.AdcZeroLvl[e_phaseC] - Inputs->Adc[e_phaseC];
if (SectorOn )
{
switch (PmsmVect.Svgen.VecSector) {
case 2:
case 3:
PmsmVect.Clarke.As = PmsmVect.AdcZeroCurr[e_phaseA] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Cs = PmsmVect.AdcZeroCurr[e_phaseC] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Bs = - PmsmVect.Clarke.As - PmsmVect.Clarke.Cs;
break;
case 4:
case 5:
PmsmVect.Clarke.As = PmsmVect.AdcZeroCurr[e_phaseA] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Bs = PmsmVect.AdcZeroCurr[e_phaseB] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Cs = - PmsmVect.Clarke.As - PmsmVect.Clarke.Bs;
break;
case 1:
case 6:
default:
PmsmVect.Clarke.Bs = PmsmVect.AdcZeroCurr[e_phaseB] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Cs = PmsmVect.AdcZeroCurr[e_phaseC] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.As = - PmsmVect.Clarke.Bs - PmsmVect.Clarke.Cs;
break;
}
}
else {
PmsmVect.Clarke.As = PmsmVect.AdcZeroCurr[e_phaseA] * PmsmVect.FactorCurrent; //ADC -> A
PmsmVect.Clarke.Bs = PmsmVect.AdcZeroCurr[e_phaseB] * PmsmVect.FactorCurrent;
PmsmVect.Clarke.Cs = PmsmVect.AdcZeroCurr[e_phaseC] * PmsmVect.FactorCurrent;
}
CLARKE_MACRO1(PmsmVect.Clarke);
//Ïåðåâîä èç îòñ÷åòîâ äàò÷èêà ðîòîðà â ýëåêòðè÷åñêèå ðàäèàíû
PmsmVect.Park.Angle = Inputs->Angle * PmsmVect.FactorAngle; //îòñ÷. ìåõ. -> ðàä. ýë.
// ïðåîáðàçîâàíèå Ïàðêà
PmsmVect.Park.Alpha = PmsmVect.Clarke.Alpha;
PmsmVect.Park.Beta = PmsmVect.Clarke.Beta;
PmsmVect.iPark.Sine = PmsmVect.Park.Sine = sin(PmsmVect.Park.Angle);
PmsmVect.iPark.Cosine = PmsmVect.Park.Cosine = cos(PmsmVect.Park.Angle);
PARK_MACRO(PmsmVect.Park);
Outputs->IqFbk = PmsmVect.Park.Qs;
Outputs->IdFbk = PmsmVect.Park.Ds;*/
}

View File

@ -0,0 +1,38 @@
/*
* vector.h
*
* Created on: 20 ñåíò. 2023 ã.
* Author: seklyuts
*/
#ifndef SRC_VECTOR_H_
#define SRC_VECTOR_H_
#define sng(x) ((x)?((x>0)?1:(-1)):(0))
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define rsh(x,n) ( (x>=0)?(x>>n):( -((-x)>>n) ))
#define abs(x) (x>0?x:-x)
#define saturate(x,a,b) ((x>b)?b:((x<a)?a:x))
#define FRAC16(x) ((int16_t)((x) < 1 ? ((x) >= -1 ? ((int16_t)((x)*0x8000)) : ((int16_t)0x8000)) : ((int16_t)0x7FFF)))
//#define FRAC16(x) ((int16_t)((x)*0x7FFF))
#define FRAC32(x) ((int32_t)((x) < 1 ? ((x) >= -1 ? ((int32_t)((x)*0x80000000)) : ((int32_t)0x80000000)) : ((int32_t)0x7FFFFFFF)))
#define SQRT3 1.7320508
#define ONE_DIV_SQRT3 FRAC16(1/SQRT3)
#define HALF_SQRT3 FRAC16(SQRT3/2)
#define ANGLE_PI_DIVIDE_2_F16 16384
#define SIN_INDEX_SHIFT 6
#define SIN_LENGTH_TABLE 256
int16_t mcsinPIxLUT(int16_t Value, int16_t *psinTable);
void vector_inversion(void);
void vector_set_angle(int16_t val);
#endif /* SRC_VECTOR_H_ */