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.

How do I turn on etPWM synchronisation?



I cant seem to be able to synchronize the etPWM modules 1, 2 and 3.

My current code is as follows:

	etpwmActionQualConfig_t pwm_hi_config, pwm_lo_config;
	etpwmDeadBandConfig_t pwm_deadband_config;
//	etpwmChoppingConfig_t pwm_chop_config;

	memset(&pwm_hi_config, 0, sizeof(etpwmActionQualConfig_t));
	memset(&pwm_lo_config, 0, sizeof(etpwmActionQualConfig_t));
	memset(&pwm_deadband_config, 0, sizeof(etpwmDeadBandConfig_t));

	etpwmStopTBCLK();
	etpwmInit();

	etpwmSetClkDiv(etpwmREG1, ClkDiv_by_1, HspClkDiv_by_1);
	etpwmSetTimebasePeriod(etpwmREG1, drive_pwm_period);
	etpwmSetClkDiv(etpwmREG2, ClkDiv_by_1, HspClkDiv_by_1);
	etpwmSetTimebasePeriod(etpwmREG2, drive_pwm_period);
	etpwmSetClkDiv(etpwmREG3, ClkDiv_by_1, HspClkDiv_by_1);
	etpwmSetTimebasePeriod(etpwmREG3, drive_pwm_period);

	etpwmSetCount(etpwmREG1, 0);
	etpwmSetCounterMode(etpwmREG1, CounterMode_UpDown);
	etpwmSetCount(etpwmREG2, 0);
	etpwmSetCounterMode(etpwmREG2, CounterMode_UpDown);
	etpwmSetCount(etpwmREG3, 0);
	etpwmSetCounterMode(etpwmREG3, CounterMode_UpDown);

	etpwmSetSyncOut(etpwmREG1, SyncOut_CtrEqZero);
	etpwmSetSyncOut(etpwmREG2, SyncOut_EPWMxSYNCI);
	etpwmSetSyncOut(etpwmREG3, SyncOut_EPWMxSYNCI);
	etpwmDisableCounterLoadOnSync(etpwmREG1);
	etpwmEnableCounterLoadOnSync(etpwmREG2, 0, COUNT_UP);
	etpwmEnableCounterLoadOnSync(etpwmREG3, 0, COUNT_UP);
	etpwmEnableTimebasePeriodShadowMode(etpwmREG1);
	etpwmEnableTimebasePeriodShadowMode(etpwmREG2);
	etpwmEnableTimebasePeriodShadowMode(etpwmREG3);

	pwm_hi_config.CtrEqCmpAUp_Action = ActionQual_Toggle;
//	pwm_hi_config.CtrEqCmpBUp_Action = ActionQual_Clear;
	pwm_lo_config.CtrEqCmpAUp_Action = ActionQual_Toggle;
//	pwm_lo_config.CtrEqCmpBUp_Action = ActionQual_Set;

	etpwmSetActionQualPwmA(etpwmREG1, pwm_hi_config);
	etpwmSetActionQualPwmB(etpwmREG1, pwm_hi_config);
	etpwmSetActionQualPwmA(etpwmREG2, pwm_hi_config);
	etpwmSetActionQualPwmB(etpwmREG2, pwm_hi_config);
	etpwmSetActionQualPwmA(etpwmREG3, pwm_hi_config);
	etpwmSetActionQualPwmB(etpwmREG3, pwm_hi_config);

	etpwmSetCmpA(etpwmREG1, sine_qtz_lut_u[0]);
	etpwmSetCmpA(etpwmREG2, sine_qtz_lut_v[0]);
	etpwmSetCmpA(etpwmREG3, sine_qtz_lut_w[0]);

	pwm_deadband_config.halfCycleEnable = false;
	pwm_deadband_config.inputmode = PWMA_RED_PWMB_FED;
	pwm_deadband_config.outputmode = PWMB_FED_PWMA_RED;
	pwm_deadband_config.polarity = Invert_PWMB;
	etpwmSetDeadBandDelay(etpwmREG1, 1000, 1000);
	etpwmEnableDeadBand(etpwmREG1, pwm_deadband_config);
	etpwmSetDeadBandDelay(etpwmREG2, 10, 10);
	etpwmEnableDeadBand(etpwmREG2, pwm_deadband_config);
	etpwmSetDeadBandDelay(etpwmREG3, 10, 10);
	etpwmEnableDeadBand(etpwmREG3, pwm_deadband_config);

	//	etpwmTriggerSWSync(etpwmREG1);
