KV46F256 PWM Module Problem

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

KV46F256 PWM Module Problem

2,572 次查看
i_smailtatlınar
Contributor I

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.

0 项奖励
2 回复数

2,147 次查看
D4Worker
Contributor II

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"

0 项奖励

2,325 次查看
xiangjun_rong
NXP TechSupport
NXP TechSupport

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