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.

CCS/AMC1306E25: CCS/AMC1306E25

Part Number: AMC1306E25
Other Parts Discussed in Thread: C2000WARE

Tool/software: Code Composer Studio

Hi friends

I am using AMC1306E25 module to read the 4 voltages with a switching frequency of ~ 250kHz in drive application. As this is manchester coded can I use this code in F280049C mcu?
Would you mind advising me on using correct code adjustments?
thanks and kind regards
Tohid

/* SDFM Sensing Parameters*/

#define SDCLK_FREQ (float)(20*1000000)
#define SD_CLK_COUNT ECAPSYSCLOCK_FREQ/SDCLK_FREQ
#define PWM_CLK_IN_SDFM_OSR (int)(((float)PWMSYSCLOCK_FREQ/(float)SDCLK_FREQ)*(float)SDFM_OSR)
#define SDFM_FILTER_TYPE 2
#define SDFM_OSR 128

//TODO setupSDFM()
void setupSDFM(uint16_t HLT, uint16_t LLT, uint16_t PWM_ticks,
uint16_t PWM_ticks_in_sdfm_osr, uint16_t SD_clk_ecap_sys_ticks,
uint16_t sdfmosr)
{
// setup CAP to generate CLK for SDFM
configureECAPforSDFMClk(SD_clk_ecap_sys_ticks);

// setup PWM 11 for syncing up the SD filter windows with motor control PWMs
// configurePWMsyncforSDFM(PWM_ticks,PWM_ticks_in_sdfm_osr);

// Setup GPIO for SD
//SD Filter 1 - Data 1
GPIO_setPadConfig(GPIO_IF_SDFM_DATA, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_IF_SDFM_DATA,GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_IF_SDFM_DATA, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_IF_SDFM_DATA_PIN_CONFIG);

//SD Filter 1 - Clock 1
GPIO_setPadConfig(GPIO_IF_SDFM_CLOCK, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_IF_SDFM_CLOCK,GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_IF_SDFM_CLOCK, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_IF_SDFM_CLOCK_PIN_CONFIG);

//SD Filter 2 - Data 2
GPIO_setPadConfig(GPIO_IO_SDFM_DATA, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_IO_SDFM_DATA,GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_IO_SDFM_DATA, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_IO_SDFM_DATA_PIN_CONFIG);

//SD Filter 2 - Clock 2
GPIO_setPadConfig(GPIO_IO_SDFM_CLOCK, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_IO_SDFM_CLOCK, GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_IO_SDFM_CLOCK, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_IO_SDFM_CLOCK_PIN_CONFIG);

//SD Filter 3 - Data 3
GPIO_setPadConfig(GPIO_VO_SDFM_DATA, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_VO_SDFM_DATA,GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_VO_SDFM_DATA, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_VO_SDFM_DATA_PIN_CONFIG);

//SD Filter 3 - Clock 3
GPIO_setPadConfig(GPIO_VO_SDFM_CLOCK, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_VO_SDFM_CLOCK, GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_VO_SDFM_CLOCK, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_VO_SDFM_CLOCK_PIN_CONFIG);

//SD Filter 4 - Data 4 (bus voltage)
GPIO_setPadConfig(GPIO_VBUS_SDFM_DATA, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_VBUS_SDFM_DATA,GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_VBUS_SDFM_DATA, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_VBUS_SDFM_DATA_PIN_CONFIG);

//SD Filter 4 - Clock 4
GPIO_setPadConfig(GPIO_VBUS_SDFM_CLOCK, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(GPIO_VBUS_SDFM_CLOCK, GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(GPIO_VBUS_SDFM_CLOCK, GPIO_DIR_MODE_IN);
GPIO_setPinConfig(GPIO_VBUS_SDFM_CLOCK_PIN_CONFIG);

/*******************************************************/
/* Input Control Module */
/*******************************************************/
//Configure Input Control Mode: Modulator Clock rate = Modulator data rate
SDFM_setupModulatorClock(IF_SDFM_BASE, IF_SDFM_FILTER,
SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
SDFM_setupModulatorClock(IO_SDFM_BASE, IO_SDFM_FILTER,
SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
SDFM_setupModulatorClock(VO_SDFM_BASE, VO_SDFM_FILTER,
SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
SDFM_setupModulatorClock(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,
SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);

SDFM_enableFilter(IF_SDFM_BASE, IF_SDFM_FILTER);
SDFM_enableFilter(IO_SDFM_BASE, IO_SDFM_FILTER);
SDFM_enableFilter(VO_SDFM_BASE, VO_SDFM_FILTER);
SDFM_enableFilter(VBUS_SDFM_BASE, VBUS_SDFM_FILTER);

/*******************************************************/
/* Sinc filter Module */
/*******************************************************/
//Configure Data filter modules filter type, OSR value and enable / disable data filter
// 16 bit data representation is chosen for OSR 128 using Sinc3, from the table in the TRM
// the max value represented for OSR 128 using sinc 3 is +/-2097152 i.e. 2^21
// the max value represented for OSR 64 using sinc 3 is +/-262144 i.e. 2^18
// to represent this in 16 bit format where the first bit is sign shift by 6 bits
SDFM_setFilterType(IF_SDFM_BASE, IF_SDFM_FILTER, SDFM_FILTER_SINC_3);
SDFM_setFilterType(IO_SDFM_BASE, IO_SDFM_FILTER, SDFM_FILTER_SINC_3);
SDFM_setFilterType(VO_SDFM_BASE, VO_SDFM_FILTER, SDFM_FILTER_SINC_3);
SDFM_setFilterType(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, SDFM_FILTER_SINC_3);

SDFM_setOutputDataFormat(IF_SDFM_BASE, IF_SDFM_FILTER, SDFM_DATA_FORMAT_32_BIT);
SDFM_setOutputDataFormat(IO_SDFM_BASE, IO_SDFM_FILTER, SDFM_DATA_FORMAT_32_BIT);
SDFM_setOutputDataFormat(VO_SDFM_BASE, VO_SDFM_FILTER, SDFM_DATA_FORMAT_32_BIT);
SDFM_setOutputDataFormat(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, SDFM_DATA_FORMAT_32_BIT);

SDFM_setFilterOverSamplingRatio(IF_SDFM_BASE, IF_SDFM_FILTER, sdfmosr-1);
SDFM_setFilterOverSamplingRatio(IO_SDFM_BASE, IO_SDFM_FILTER, sdfmosr-1);
SDFM_setFilterOverSamplingRatio(VO_SDFM_BASE, VO_SDFM_FILTER, sdfmosr-1);
SDFM_setFilterOverSamplingRatio(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, sdfmosr-1);

/*******************************************************/
/* Comparator Module */
/*******************************************************/
//Comparator HLT and LLT
//Configure Comparator module's comparator filter type and comparator's OSR value, higher threshold, lower threshold

SDFM_setComparatorFilterType(IF_SDFM_BASE, IF_SDFM_FILTER,SDFM_FILTER_SINC_3);
SDFM_setCompFilterOverSamplingRatio(IF_SDFM_BASE, IF_SDFM_FILTER,31);
SDFM_setCompFilterHighThreshold(IF_SDFM_BASE, IF_SDFM_FILTER,HLT);
SDFM_setCompFilterLowThreshold(IF_SDFM_BASE, IF_SDFM_FILTER,LLT);

SDFM_setComparatorFilterType(IO_SDFM_BASE, IO_SDFM_FILTER,SDFM_FILTER_SINC_3);
SDFM_setCompFilterOverSamplingRatio(IO_SDFM_BASE, IO_SDFM_FILTER,31);
SDFM_setCompFilterHighThreshold(IO_SDFM_BASE, IO_SDFM_FILTER,HLT);
SDFM_setCompFilterLowThreshold(IO_SDFM_BASE, IO_SDFM_FILTER,LLT);

SDFM_setComparatorFilterType(VO_SDFM_BASE, VO_SDFM_FILTER,SDFM_FILTER_SINC_3);
SDFM_setCompFilterOverSamplingRatio(VO_SDFM_BASE, VO_SDFM_FILTER,31);
SDFM_setCompFilterHighThreshold(VO_SDFM_BASE, VO_SDFM_FILTER,HLT);
SDFM_setCompFilterLowThreshold(VO_SDFM_BASE, VO_SDFM_FILTER,LLT);

SDFM_setComparatorFilterType(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,SDFM_FILTER_SINC_3);
SDFM_setCompFilterOverSamplingRatio(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,31);
SDFM_setCompFilterHighThreshold(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,HLT);
SDFM_setCompFilterLowThreshold(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,LLT);

//Set PWM sync source
SDFM_setPWMSyncSource(IF_SDFM_BASE, IF_SDFM_FILTER, SDFM_SYNC_PWM1_SOCB);
SDFM_setPWMSyncSource(IO_SDFM_BASE, IO_SDFM_FILTER, SDFM_SYNC_PWM1_SOCB);
SDFM_setPWMSyncSource(VO_SDFM_BASE, VO_SDFM_FILTER, SDFM_SYNC_PWM1_SOCB);
SDFM_setPWMSyncSource(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, SDFM_SYNC_PWM1_SOCB);

SDFM_setWaitForSyncClearMode(IF_SDFM_BASE, IF_SDFM_FILTER, SDFM_AUTO_CLEAR_WAIT_FOR_SYNC);
SDFM_setWaitForSyncClearMode(IO_SDFM_BASE, IO_SDFM_FILTER, SDFM_AUTO_CLEAR_WAIT_FOR_SYNC);
SDFM_setWaitForSyncClearMode(VO_SDFM_BASE, VO_SDFM_FILTER, SDFM_AUTO_CLEAR_WAIT_FOR_SYNC);
SDFM_setWaitForSyncClearMode(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, SDFM_AUTO_CLEAR_WAIT_FOR_SYNC);

SDFM_enableWaitForSync(IF_SDFM_BASE, IF_SDFM_FILTER);
SDFM_enableWaitForSync(IO_SDFM_BASE, IO_SDFM_FILTER);
SDFM_enableWaitForSync(VO_SDFM_BASE, VO_SDFM_FILTER);
SDFM_enableWaitForSync(VBUS_SDFM_BASE, VBUS_SDFM_FILTER);

/* Select SOC from counter at ctr =PRD*/
EPWM_setADCTriggerSource(INV_PWM1_BASE,EPWM_SOC_B,EPWM_SOC_TBCTR_U_CMPC);
// set CMPB to issue the pulse for PWM sync appropriately
EPWM_setCounterCompareValue(INV_PWM1_BASE,EPWM_COUNTER_COMPARE_B,
(EPWM_getTimeBasePeriod(INV_PWM1_BASE) - PWM_ticks_in_sdfm_osr*1.5));
// set CMPB to issue the pulse for PWM sync appropriately
EPWM_setCounterCompareValue(INV_PWM1_BASE,EPWM_COUNTER_COMPARE_C,
(EPWM_getTimeBasePeriod(INV_PWM1_BASE) - PWM_ticks_in_sdfm_osr*1.5));
/* Generate pulse on 1st even*/
EPWM_setADCTriggerEventPrescale(INV_PWM1_BASE,EPWM_SOC_B,1);
/* Enable SOC on A group*/
EPWM_enableADCTrigger(INV_PWM1_BASE,EPWM_SOC_B);

/*******************************************************/
/* EXTERNAL RESET */
/*******************************************************/
//PWM11.CMPC, PWM11.CMPD, PWM12.CMPC and PWM12.CMPD signals cannot synchronize the filters. This option is not being used in this example.
SDFM_enableExternalReset(IF_SDFM_BASE, IF_SDFM_FILTER);
SDFM_enableExternalReset(IO_SDFM_BASE, IO_SDFM_FILTER);
SDFM_enableExternalReset(VO_SDFM_BASE, VO_SDFM_FILTER);
SDFM_enableExternalReset(VBUS_SDFM_BASE, VBUS_SDFM_FILTER);

/*******************************************************/
/* Enable interrupts */
/*******************************************************/
//Following SDFM interrupts can be enabled / disabled using this function.
// Enable / disable comparator high threshold
// Enable / disable comparator low threshold
// Enable / disable modulator clock failure
// Enable / disable filter acknowledge
SDFM_enableInterrupt(IF_SDFM_BASE, IF_SDFM_FILTER,SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(IO_SDFM_BASE, IO_SDFM_FILTER,SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(VO_SDFM_BASE, VO_SDFM_FILTER,SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT);

SDFM_enableInterrupt(IF_SDFM_BASE, IF_SDFM_FILTER,SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(IO_SDFM_BASE, IO_SDFM_FILTER,SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(VO_SDFM_BASE, VO_SDFM_FILTER,SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT);
SDFM_enableInterrupt(VBUS_SDFM_BASE, VBUS_SDFM_FILTER,SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT);

// Enable master filter bit of the SDFM module 1
SDFM_enableMasterFilter(VBUS_SDFM_BASE);
SDFM_enableMasterInterrupt(VBUS_SDFM_BASE);
SDFM_enableMasterFilter(VO_SDFM_BASE);
SDFM_enableMasterInterrupt(VO_SDFM_BASE);
SDFM_enableMasterFilter(IO_SDFM_BASE);
SDFM_enableMasterInterrupt(IO_SDFM_BASE);
SDFM_enableMasterFilter(IF_SDFM_BASE);
SDFM_enableMasterInterrupt(IF_SDFM_BASE);
}


//TODO configureECAPforSDFMClk()
void configureECAPforSDFMClk(uint16_t SD_clk_ecap_sys_ticks)
{
//Use CAP as source for the SD Clock
// PWM3A -> OUTPUTXBAR3 -> GPIO4
// PWM4A -> OUTPUTXBAR4 -> GPIO6

// Select ECAP1.OUT on Mux0
XBAR_setOutputMuxConfig(XBAR_OUTPUT3, XBAR_OUT_MUX00_ECAP1_OUT);
// Enable MUX0 for ECAP1.OUT
XBAR_enableOutputMux(XBAR_OUTPUT3, XBAR_MUX00);

// Select ECAP1.OUT on Mux0
XBAR_setOutputMuxConfig(XBAR_OUTPUT4, XBAR_OUT_MUX00_ECAP1_OUT);
// Enable MUX0 for ECAP1.OUT
XBAR_enableOutputMux(XBAR_OUTPUT4, XBAR_MUX00);

GPIO_setDirectionMode(GPIO_XBAR1,GPIO_DIR_MODE_OUT);
GPIO_setQualificationMode(GPIO_XBAR1,GPIO_QUAL_ASYNC);
GPIO_setPinConfig(GPIO_XBAR1_PIN_CONFIG);

GPIO_setDirectionMode(GPIO_XBAR2,GPIO_DIR_MODE_OUT);
GPIO_setQualificationMode(GPIO_XBAR2,GPIO_QUAL_ASYNC);
GPIO_setPinConfig(GPIO_XBAR2_PIN_CONFIG);

// Setup APWM mode on CAP1, set period and compare registers
ECAP_enableAPWMMode(SDFM_CLK_ECAP1_BASE); // Enable APWM mode
ECAP_setAPWMPeriod(SDFM_CLK_ECAP1_BASE, SD_clk_ecap_sys_ticks-1);
ECAP_setAPWMCompare(SDFM_CLK_ECAP1_BASE, SD_clk_ecap_sys_ticks>>1);

// set next duty cycle to 50%
ECAP_setAPWMShadowPeriod(SDFM_CLK_ECAP1_BASE,SD_clk_ecap_sys_ticks-1);
ECAP_setAPWMShadowCompare(SDFM_CLK_ECAP1_BASE,SD_clk_ecap_sys_ticks>>1);

ECAP_clearInterrupt(SDFM_CLK_ECAP1_BASE,0xFF);
ECAP_clearGlobalInterrupt(SDFM_CLK_ECAP1_BASE);

// Start counters
ECAP_startCounter(SDFM_CLK_ECAP1_BASE);

}

  • Tohid,

    SDFM example code for F280049 device is available in latest C2000Ware. You can use that code as a reference.

    We aren't staffed enough to debug your code? But, if you have any specific question, I can help answer that.

    When you are using manchester encoded signal, you need to use SDFM_MODULATOR_CLK_OFF (Manchester mode) instead of SDFM_MODULATOR_CLK_EQUAL_DATA_RATE.

    SDFM_setupModulatorClock(IF_SDFM_BASE, IF_SDFM_FILTER, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE); //SDFM_MODULATOR_CLK_OFF
    SDFM_setupModulatorClock(IO_SDFM_BASE, IO_SDFM_FILTER, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE); //SDFM_MODULATOR_CLK_OFF
    SDFM_setupModulatorClock(VO_SDFM_BASE, VO_SDFM_FILTER, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE); //SDFM_MODULATOR_CLK_OFF
    SDFM_setupModulatorClock(VBUS_SDFM_BASE, VBUS_SDFM_FILTER, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE); //SDFM_MODULATOR_CLK_OFF

    I also want to bring to your attention that mode 0 provides the best noise immunity performance when compared to other modes. So, I would urge you to consider using mode0.

    Regards,

    Manoj