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/TMS320F280049:SDFM:PWM 同步问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/897922/ccs-tms320f280049-sdfm-pwm-sync-problem

器件型号:TMS320F280049
主题中讨论的其他器件:AMC1035

工具/软件:Code Composer Studio

我将 TMS320F280049中的 SDFM 模块与 AMC1035搭配使用。  

我希望与以50kHz 频率生成信号的 PWM1模块进行同步测量。

我的问题是、当我从 PWM1启用同步并且 SDFM 发生特定中断时、我得到的结果不正确。 按预期的20us 周期调用中断。 当我禁用 PWM 同步时、我可以在 ISR 中获得正确的结果。 PWM1配置为在时基计数器等于周期时生成 SOC_A。 应该是这样  

我的配置如下:
SDFM1滤波器设置:仅启用 FILTER4、SINC3、OSR 128、SD_CLK = 10MHz、 @μ s 数据速率频率= 78kHz、延迟38.4us

初始化代码:它基于来自 C2000 ware 的示例代码。  

void init_SDFM (void)
{
//引脚配置
GPIO_setDirectionMode (58、GPIO_DIR_MODE_IN);
GPIO_setMasterCore (58、GPIO_CORE_CPU1);
GPIO_setPadConfig (58、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (58、GPIO_QUAL_异 步);
GPIO_setPinConfig (GPIO_58_SD_D4);

GPIO_setDirectionMode (59、GPIO_DIR_MODE_IN);
GPIO_setMasterCore (59、GPIO_CORE_CPU1);
GPIO_setPadConfig (59、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (59、GPIO_QUAL_ASYNCx);
GPIO_setPinConfig (GPIO_59_SD_C4);

//
//配置输入控制单元:调制器时钟速率=调制器数据速率
//
SDFM_setupModulatorClock (SDFM1_base、SDFM_FILTER_4、SDFM_MODEG_CLK_OFF);
SDFM_configDataFilter (SDFM1_base、(SDFM_FILTER_4 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR (128))、(SDFM_DATA_FORMAT_16_BIT | SDFM_FILTER_ENABLE | SDFM_SHIFT_VALUE (0x0006))));
//
//启用主过滤器位:除非该位被置位,否则所有过滤器都没有
//模块可以启用。 当时、所有滤波器模块均同步
在启用各个滤波器模块后、//主滤波器位被启用。
//
SDFM_enableMasterFilter (SDFM1_base);

//
//设置输出数据格式
//
SDFM_setOutputDataFormat (SDFM1_base、SDFM_FILTER_4、SDFM_DATA_FORMAT_16_BIT);

//
//禁用 PWM 同步
//
//SDFM_disableExternalReset (SDFM1_base、SDFM_filter_4);

//
// PWM 信号可以同步 SDFM1滤波器。 为 SDFM 启用 PWM 同步
//过滤器。
//
SDFM_enableExternalReset (SDFM1_base、SDFM_FILTER_4);
SDFM_setPWMSyncSource (SDFM1_base、SDFM_FILTER_4、SDFM_SYNC_PWM1_SOCA);

//
//启用中断
//
//可以使用此函数启用/禁用以下 SDFM 中断。
//启用调制器时钟故障
//启用数据过滤器确认
//

SDFM_enableInterrupt (SDFM1_base、SDFM_FILTER_4、(SDFM_MODICER_FAIL_INTERRUPT | SDFM_DATA_FILTER_ACYING_INTERRUPT));

/*
SDFM_DisableInterrupt (SDFM1_base、SDFM_FILTER_4、
(SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT |
SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT);
*
//
//启用主中断,以便可以触发任何过滤器中断
//通过 SDFM 中断到 CPU
//
SDFM_enableMasterInterrupt (SDFM1_base);
} 

谢谢你。

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

    Jozef、

    每当您每20us 从 PWM1.SOCA 获得 SDSYNC 事件时、预计将获得两个错误的 Sinc3滤波器样本。 这是预期行为,并记录在 TRM (检查 SDSYNC 事件部分第1737页)中。 2个错误的样本后、您开始从第3个样本开始获取正确的样本。

    此致、

    曼诺伊

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

    Manoj、
    我知道前两个样本不正确、但 我不断得到错误的样本。 应该有另一个原因,但我仍然找不到。

    此致、
    约泽夫

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

    Manoj、
    我再读了一次你的评论,我认为我第一次对你的理解不是很好。  
    因此、一旦数据速率 频率为78kHz 、每20us 获取一次 SDSYNC 事件就毫无意义、因为我在20us 周期内从未获得第三个(正确)采样。  
    对吗?  

    此致、

    约泽夫

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

    Jozef、

    您的数据滤波器运行在 DOSR = 128 @ 20MHz SDCLK 上、数据速率= 6.4us、延迟= 19.2us。

    当 SDSYNC 事件每20us 发生一次时、数据滤波器需要 SDSYNC 事件至少19.2us 的时间才能开始生成正确的滤波器结果。 如果您在不使用 AFX 标志位(或数据确认中断)的情况下读取数据滤波器结果、则需要在滤波器延迟的基础上额外添加5个 SDCLK 周期。 因此、您只能在19.2us + 250ns = 19.45us 后读取滤波器结果。 因此、在随后发生 SDSYNC 事件之前、您读取滤波器结果的裕度确实很小。

    您只有两个选项:

    1. 降低 SDSYNC 事件的频率(或)
    2. 降低 DOSR、作为一种折衷、以便在发生 SDSYNC 事件之前具有更多带宽来读取滤波器结果。

    此致、

    曼诺伊