Начал векторное управление
This commit is contained in:
parent
25d268d3d0
commit
9fa169da27
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
//
|
||||
|
||||
@ -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_ */
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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 ;
|
||||
|
||||
@ -67,7 +67,7 @@ void InitPerif(void)
|
||||
PWMInitInterruptEn();
|
||||
PWMAllInit();
|
||||
SdfmInitInterruptEn();
|
||||
SdfmInit(SDFM1);
|
||||
SdfmInit();
|
||||
SpiBInit();
|
||||
I2CMasterInit(I2C_OWN_ADDRESS,I2C_SLAVE_ADDRESS);
|
||||
//
|
||||
|
||||
216
Projects/epwm_test/src/vector.c
Normal file
216
Projects/epwm_test/src/vector.c
Normal 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;*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
38
Projects/epwm_test/src/vector.h
Normal file
38
Projects/epwm_test/src/vector.h
Normal 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_ */
|
||||
Loading…
Reference in New Issue
Block a user