Заготовка для защиты через компаратор SDFM-модуля.
В CPU1 добавлен кроссбар для заведения сигналов с SDFM-компаратора на Digital Compare Submodule модудя PWM В данной версии выхды sdfm-модулей токов и напряжения моста выведены на один сигнал trip4, а rrip4 выведен сразу на все 4 входных сигнала DCS, что избыточно и будет выведено на один. Также сейчас используются все 4 сигнала выходов DCS, что тоже избыточно. Также надо добавить в сдфм обработку прерывания по компаратору, чтобы выставлять соответствующую ошибку в ПО с возможностью её вывода (на экран и в протоколы обмена). Также надо провести рефакторинг всего написанного, названия ф-ций и пременных сделать однообразными, а также инициализацию удобной, понятной, легко модифицируемой. Также планируется внедрение обработки тензодатчиков через 485 (вместо отладки), для чего ввести дефайн, определяющий что сейчас активно -- отладка или тензодатчики. Также надо выпилить (или временно закомментить) в CPU1 тот код что перешёл в CPU2
This commit is contained in:
parent
b4bbe14b67
commit
76258c03d0
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* sdfm_pwm_xbar.c
|
||||
*
|
||||
* Created on: 29 авг. 2024 г.
|
||||
* Author: seklyuts
|
||||
*/
|
||||
#include "f28x_project.h"
|
||||
#include "pwm_init.h"
|
||||
|
||||
|
||||
void sdfm_pwm_xbarInit(void)
|
||||
{
|
||||
EALLOW;
|
||||
// EPwmXbarRegs.TRIPLOCK = 0x5A5A0000;
|
||||
// EPwmXbarRegs.TRIP4MUX0TO15CFG.bit. = ; //str 2145
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX16 = 1;//SD1FLT1.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX18 = 1;//SD1FLT2.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX20 = 1;//SD1FLT3.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX22 = 1;//SD1FLT4.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX24 = 1;//SD2FLT1.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX26 = 1;//SD2FLT2.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX28 = 1;//SD2FLT3.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUX16TO31CFG.bit.MUX30 = 1;//SD2FLT4.CEVT1_OR_CEVT2
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX16 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX18 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX20 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX22 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX24 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX26 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX28 = 1;
|
||||
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX30 = 1;
|
||||
EDIS;
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
* sdfm_pwm_xbar.h
|
||||
*
|
||||
* Created on: 29 авг. 2024 г.
|
||||
* Author: seklyuts
|
||||
*/
|
||||
|
||||
#ifndef SRC_PERIPHERALS_SDFM_PWM_XBAR_H_
|
||||
#define SRC_PERIPHERALS_SDFM_PWM_XBAR_H_
|
||||
|
||||
void sdfm_pwm_xbarInit(void);
|
||||
|
||||
#endif /* SRC_PERIPHERALS_SDFM_PWM_XBAR_H_ */
|
||||
@ -117,6 +117,7 @@ void InitPerif(void)
|
||||
SpiCGpioInit();
|
||||
BissGpioInit();
|
||||
BissInit();
|
||||
|
||||
sdfm_pwm_xbarInit();
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@ -35,24 +35,24 @@ volatile uint16_t TimerBase = PERIOD_TIMER_BASE;
|
||||
void PWM_ABC_StopAllClose(void)
|
||||
{
|
||||
EALLOW;
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.TZB = 2;
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.TZA = 2;
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.TZB = 2;
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.TZA = 2;
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.TZB = 2;
|
||||
EPwmRegs[PWM_A]->TZFRC.all = 4;
|
||||
EPwmRegs[PWM_B]->TZFRC.all = 4;
|
||||
EPwmRegs[PWM_C]->TZFRC.all = 4;
|
||||
// EPwmRegs[PWM_A]->TZCTL.bit.TZA = 2;
|
||||
// EPwmRegs[PWM_A]->TZCTL.bit.TZB = 2;
|
||||
// EPwmRegs[PWM_B]->TZCTL.bit.TZA = 2;
|
||||
// EPwmRegs[PWM_B]->TZCTL.bit.TZB = 2;
|
||||
// EPwmRegs[PWM_C]->TZCTL.bit.TZA = 2;
|
||||
// EPwmRegs[PWM_C]->TZCTL.bit.TZB = 2;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
void PWM_ABC_StartOut(void)
|
||||
{
|
||||
EALLOW;
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.TZA = 3;
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.TZB = 3;
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.TZA = 3;
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.TZB = 3;
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.TZA = 3;
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.TZB = 3;
|
||||
EPwmRegs[PWM_A]->TZCLR.all = 0x4;//
|
||||
EPwmRegs[PWM_B]->TZCLR.all = 0x4;//
|
||||
EPwmRegs[PWM_C]->TZCLR.all = 0x4;//
|
||||
EDIS;
|
||||
}
|
||||
|
||||
@ -81,13 +81,79 @@ void PWM_ABC_Start(uint16_t Num)
|
||||
EDIS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Нужно сформировать с соответствующих каналов SDFM (трёх каналов, на которых происходит измерение токов)
|
||||
* модулей сигналы CEVT1 и/или CEVT2, выбрав значения CEVT1SEL и CEVT2SEL и настроив границы
|
||||
* SDFLTxCMPH1.bit.HLT и SDFLTxCMPL1.bit.LLT (или SDFLTxCMPH2.bit.HLT и SDFLTxCMPL2.bit.LLT).
|
||||
*
|
||||
* На CPU1 при помощи EPwmXbarRegs (см. стр. 2145 TRM) подключить эти выходы на входы
|
||||
* TRIPn (можно черех MUX завести сразу несколько сигналов SDxFLTy.CEVT1_OR_CEVT2 на один TRIPn,
|
||||
* где n = 4..12, x = 1..2, y = 1..4)
|
||||
*
|
||||
* На блоке PWM подключить TRIPn к блоку "Digital Compare Signals" (стр 2917 TRM)
|
||||
* через регистры DCTRIPSEL соответствующих PWM-модулей (трёх модулей, отвечающих за формирование
|
||||
* напряжения мотора). Если настроено верно, то изменения сигналов можно видеть в DCACTL и/или DCBCTL
|
||||
* в битах EVT1LAT и/или EVT2LAT.
|
||||
*/
|
||||
void PWMTripInit(void)
|
||||
{
|
||||
EALLOW;
|
||||
EPwmRegs[PWM_A]->DCTRIPSEL.all = 0x3333;
|
||||
EPwmRegs[PWM_B]->DCTRIPSEL.all = 0x3333;
|
||||
EPwmRegs[PWM_C]->DCTRIPSEL.all = 0x3333;
|
||||
EPwmRegs[PWM_A]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||
EPwmRegs[PWM_B]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||
EPwmRegs[PWM_C]->DCTRIPSEL.all = 0x3333;//3 - TRIPIN4
|
||||
EPwmRegs[PWM_A]->TZDCSEL.all = 0b010010010010;
|
||||
EPwmRegs[PWM_B]->TZDCSEL.all = 0b010010010010;
|
||||
EPwmRegs[PWM_C]->TZDCSEL.all = 0b010010010010;
|
||||
EPwmRegs[PWM_A]->TZSEL.bit.DCAEVT1 = 1;
|
||||
EPwmRegs[PWM_B]->TZSEL.bit.DCAEVT1 = 1;
|
||||
EPwmRegs[PWM_C]->TZSEL.bit.DCAEVT1 = 1;
|
||||
EPwmRegs[PWM_A]->TZSEL.bit.DCBEVT1 = 1;
|
||||
EPwmRegs[PWM_B]->TZSEL.bit.DCBEVT1 = 1;
|
||||
EPwmRegs[PWM_C]->TZSEL.bit.DCBEVT1 = 1;
|
||||
EPwmRegs[PWM_A]->TZSEL.bit.DCAEVT2 = 0;
|
||||
EPwmRegs[PWM_B]->TZSEL.bit.DCAEVT2 = 0;
|
||||
EPwmRegs[PWM_C]->TZSEL.bit.DCAEVT2 = 0;
|
||||
EPwmRegs[PWM_A]->TZSEL.bit.DCBEVT2 = 0;
|
||||
EPwmRegs[PWM_B]->TZSEL.bit.DCBEVT2 = 0;
|
||||
EPwmRegs[PWM_C]->TZSEL.bit.DCBEVT2 = 0;
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.DCAEVT1 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.DCBEVT1 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.DCAEVT2 = 2; //Force EPWMxA to a low state.
|
||||
EPwmRegs[PWM_A]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_B]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_C]->TZCTL.bit.DCBEVT2 = 2; //Force EPWMxB to a low state.
|
||||
EPwmRegs[PWM_A]->TZOSTCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_B]->TZOSTCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_C]->TZOSTCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_A]->DCACTL.bit.EVT2LATSEL = 1;
|
||||
EPwmRegs[PWM_B]->DCACTL.bit.EVT2LATSEL = 1;
|
||||
EPwmRegs[PWM_C]->DCACTL.bit.EVT2LATSEL = 1;
|
||||
EPwmRegs[PWM_A]->DCACTL.bit.EVT1LATSEL = 1;
|
||||
EPwmRegs[PWM_B]->DCACTL.bit.EVT1LATSEL = 1;
|
||||
EPwmRegs[PWM_C]->DCACTL.bit.EVT1LATSEL = 1;
|
||||
|
||||
// EPwmRegs[PWM_A]->TZFRC.bit.DCAEVT1 = 1;
|
||||
// EPwmRegs[PWM_B]->TZFRC.bit.DCAEVT1 = 1;
|
||||
// EPwmRegs[PWM_C]->TZFRC.bit.DCAEVT1 = 1;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
|
||||
void PWM_clrTripEvnt(void)
|
||||
{
|
||||
EALLOW;
|
||||
EPwmRegs[PWM_A]->TZCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_B]->TZCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_C]->TZCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_A]->TZOSTCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_B]->TZOSTCLR.all = 0xFFFF;//
|
||||
EPwmRegs[PWM_C]->TZOSTCLR.all = 0xFFFF;//
|
||||
EDIS;
|
||||
}
|
||||
|
||||
|
||||
@ -88,11 +88,23 @@ volatile int16 * SdfmReadData[8] = {
|
||||
(volatile int16 *)((Uint16)0x5EC7),
|
||||
};
|
||||
|
||||
volatile int16 * SdfmReadFiltr[8] = {
|
||||
(volatile int16 *)((Uint16)0x5E1A),
|
||||
(volatile int16 *)((Uint16)0x5E2A),
|
||||
(volatile int16 *)((Uint16)0x5E3A),
|
||||
(volatile int16 *)((Uint16)0x5E4A),
|
||||
(volatile int16 *)((Uint16)0x5E9A),
|
||||
(volatile int16 *)((Uint16)0x5EAA),
|
||||
(volatile int16 *)((Uint16)0x5EBA),
|
||||
(volatile int16 *)((Uint16)0x5ECA),
|
||||
};
|
||||
|
||||
#define WAIT_STABILITY_SDFM 6
|
||||
|
||||
int16_t sdfmAdc[8] = {0,0,0,0,0,0,0,0};
|
||||
int16_t sdfmFiltr[8]= {0,0,0,0,0,0,0,0};
|
||||
int16_t sdfmAdcErr[8] = {0,0,0,0,0,0,0,0};
|
||||
int16_t sdfmOffset[8] = {0,0,0,0,0,-10,0,0};
|
||||
int16_t sdfmOffset[8] = {0,0,-50,0,0,0,0,0};
|
||||
uint16_t startInitCurrent = 0;
|
||||
uint16_t initDone[8] = {WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM,WAIT_STABILITY_SDFM};
|
||||
uint16_t AllInitDone =0;
|
||||
@ -312,9 +324,16 @@ void SdfmInit(void)
|
||||
Sdfm2Regs.SDDFPARM4.bit.FEN = 1;
|
||||
EDIS;
|
||||
|
||||
sdfmInitPwmFlt(SDFM_IA, Max, Min);
|
||||
sdfmInitPwmFlt(SDFM_IB, Max, Min);
|
||||
sdfmInitPwmFlt(SDFM_IC, Max, Min);
|
||||
Max = (BIT_MAX>>1)+IMAX_A_KZ*DIV_FACTOR_CURRENT_MOTOR/2/20;
|
||||
Min = (BIT_MAX>>1)-IMAX_A_KZ*DIV_FACTOR_CURRENT_MOTOR/2/20;
|
||||
|
||||
|
||||
|
||||
sdfmInitPwmFlt(SDFM_IA, Min, Max);
|
||||
sdfmInitPwmFlt(SDFM_IB, Min, Max);
|
||||
sdfmInitPwmFlt(SDFM_IC, Min, Max);
|
||||
|
||||
sdfmInitPwmFlt(SDFM_U_DC, 0, 0x4200);
|
||||
}
|
||||
|
||||
#define CEVT_interrupt_enable 0;
|
||||
@ -335,6 +354,7 @@ void sdfmInitPwmFlt(uint16_t N, uint16_t LowFLT, uint16_t HightFlt)
|
||||
Sdfm1Regs.SDCPARM1.bit.EN_CEVT2 = CEVT_interrupt_enable;
|
||||
Sdfm1Regs.SDFLT1CMPH1.bit.HLT = HightFlt;
|
||||
Sdfm1Regs.SDFLT1CMPL1.bit.LLT = LowFLT;
|
||||
//Sdfm1Regs.SDIFLG.bit.FLT1_FLG_CEVT1;-flag
|
||||
break;
|
||||
case 1:
|
||||
Sdfm1Regs.SDCPARM2.bit.CEVT1SEL = 1;
|
||||
@ -432,6 +452,7 @@ void sdfmGetResult(uint16_t N)
|
||||
|
||||
FilterResult[N][loopCounter[N]] = *SdfmReadData[N];
|
||||
sdfmAdc[N] = FilterResult[N][loopCounter[N]] - sdfmOffset[N];
|
||||
sdfmFiltr[N] = *SdfmReadFiltr[N];
|
||||
if((N != SDFM_U_DC)&(N != SDFM_BRAKE)) {
|
||||
if(loopCounter[N] < MAX_SAMPLES) loopCounter[N]++;
|
||||
else
|
||||
@ -492,6 +513,15 @@ void sdfm_check_brake_measurements_was_done(void)
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t sdfmOverCurrentCounter = 0;
|
||||
|
||||
void sdfmOverCurrent(void)
|
||||
{
|
||||
// PWM_ABC_StopAllClose();
|
||||
// vectorFault();
|
||||
sdfmOverCurrentCounter++;
|
||||
}
|
||||
|
||||
|
||||
__interrupt void Sdfm1_ISR(void)
|
||||
{
|
||||
@ -503,6 +533,7 @@ uint32_t IntFlags;
|
||||
|
||||
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x1000 << i)) sdfmGetResult(i);
|
||||
for(i = 0; i < 4; i++) if((uint16_t)IntFlags & (0x100 << i)) sdfmErr(i);
|
||||
if( (((uint16_t)IntFlags)&0xFF) != 0 ) sdfmOverCurrent();
|
||||
|
||||
Sdfm_clearFlagRegister(SDFM1,IntFlags);
|
||||
sdfm_check_all_current_measurements_was_done();
|
||||
|
||||
@ -9,7 +9,8 @@
|
||||
#include "frm_uart.h"
|
||||
|
||||
#define LSPCLK_HZ 50000000.0
|
||||
#define BAUD 57600.0
|
||||
//#define BAUD 57600.0
|
||||
#define BAUD 4000000.0
|
||||
#define BRR LSPCLK_HZ/(BAUD*8) + 1
|
||||
|
||||
uint16_t frmEn = 0;
|
||||
|
||||
@ -393,10 +393,10 @@ void vector_klark_park(uint16_t SectorOn, int16_t CurrentA, int16_t CurrentB, in
|
||||
( CurrLoop.piIq.Ref = -CurrLoop.CurrentLimit);
|
||||
}
|
||||
|
||||
CurrLoop.piIq.Fbk = vectorIdq.q;
|
||||
CurrLoop.piIq.Fbk = vectorIdq.q;// действующий ток
|
||||
|
||||
// CurrLoop.piId.Ref = 0;
|
||||
CurrLoop.piId.Fbk = vectorIdq.d;
|
||||
CurrLoop.piId.Fbk = vectorIdq.d;//
|
||||
|
||||
// CurrLoop.piId.Umax = CurrLoop.piIq.Umax = Inputs->Udc;
|
||||
// CurrLoop.piId.Umin = CurrLoop.piIq.Umin = -CurrLoop.piIq.Umax;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user