//	etpwmTriggerSWSync(etpwmREG2);
//	etpwmTriggerSWSync(etpwmREG3);

	etpwmStartTBCLK();
	etpwmTriggerSWSync(etpwmREG1);

  • Safiullah,


    I've forwarded your question to our ePWM expert. He will be back to you shortly.

  • Safiullah,

    You have configured ePWM1 to generate the ePWM1SYNCO when the counter becomes zero. Instead, you should choose to generate the ePWM1SYNCO whenever the ePWM1 module sees the ePWMSYNCI. In your case you generate the SYNCI input to ePWM1 by software.

    So you only need to change line 26 to be etpwmSetSyncOut(etpwmREG1, SyncOut_EPWMxSYNCI);
  • No luck. I ve tried a few possible combinations too but nothing seems to have any effect.
  • 	etpwmActionQualConfig_t pwm_hi_config, pwm_lo_config;
    	etpwmDeadBandConfig_t pwm_deadband_config;
    //	etpwmChoppingConfig_t pwm_chop_config;
    
    	memset(&pwm_hi_config, 0, sizeof(etpwmActionQualConfig_t));
    	memset(&pwm_lo_config, 0, sizeof(etpwmActionQualConfig_t));
    	memset(&pwm_deadband_config, 0, sizeof(etpwmDeadBandConfig_t));
    
    	etpwmStopTBCLK();
    	etpwmDisableInterrupt(etpwmREG1);
    	etpwmDisableInterrupt(etpwmREG2);
    	etpwmDisableInterrupt(etpwmREG3);
    	etpwmInit();
    
    	etpwmSetClkDiv(etpwmREG1, ClkDiv_by_1, HspClkDiv_by_1);
    	etpwmSetTimebasePeriod(etpwmREG1, drive_pwm_period);
    	etpwmSetClkDiv(etpwmREG2, ClkDiv_by_1, HspClkDiv_by_1);
    	etpwmSetTimebasePeriod(etpwmREG2, drive_pwm_period);
    	etpwmSetClkDiv(etpwmREG3, ClkDiv_by_1, HspClkDiv_by_1);
    	etpwmSetTimebasePeriod(etpwmREG3, drive_pwm_period);
    
    	etpwmSetCount(etpwmREG1, 0);
    	etpwmSetCounterMode(etpwmREG1, CounterMode_UpDown);
    	etpwmSetCount(etpwmREG2, 0);
    	etpwmSetCounterMode(etpwmREG2, CounterMode_UpDown);
    	etpwmSetCount(etpwmREG3, 0);
    	etpwmSetCounterMode(etpwmREG3, CounterMode_UpDown);
    
    	etpwmSetSyncOut(etpwmREG1, SyncOut_CtrEqZero);
    	etpwmSetSyncOut(etpwmREG2, SyncOut_EPWMxSYNCI);//SyncOut_CtrEqZero);
    	etpwmSetSyncOut(etpwmREG3, SyncOut_EPWMxSYNCI);//SyncOut_CtrEqZero);
    	etpwmDisableCounterLoadOnSync(etpwmREG1);
    	etpwmEnableCounterLoadOnSync(etpwmREG2, 0, 0);
    	etpwmEnableCounterLoadOnSync(etpwmREG3, 0, 0);
    	etpwmEnableTimebasePeriodShadowMode(etpwmREG1);
    	etpwmEnableTimebasePeriodShadowMode(etpwmREG2);
    	etpwmEnableTimebasePeriodShadowMode(etpwmREG3);
    	etpwmEnableCmpAShadowMode(etpwmREG1, LoadMode_CtrEqZero);
    	etpwmEnableCmpAShadowMode(etpwmREG2, LoadMode_CtrEqZero);
    	etpwmEnableCmpAShadowMode(etpwmREG3, LoadMode_CtrEqZero);
    	etpwmEnableCmpBShadowMode(etpwmREG1, LoadMode_CtrEqZero);
    	etpwmEnableCmpBShadowMode(etpwmREG2, LoadMode_CtrEqZero);
    	etpwmEnableCmpBShadowMode(etpwmREG3, LoadMode_CtrEqZero);
    
    	pwm_hi_config.CtrEqCmpAUp_Action = ActionQual_Toggle;
    //	pwm_hi_config.CtrEqCmpBUp_Action = ActionQual_Clear;
    	pwm_lo_config.CtrEqCmpAUp_Action = ActionQual_Toggle;
    //	pwm_lo_config.CtrEqCmpBUp_Action = ActionQual_Set;
    
    	etpwmSetActionQualPwmA(etpwmREG1, pwm_hi_config);
    	etpwmSetActionQualPwmB(etpwmREG1, pwm_hi_config);
    	etpwmSetActionQualPwmA(etpwmREG2, pwm_hi_config);
    	etpwmSetActionQualPwmB(etpwmREG2, pwm_hi_config);
    	etpwmSetActionQualPwmA(etpwmREG3, pwm_hi_config);
    	etpwmSetActionQualPwmB(etpwmREG3, pwm_hi_config);
    
    	etpwmSetCmpA(etpwmREG1, sine_qtz_lut_u[0]);
    	etpwmSetCmpA(etpwmREG2, sine_qtz_lut_v[0]);
    	etpwmSetCmpA(etpwmREG3, sine_qtz_lut_w[0]);
    
    	pwm_deadband_config.halfCycleEnable = false;
    	pwm_deadband_config.inputmode = PWMA_RED_PWMB_FED;
    	pwm_deadband_config.outputmode = PWMB_FED_PWMA_RED;
    	pwm_deadband_config.polarity = Invert_PWMB;
    	etpwmSetDeadBandDelay(etpwmREG1, 1000, 1000);
    	etpwmEnableDeadBand(etpwmREG1, pwm_deadband_config);
    	etpwmSetDeadBandDelay(etpwmREG2, 1000, 1000);
    	etpwmEnableDeadBand(etpwmREG2, pwm_deadband_config);
    	etpwmSetDeadBandDelay(etpwmREG3, 1000, 1000);
    	etpwmEnableDeadBand(etpwmREG3, pwm_deadband_config);
    
    	etpwmStartTBCLK();
    
    	etpwmSetCount(etpwmREG1, 0);
    	etpwmSetCount(etpwmREG2, 0);
    	etpwmSetCount(etpwmREG3, 0);
    	etpwmSetTimebasePeriod(etpwmREG1, drive_pwm_period);
    	etpwmSetTimebasePeriod(etpwmREG2, drive_pwm_period);
    	etpwmSetTimebasePeriod(etpwmREG3, drive_pwm_period);
    

    current code is as above.

    The waveform I see is

  • The delays you have for the deadbands are too high. I changed the 1000 counts to 10, and am getting the correct signals. I am attaching a scopeshot as well as the sys_main.c that I am using.

    6232.sys_main.c

    Hope this helps.

  • Good catch Sunil, I 'd been up all night trying to fix this, but nothing worked.

    So it brings me to this question:

    Deadband should ideally affect the A and B channels of a single etPWM module. Our that is the function I understood. Why does it affect the signals between modules when synchronized? I dont think its is in the errata.

    In any case. I need to generate a sinusoidal PWM using the etPWM modules. I need some dead band between the transition for the HI and LOW side signals for the MOSFETs. How do I do that?