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.

[参考译文] TMS320F28379S:有关 CLB 的问题

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1082217/tms320f28379s-question-about-clb

部件号:TMS320F28379S
“线程:测试”中讨论的其它部件

尊敬的团队:

我的客户通过 X-Bar 将 PWM6连接到 CLB,并将 CLB 设置为捕获落边。 捕获输入的下降边缘后,发现一些 PWM6波形的下降边缘未能通过示波器测试成功捕获。

但是,PWM2测试可以正确捕获相同的配置(外部硬件也是相同的),对于 CLB,PWM2和 PWM6之间是否有任何区别?

此致

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

    绿色,  

    如果所有配置都是一样的,那么我认为不应该有区别。  他们是否看到一些缺失的边线或根本没有边线?

    此致

    洛里

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

    亲爱的洛里:

    客户反馈他的代码在 F28379D 上可以很好地发挥作用,但当他在 F28379S 上使用此代码时 ,CLB 无法捕获下图中所示的 PWM 波的下降边缘。

    黄色波形为 PWM。  粉红色部分是 CLB 捕获的 PWM9A 波形。

    下面是他的代码。

    #include "driverlib.h"
    #include "device.h"
    #include "clb_config.h"
    #include "clb.h"
    
    /*
     * 由于上下计数,频率为       f =    100M/(2 * EPWM2_TIMER_TBPRD) = 50k 占空比为
     * 此处固定占空比为50%
     */
    #define EPWM6_TIMER_TBPRD   1000U   //< 计数加载值
    #define EPWM6_CMPA          500U    //< 计数比较值A      未使用
    #define EPWM6_CMPB          500U    //< 计数比较值B 未使用
    
    void initEPWM6(void);
    void initCLB1(void);
    void initCLB2(void);
    bool GP_0 = false;
    
    void delay(int ms){
        int i, j;
        for( i = 0; i < 200; i++)
        {
            for( j = 0; j < ms * 1000; j++);
        }
    }
    
    void initPWMGPIO()
    {
        GPIO_setPadConfig(2, GPIO_PIN_TYPE_STD);
        GPIO_setPinConfig(GPIO_2_EPWM2A);
        GPIO_setPadConfig(3, GPIO_PIN_TYPE_STD);
        GPIO_setPinConfig(GPIO_3_EPWM2B);
    
        GPIO_setPadConfig(10, GPIO_PIN_TYPE_STD);
        GPIO_setPinConfig(GPIO_10_EPWM6A);
        GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);
        GPIO_setPinConfig(GPIO_11_EPWM6B);
    
    
        GPIO_setPadConfig(14, GPIO_PIN_TYPE_STD);         //< PWM8A
        GPIO_setDirectionMode(14, GPIO_DIR_MODE_OUT);
        GPIO_setPinConfig(GPIO_14_OUTPUTXBAR3);
        GPIO_setPadConfig(15, GPIO_PIN_TYPE_STD);         //< PWM8B
        GPIO_setDirectionMode(15, GPIO_DIR_MODE_OUT);
        GPIO_setPinConfig(GPIO_15_OUTPUTXBAR4);
    
    
        GPIO_setPadConfig(16, GPIO_PIN_TYPE_STD);         //< PWM9A
        GPIO_setDirectionMode(16, GPIO_DIR_MODE_OUT);
        GPIO_setPinConfig(GPIO_16_OUTPUTXBAR7);
        GPIO_setPadConfig(17, GPIO_PIN_TYPE_STD);         //< PWM9B
        GPIO_setDirectionMode(17, GPIO_DIR_MODE_OUT);
        GPIO_setPinConfig(GPIO_17_OUTPUTXBAR8);
    }
    
    void main(void)
    {
        /**
         * 设备初始化
         */
        Device_init();
        /**
         * 初始化设备引脚为默认状态
         */
        Device_initGPIO();
    
        /**
         * 初始化中断终端模块,此处可以不需要使用中断
         */
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        initPWMGPIO();
    
        /* 初始化PWM6 */
        initEPWM6();
    
        /* 时钟外设使能 */
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
        SysCtl_enablePeripheral((SysCtl_PeripheralPCLOCKCR)0x0011);
        SysCtl_enablePeripheral((SysCtl_PeripheralPCLOCKCR)0x0111);
        SysCtl_enablePeripheral((SysCtl_PeripheralPCLOCKCR)0x0211);
        SysCtl_enablePeripheral((SysCtl_PeripheralPCLOCKCR)0x0311);
    
        /* 使能CLB */
        CLB_enableCLB(CLB1_BASE);
        CLB_enableCLB(CLB3_BASE);
    
        /* 初始化CLB    TILEx */
        initTILE1(CLB1_BASE);
        initTILE2(CLB3_BASE);
    
        /**
        * 配置其输入 PWM6A, XBAR_CLB_MUX05_INPUTXBAR3 绑定到
        * XBAR_AUXSIG0 使能MUX 设置XBAR的XBAR_INPUT1为10(PWM6A)引脚
        */
        XBAR_setCLBMuxConfig( XBAR_AUXSIG0, XBAR_CLB_MUX05_INPUTXBAR3);
        XBAR_enableCLBMux(XBAR_AUXSIG0, XBAR_MUX05);
        XBAR_setInputPin(XBAR_INPUT3, 10);
    
        /**
        * 配置其输入 PWM6A, XBAR_CLB_MUX07_INPUTXBAR4 绑定到
        * XBAR_AUXSIG1 使能MUX 设置XBAR的XBAR_INPUT1为11(PWM6B)引脚
        */
        XBAR_setCLBMuxConfig( XBAR_AUXSIG1, XBAR_CLB_MUX07_INPUTXBAR4);
        XBAR_enableCLBMux(XBAR_AUXSIG1, XBAR_MUX07);
        XBAR_setInputPin(XBAR_INPUT4, 11);
    /*********************************CLB1配置***********************************************************/
        // Config CLB1 Local Input as Global Input
        CLB_configLocalInputMux(CLB1_BASE, CLB_IN0, CLB_LOCAL_IN_MUX_GLOBAL_IN);
        CLB_configLocalInputMux(CLB1_BASE, CLB_IN1, CLB_LOCAL_IN_MUX_GLOBAL_IN);
    
        // Config CLB1 Global Input as CLB_GLOBAL_IN_MUX_CLB_AUXSIG2 and
        // CLB_GLOBAL_IN_MUX_CLB_AUXSIG3
        CLB_configGlobalInputMux(CLB1_BASE, CLB_IN0, CLB_GLOBAL_IN_MUX_CLB_AUXSIG0);
        CLB_configGlobalInputMux(CLB1_BASE, CLB_IN1, CLB_GLOBAL_IN_MUX_CLB_AUXSIG1);
    
        //配置输入为外部输入,禁用GP输入
        CLB_configGPInputMux(CLB1_BASE, CLB_IN0, CLB_GP_IN_MUX_EXTERNAL);
        CLB_configGPInputMux(CLB1_BASE, CLB_IN1, CLB_GP_IN_MUX_EXTERNAL);
    
    /*********************************CLB1配置完成*********************************************************/
    
    /*********************************CLB2配置***********************************************************/
    
        // Config CLB1 Local Input as Global Input
        CLB_configLocalInputMux(CLB3_BASE, CLB_IN0, CLB_LOCAL_IN_MUX_GLOBAL_IN);
        CLB_configLocalInputMux(CLB3_BASE, CLB_IN1, CLB_LOCAL_IN_MUX_GLOBAL_IN);
    
    
        //
        // Config CLB1 Global Input as CLB_GLOBAL_IN_MUX_CLB_AUXSIG2 、
        // CLB_GLOBAL_IN_MUX_CLB_AUXSIG3 、 CLB_GLOBAL_IN_MUX_EPWM2A 、
        // CLB_GLOBAL_IN_MUX_EPWM2B
        //
        CLB_configGlobalInputMux(CLB3_BASE, CLB_IN0, CLB_GLOBAL_IN_MUX_CLB_AUXSIG0);
        CLB_configGlobalInputMux(CLB3_BASE, CLB_IN1, CLB_GLOBAL_IN_MUX_CLB_AUXSIG1);
    
    
        //配置输入为外部输入,禁用GP输入
        CLB_configGPInputMux(CLB3_BASE, CLB_IN0, CLB_GP_IN_MUX_EXTERNAL);
        CLB_configGPInputMux(CLB3_BASE, CLB_IN1, CLB_GP_IN_MUX_EXTERNAL);
    
    
        // 设置CLB1输入滤波,下降沿触发。用于产生死区
        CLB_selectInputFilter(CLB3_BASE, CLB_IN0, CLB_FILTER_FALLING_EDGE);
        CLB_selectInputFilter(CLB3_BASE, CLB_IN1, CLB_FILTER_FALLING_EDGE);
    
    
     /*********************************CLB2配置完成*********************************************************/
        // 配置输出CLB1 X-Bar
        XBAR_setOutputMuxConfig(XBAR_OUTPUT3, XBAR_OUT_MUX01_CLB1_OUT4);  //< XBAR_INPUT1  PWM8A
        XBAR_enableOutputMux(XBAR_OUTPUT3, XBAR_MUX01);
        XBAR_setOutputMuxConfig(XBAR_OUTPUT4, XBAR_OUT_MUX03_CLB1_OUT5);  //< XBAR_INPUT2  PWM8B
        XBAR_enableOutputMux(XBAR_OUTPUT4, XBAR_MUX03);
    
        //配置输出CLB4     X-Bar
        XBAR_setOutputMuxConfig(XBAR_OUTPUT7, XBAR_OUT_MUX09_CLB3_OUT4);  //< XBAR_INPUT3  PWM9A
        XBAR_enableOutputMux(XBAR_OUTPUT7, XBAR_MUX09);
        XBAR_setOutputMuxConfig(XBAR_OUTPUT8, XBAR_OUT_MUX11_CLB3_OUT5);  //< XBAR_INPUT4  PWM9B
        XBAR_enableOutputMux(XBAR_OUTPUT8, XBAR_MUX11);
    
        CLB_setOutputMask(CLB1_BASE, 0x30, false);   //< 使能CLB1 output4 output5
        CLB_setOutputMask(CLB3_BASE, 0x30, false);   //< 使能CLB1 output4 output5
        int gp_value = 0x30;
    
        while(1)
        {
            CLB_setGPREG(CLB1_BASE, gp_value);
            CLB_setGPREG(CLB3_BASE, gp_value);
            delay(1000);
            GP_0 = !GP_0;
            asm(" NOP");
        }
    }
    
    /* 采用上下计数方式,得到如下PWM波形
            ————————————————                 ————————————————
            |               |                |               |                  PWMXA
    ————————                ——————————————————               —————————————————
    
    ————————                ————————————————                 ————————————————
            |               |               |                |               |  PWMXB
            ————————————————                ——————————————————
    
    
    */
    
    void initEPWM6(void)
    {
        /* 设置预加载值 */
        EPWM_setTimeBasePeriod(EPWM6_BASE, EPWM6_TIMER_TBPRD);
    
        /* 设置移相值 */
        EPWM_setPhaseShift(EPWM6_BASE, 0U);
    
        /* 设置计数初始值 */
        EPWM_setTimeBaseCounter(EPWM6_BASE, 0U);
    
        /* sync pulse is generated when time base counter equals zero */
        EPWM_setSyncOutPulseMode(EPWM6_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
        /* 设置计数比较值 */
        EPWM_setCounterCompareValue(EPWM6_BASE, EPWM_COUNTER_COMPARE_A, EPWM6_CMPA);
        EPWM_setCounterCompareValue(EPWM6_BASE, EPWM_COUNTER_COMPARE_B, EPWM6_CMPB);
    
        /* 使能移相加载,确保与其他的PWM同时产生 */
        EPWM_enablePhaseShiftLoad(EPWM6_BASE);
    
        /*设置分频时钟,在复位后默认EPWMCLK = 200M / 2 = 100M, TBCLK = EPWMCLK/(highSpeedPrescaler * pre-scaler)=100M */
        EPWM_setClockPrescaler(EPWM6_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
    
        /* Sets up the Counter Compare shadow load mode */
        EPWM_setCounterCompareShadowLoadMode(EPWM6_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(EPWM6_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        /* 根据比较值,参数特定PWM */
        EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        /*设置上下计数模式*/
        EPWM_setTimeBaseCounterMode(EPWM6_BASE, EPWM_COUNTER_MODE_UP_DOWN);
    }

    此致

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

    绿色,

    由于仅缺少一些样品,我怀疑这是由于示波器采样率过低所致。  脉冲为1 CLB 时钟宽度 SO 10ns。  例如,如果采样率为每20 ns,则可能完全漏掉一个脉冲。 根据 Nyquist,采样率至少需要是信号最高频率组成部分的两倍。   

    在 F2837xD 波形上,示波器的采样率可能会设置得更高,或者它们会清晰地捕捉到每条边线。  

    此致

    洛里