Part Number: TMS320F28377D
Other Parts Discussed in Thread: SYSCONFIG
Hi Experts ,
I have configured the SDFM module to use sin3 filter with a control loop OCR of 58, which would give me approximately 12 bits(ENOB)
Here is the SDFM setup:
void HAL_setupSDFM(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj*) handle;
//
// Input Control Unit
//
// Configure Input Control Unit: Modulator Clock rate = Modulator data rate
//
SDFM_setupModulatorClock(obj->sdfmHandle, SDFM_FILTER_1, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
SDFM_setupModulatorClock(obj->sdfmHandle, SDFM_FILTER_2, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
SDFM_setupModulatorClock(obj->sdfmHandle, SDFM_FILTER_3, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
//
// Configure comparator filter settings(Not used)
//
SDFM_configComparator(obj->sdfmHandle, (SDFM_FILTER_1 | SDFM_FILTER_SINC_1 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0));
SDFM_configComparator(obj->sdfmHandle, (SDFM_FILTER_2 | SDFM_FILTER_SINC_1 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0));
SDFM_configComparator(obj->sdfmHandle, (SDFM_FILTER_3 | SDFM_FILTER_SINC_1 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0));
//
// Configure data filter settings(Page 1814 of Tech Manual)
//
SDFM_configDataFilter(obj->sdfmHandle, (SDFM_FILTER_1 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(58)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(3)));
SDFM_configDataFilter(obj->sdfmHandle, (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(58)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(3)));
SDFM_configDataFilter(obj->sdfmHandle, (SDFM_FILTER_3 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(58)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(3)));
//
// Configure SDSYNC (Filter reset from PWM)
//
SDFM_disableExternalReset(obj->sdfmHandle, SDFM_FILTER_1);
SDFM_disableExternalReset(obj->sdfmHandle, SDFM_FILTER_2);
SDFM_disableExternalReset(obj->sdfmHandle, SDFM_FILTER_3);
SDFM_enableInterrupt(obj->sdfmHandle, SDFM_FILTER_1, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT);
SDFM_enableInterrupt(obj->sdfmHandle, SDFM_FILTER_2, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT);
SDFM_enableInterrupt(obj->sdfmHandle, SDFM_FILTER_3, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT);
SDFM_disableInterrupt(obj->sdfmHandle, SDFM_FILTER_1,
(SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT |
SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT |
SDFM_MODULATOR_FAILURE_INTERRUPT));
SDFM_disableInterrupt(obj->sdfmHandle, SDFM_FILTER_2,
(SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT |
SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT |
SDFM_MODULATOR_FAILURE_INTERRUPT));
SDFM_disableInterrupt(obj->sdfmHandle, SDFM_FILTER_3,
(SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT |
SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT |
SDFM_MODULATOR_FAILURE_INTERRUPT));
//
// Enable master interrupt so that any of the filter interrupts can trigger
// by SDFM interrupt to CPU
// Note: This is enabled in PWM ISR, so that phase currents are ready once every PWM cycle
//
SDFM_disableMasterFilter(obj->sdfmHandle);
}
I found this useful excel tool:

In the excel it says that filter settling time would be 17.4 microseconds.
Looking at the MCU's technical reference manual, in the AFx event section:

So does that mean that when ever the master interrupt is enabled(SDCTL.MIE = 1), it will take 17.4 microseconds for the AFx event to occur?
Secondly could you confirm that all the four filter channels of the SDFM module work parallelly? Do I need to check the status of all AFx events or can I get away with just polling any one AFx event?


