Hi all;
I'm using KV46F256VLL16 for motor control application. But i have very bad problem with PWM module.
Before testing my application, i create basic sinusoidal pwm with Pulse Width Modulator A (PWMA/eFlexPWM). But when duty cycle near 50%, duty pulse getting worse. I put some pictures below from oscilloscope screen. Corruption isn't same everytime.
My board is TWR-KV46F150M and i'm using portD pins for PWM module.
My pwm module settings is below also. I'm using MQX 5.0.2 HAL and Driver libraries.
uint16_t deadTimeVal;
PWM_Type *pwmBase = g_pwmBase[instance];
pwm_module_setup_t moduleParams;
moduleParams.clkSrc = kClkSrcPwmIPBusClk; /* Use IP Bus clock as source */
moduleParams.prescale = kPwmDividedBy2;
moduleParams.cntrInitSel = kInitSrcMasterSync;
moduleParams.reloadLogic = kFlexPwmReloadPwmFullCycle;
moduleParams.reloadFreq = kPwmLoadEvery1Oportunity;
moduleParams.chnlPairOper = kFlexPwmIndependent; //kFlexPwmComplementaryPwmA;
moduleParams.forceTrig = kForceOutputLocalForce;
signalParams.pwmPeriod = 1000;
signalParams.pwmType = kFlexPwmEdgeAligned;
signalParams.pwmAPulseWidth = 1;
signalParams.pwmBPulseWidth = 999;
signalParams.pwmAPolarity = false;
signalParams.pwmBPolarity = false;
/*********** PWMA_SM0 - phase A, configuration ************/
PWM_DRV_SetupPwm(instance, kFlexPwmModule0, &moduleParams, &signalParams);
/* Set deadtime count, we set this to about 650ns */
deadTimeVal = ((uint64_t)CLOCK_SYS_GetPwmFreq(0) * 20000) / 1000000000;
PWM_WR_DTCNT0(pwmBase, kFlexPwmModule0, deadTimeVal);
PWM_WR_DTCNT1(pwmBase, kFlexPwmModule0, deadTimeVal);
And my while rutine has this code :
signalParams.pwmAPulseWidth = duty_arr[pwmVal];
PWM_DRV_UpdatePwmSignal(0, kFlexPwmModule0, &signalParams);
//const unsigned int duty_arr[90] = { ...} there is duty values between 0 to 1000 for sinus signal. values taken from Matlab.
any rounding off problems with your statement?
is the deadtime calculated below as sometime you want?
"deadTimeVal = ((uint64_t)CLOCK_SYS_GetPwmFreq(0) * 20000) per 1000000000"
Hi, Ismail,
The figure you gave is strange, the PWM signals disorder, I suppose that the synchronization has issue. Pls change the setting:
moduleParams.clkSrc = kClkSrcPwmIPBusClk; /* Use IP Bus clock as source */
moduleParams.prescale = kPwmDividedBy2;
moduleParams.cntrInitSel = kInitSrcMasterSync;
moduleParams.reloadLogic = kFlexPwmReloadPwmFullCycle;
moduleParams.reloadFreq = kPwmLoadEvery1Oportunity;
moduleParams.chnlPairOper = kFlexPwmIndependent; //kFlexPwmComplementaryPwmA;
moduleParams.forceTrig = kForceOutputLocalForce;
TO
moduleParams.clkSrc = kClkSrcPwmIPBusClk; /* Use IP Bus clock as source */
moduleParams.prescale = kPwmDividedBy2;
moduleParams.cntrInitSel = kInitSrcLocalSync;
moduleParams.reloadLogic = kFlexPwmReloadPwmFullCycle;
moduleParams.reloadFreq = kPwmLoadEvery1Oportunity;
moduleParams.chnlPairOper = kFlexPwmIndependent; //kFlexPwmComplementaryPwmA;
moduleParams.forceTrig = kForceOutputLocalForce;
Because you use SM0, you have to select the kInitSrcLocalSync. if you select the other module except for SM0 for example SM1, SM2, SM3, you are right to select kInitSrcMasterSync for moduleParams.cntrInitSel .
For detailed inf, pls refer to INIT_SEL bits in PWMA_SMnCTRL2 register in RM of KV4x.
Hope it can help you
BR
Xiangjun Rong