This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
I am trying to simulate PMSM TI implementation (HVPM_Sensored), on f28035. I have imported the project and then on debugging at first attempt itself, buld level 1 didn't work. I'm including a screenshot of the debug session, ipark1.Sine and cosine are showing 0 at the same time (Are they average values?). I'm a newbie to this area. Please help ASAP.
Thanks
Hi,
Actually i solved the issue.
FYI, i have enabled the EnableFlag to 1. But there is a piece of infinite loop in the code. Which when commented, gives the result.
Thanks for your response.
Hi, now i'm facing a problem with build level 2. I'm using DRV8332CKDR motor driver which needs a reset signal along with pwm signals. I have appropriately changed CAU and CAD, CBU and CBD in pwm initialization. But the mototr is not spinnig at all.
Any help?
We have a direct project support for this driver, but you should be able to tweak the existing code to fit. Check if you get the PWM signals alright after this change, without connecting the motor. Some more digging in should help.
/* ================================================================================== File name: F2803xPWM.H Target : TMS320F2803x family =====================================================================================*/ #ifndef __F2803X_PWM_H__ #define __F2803X_PWM_H__ #include "f2803xbmsk.h" #include "f2803xdrvlib.h" /*---------------------------------------------------------------------------- Initialization constant for the F2803X Time-Base Control Registers for PWM Generation. Sets up the timer to run free upon emulation suspend, count up-down mode prescaler 1. ----------------------------------------------------------------------------*/ #define PWM_INIT_STATE ( FREE_RUN_FLAG + \ PRDLD_IMMEDIATE + \ TIMER_CNT_UPDN + \ HSPCLKDIV_PRESCALE_X_1 + \ CLKDIV_PRESCALE_X_1 + \ PHSDIR_CNT_UP + \ CNTLD_DISABLE ) /*---------------------------------------------------------------------------- Initialization constant for the F2803X Compare Control Register. ----------------------------------------------------------------------------*/ #define CMPCTL_INIT_STATE ( LOADAMODE_ZRO + \ LOADBMODE_ZRO + \ SHDWAMODE_SHADOW + \ SHDWBMODE_SHADOW ) /*---------------------------------------------------------------------------- Initialization constant for the F2803X Action Qualifier Output A, B Registers. ----------------------------------------------------------------------------*/ #define AQCTLA_INIT_STATE ( CAD_SET + CAU_CLEAR ) #define AQCTLB_INIT_STATE ( CBU_SET + CBD_CLEAR ) /*---------------------------------------------------------------------------- Initialization constant for the F2803X Dead-Band Generator registers for PWM Generation. Sets up the dead band for PWM and sets up dead band values. ----------------------------------------------------------------------------*/ #define DBCTL_INIT_STATE (BP_ENABLE + POLSEL_ACTIVE_HI_CMP) #define DBCNT_INIT_STATE 100 // 100 counts = 1.66 usec (delay) * 100 count/usec (for TBCLK = SYSCLK/1) /*---------------------------------------------------------------------------- Initialization constant for the F2803X PWM Chopper Control register for PWM Generation. ----------------------------------------------------------------------------*/ #define PCCTL_INIT_STATE CHPEN_DISABLE /*---------------------------------------------------------------------------- Initialization constant for the F2803X Trip Zone Select Register ----------------------------------------------------------------------------*/ #define TZSEL_INIT_STATE DISABLE_TZSEL /*----------------------------------------------------------------------------- Define the structure of the PWM Driver Object -----------------------------------------------------------------------------*/ typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0) Uint16 HalfPerMax; // Parameter: Half of PeriodMax (Q0) Uint16 Deadband; // Parameter: PWM deadband in CPU clock cycles (Q0) _iq MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q24) _iq MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q24) _iq MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q24) } PWMGEN ; /*------------------------------------------------------------------------------ Default Initializers for the F2803X PWMGEN Object ------------------------------------------------------------------------------*/ #define F2803X_FC_PWM_GEN { 1000, \ 100, \ 0x4000, \ 0x4000, \ 0x4000, \ } #define PWMGEN_DEFAULTS F2803X_FC_PWM_GEN /*------------------------------------------------------------------------------ PWM Init & PWM Update Macro Definitions ------------------------------------------------------------------------------*/ #define PWM_INIT_MACRO(ch1,ch2,ch3,v) \ /* Setup Sync*/ \ (*ePWM[ch1]).TBCTL.bit.SYNCOSEL = 0; /* Pass through*/ \ (*ePWM[ch2]).TBCTL.bit.SYNCOSEL = 0; /* Pass through*/ \ (*ePWM[ch3]).TBCTL.bit.SYNCOSEL = 0; /* Pass through*/ \ \ /* Allow each timer to be sync'ed*/ \ (*ePWM[ch1]).TBCTL.bit.PHSEN = 1; \ (*ePWM[ch2]).TBCTL.bit.PHSEN = 1; \ (*ePWM[ch3]).TBCTL.bit.PHSEN = 1; \ \ /* Init Timer-Base Period Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).TBPRD = v.PeriodMax; \ (*ePWM[ch2]).TBPRD = v.PeriodMax; \ (*ePWM[ch3]).TBPRD = v.PeriodMax; \ \ /* Init Timer-Base Phase Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).TBPHS.half.TBPHS = 0; \ (*ePWM[ch2]).TBPHS.half.TBPHS = 0; \ (*ePWM[ch3]).TBPHS.half.TBPHS = 0; \ \ /* Init Timer-Base Control Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).TBCTL.all = PWM_INIT_STATE; \ (*ePWM[ch2]).TBCTL.all = PWM_INIT_STATE; \ (*ePWM[ch3]).TBCTL.all = PWM_INIT_STATE; \ \ /* Init Compare Control Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).CMPCTL.all = CMPCTL_INIT_STATE; \ (*ePWM[ch2]).CMPCTL.all = CMPCTL_INIT_STATE; \ (*ePWM[ch3]).CMPCTL.all = CMPCTL_INIT_STATE; \ \ /*Init Action Qualifier Output A Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).AQCTLA.all = AQCTLA_INIT_STATE; \ (*ePWM[ch2]).AQCTLA.all = AQCTLA_INIT_STATE; \ (*ePWM[ch3]).AQCTLA.all = AQCTLA_INIT_STATE; \ /*(*ePWM[ch1]).AQCTLB.all = AQCTLB_INIT_STATE; \ (*ePWM[ch2]).AQCTLB.all = AQCTLB_INIT_STATE; \ (*ePWM[ch3]).AQCTLB.all = AQCTLB_INIT_STATE;*/ \ \ /* Complementary and reset generation part*/ \ /*(*ePWM[ch1]).AQCTLA.bit.CAU = CAU_SET; \ (*ePWM[ch1]).AQCTLA.bit.CAD = CAD_CLEAR; \ (*ePWM[ch1]).AQCTLB.bit.CBU = CBU_CLEAR; \ (*ePWM[ch1]).AQCTLB.bit.CBD = CBD_SET; \ \ (*ePWM[ch2]).AQCTLA.bit.CAU = CAU_SET; \ (*ePWM[ch2]).AQCTLA.bit.CAD = CAD_CLEAR; \ (*ePWM[ch2]).AQCTLB.bit.CBU = CBU_CLEAR; \ (*ePWM[ch2]).AQCTLB.bit.CBD = CBD_SET; \ \ (*ePWM[ch3]).AQCTLA.bit.CAU = CAU_SET; \ (*ePWM[ch3]).AQCTLA.bit.CAD = CAD_CLEAR; \ (*ePWM[ch3]).AQCTLB.bit.CBU = CBU_CLEAR; \ (*ePWM[ch3]).AQCTLB.bit.CBD = CBD_SET;*/ \ \ /* Init Dead-Band Generator Control Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).DBCTL.all = DBCTL_INIT_STATE; \ (*ePWM[ch2]).DBCTL.all = DBCTL_INIT_STATE; \ (*ePWM[ch3]).DBCTL.all = DBCTL_INIT_STATE; \ \ /* Init Dead-Band Generator for EPWM1-EPWM3*/ \ (*ePWM[ch1]).DBFED = v.Deadband; \ (*ePWM[ch1]).DBRED = v.Deadband; \ (*ePWM[ch2]).DBFED = v.Deadband; \ (*ePWM[ch2]).DBRED = v.Deadband; \ (*ePWM[ch3]).DBFED = v.Deadband; \ (*ePWM[ch3]).DBRED = v.Deadband; \ \ /* Init PWM Chopper Control Register for EPWM1-EPWM3*/ \ (*ePWM[ch1]).PCCTL.all = PCCTL_INIT_STATE; \ (*ePWM[ch2]).PCCTL.all = PCCTL_INIT_STATE; \ (*ePWM[ch3]).PCCTL.all = PCCTL_INIT_STATE; \ \ EALLOW; /* Enable EALLOW */ \ \ /* Init Trip Zone Select Register*/ \ (*ePWM[ch1]).TZSEL.all = TZSEL_INIT_STATE; \ (*ePWM[ch2]).TZSEL.all = TZSEL_INIT_STATE; \ (*ePWM[ch3]).TZSEL.all = TZSEL_INIT_STATE; \ \ EDIS; /* Disable EALLOW*/ #define PWM_MACRO(ch1,ch2,ch3,m) \ \ /* Mfuncx range is (-1,1) */ \ /* The code below changes PeriodMax*Mfuncx range .... */ \ /* from (-PeriodMax,PeriodMax) to (0,PeriodMax) where HalfPerMax=PeriodMax/2 */ \ \ (*ePWM[ch1]).CMPA.half.CMPA = _IQmpy(m.HalfPerMax,m.MfuncC1)+ m.HalfPerMax; \ (*ePWM[ch2]).CMPA.half.CMPA = _IQmpy(m.HalfPerMax,m.MfuncC2)+ m.HalfPerMax; \ (*ePWM[ch3]).CMPA.half.CMPA = _IQmpy(m.HalfPerMax,m.MfuncC3)+ m.HalfPerMax; \ \ #endif // __F2803X_PWM_H__
Hi,
I am able to find out the code which is causing the problem, and it is PWM macro. I am able to get the time periods from SVGEN macro but getting random output from pwm macro. I'm attaching the changed code. Can i get suggestions on the issues with the code?
I need rest signal for the DRV8332. So i have changed the code a bit, however i commented them.
Thanks.
Oh, a typo in my previous post, we DONT have a direct project to support this driver. I recommend you to dig in some more like you did already.