Hi C2000 gurus,
I am using a Piccolo 28069 to control 3 phase servo motors in an industrial inverter application. I would like to modify my setup for center aligned pwm pulses and sample phase adc's at the center of a PWM pulse to get more accurate readings. Essentially I want to run center aligned PWM's and trigger adc sampling. I need help/hints determining which PWM registers to configure on the PWM's for the following.
1. Which registers do I look at to ensure the PWM's are configured center aligned? I'm currently using a example macro
#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; \
\
/* 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; \
2. Which registers do I look at to ensure the PWM Trigger the ADC SOC at the center? I think I should be still looking at PWM registers.
For example, my current setup uses the following for setting my ADC SOC source.
EPwm4Regs.ETSEL.bit.SOCAEN = 1; /* Enable SOCA */
EPwm4Regs.ETSEL.bit.SOCASEL = 2; /* Enable period event for SOCA */
EPwm4Regs.ETPS.bit.SOCAPRD = 1; /* Generate SOCA on the 1st event */
EPwm4Regs.ETCLR.bit.SOCA = 1; /* Clear SOCA flag */
Any help or suggestions is appreciated.