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.

[参考译文] TMS320F28377D:SDFM 计时帮助获取新数据(AMC1303M0510)和配置

Guru**** 657930 points
Other Parts Discussed in Thread: SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1259084/tms320f28377d-help-sdfm-timing-for-getting-new-data-amc1303m0510-and-configuration

器件型号:TMS320F28377D
主题中讨论的其他器件:SysConfig

您好:专家,

我已将 SDFM 模块配置为使用控制环路 OCR 为58的 SIN3滤波器、这将为我提供大约12位(ENOB)

以下是 SDFM 设置:

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);
}

我发现此 Excel 工具很有用:

在 Excel 中、它说滤波器稳定时间将为 17.4微秒。

查看 MCU 的技术参考手册、在 AFx 事件部分中:

那么、这是否意味着只要启用主中断(SDCTL.MIE = 1)、AFx 事件发生就需要17.4微秒?

其次、您能否确认 SDFM 模块的所有四个滤波器通道都并行工作? 我需要检查所有 AFX 事件的状态吗、还是 只轮询任何一个 AFX 事件就可以摆脱这种状态吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    接下来还有一个问题,即使我已经将 SDFM 模块的 ENOB 配置为12位,我仍然看到数据超过了最大值4096吗?

    我已经移位、但位移了3位:

    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));

    您能否说明最大值是多少?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ak:

    第二、您能否确认 SDFM 模块的所有四个滤波通道都可以并行工作? 我需要检查所有 AFX 事件的状态,还是 只轮询任何一个 AFX 事件就可以离开?

    AMC1303会为 C2000的 SDFM 输入生成其自己的时钟。 我认为不会有多个设备随着时间的推移而保持同步、因此您应该检查所有 AFX 事件。 有些 AMCx 器件接受时钟输入、仅供参考。

    还要说明一点、默认情况下、AMC1303Mx 时序要求并不完全满足 C2000 SDFM 时序要求。 我们发现、使用 GPIO 反转功能(GPxINV)将 SDFM 时钟输入反转至 C2000可解决该问题。 如果您愿意、我可以向您发送更多有关这方面的信息。

    另一个后续问题,即使我已配置 SDFM 模块的 ENOB 为12位,我仍然看到数据超过最大值4096?

    您看到的值范围是多少?

    此致!

    凯文

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我要指出的是、默认情况下 AMC1303Mx 时序要求并不完全符合 C2000 SDFM 时序要求。 我们发现、使用 GPIO 反转功能(GPxINV)将 SDFM 时钟输入反转至 C2000可解决该问题。 如果您愿意,我可以向您发送有关此问题的更多信息。

    我不知道这一点、会尝试反转并对其进行检查。

    您看到的值范围是什么?

    约为+- 24000个数。

    我读取的数据如下所示:

    #define READ_CURRENT_SDFM()														\
    /* Set SDFM output data format*/                                               \
       SDFM_setOutputDataFormat(M2_SDFM_BASE, SDFM_FILTER_1, SDFM_DATA_FORMAT_16_BIT); \
       SDFM_setOutputDataFormat(M2_SDFM_BASE, SDFM_FILTER_2, SDFM_DATA_FORMAT_16_BIT); \
       SDFM_setOutputDataFormat(M2_SDFM_BASE, SDFM_FILTER_3, SDFM_DATA_FORMAT_16_BIT); \
    /* Enable SDFM Master Interrupt*/                                              \
       SDFM_enableMasterFilter(M2_SDFM_BASE);                                     \
    /* Wait for SDFM to complete acquiring data*/                                  \
       while(pMotor->SdfmIntFlag->bit.AF1 == 1);                                  \
       while(pMotor->SdfmIntFlag->bit.AF2 == 1);                                  \
       while(pMotor->SdfmIntFlag->bit.AF3 == 1);                                  \
    /* Store the data in appropriate variables*/                                   \
       AMC1303Vars[1].rawfilter1Result = (int16_t) (SDFM_getFilterData(M2_SDFM_BASE, SDFM_FILTER_1) >> 16U);        \
       AMC1303Vars[1].rawfilter2Result = (int16_t) (SDFM_getFilterData(M2_SDFM_BASE, SDFM_FILTER_2) >> 16U);        \
       AMC1303Vars[1].rawfilter3Result = (int16_t) (SDFM_getFilterData(M2_SDFM_BASE, SDFM_FILTER_3) >> 16U);        \
    /*Clear the interrupt.*/                                                       \
       SDFM_clearInterruptFlag(M2_SDFM_BASE, SDFM_MASTER_INTERRUPT_FLAG | 0xFFFF);                                  \
       Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP5);                             \

    这是从数据记录器(橙色色线图)捕获的计数数据:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ak:

    约为+- 24000个数。

    我读取的数据如下所示:

    [/报价]

    假设您使用的是16位表示、则这是正确的范围。 我们在 SDFM SysConfig 模块中有一个工具、用于计算此类滤波器数据输出。 请查看下面的案例:

    此致!

    凯文

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Kevin、SysConfig 工具帮了我们很多忙。 我曾认为 SDFM 数据将自动与12位的 ENOB 值对齐。