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输入下降沿捕获,出现捕获部分缺失

Part Number: TMS320F28379S
Other Parts Discussed in Thread: TMS320F28377D

你好,我采用PWM6通过xbar连接到CLB,设置CLB输入下降沿捕获,在输入下降沿捕获过后用示波器测试其波形,发现部分PWM6波形的下降沿并未捕获成功,如下图

...

粉色部分为捕获波形,从波形图上看出,并未捕获成功,但是采用PWM2使用一样的配置,捕获完全正确,请问一下,PWM2和PWM6之间的区别在哪儿,对CLB中的输入滤波器有什么影响?

  • 你好,就CLB模块来说,PWM2和PWM6没什么特别的区别。你的硬件上PWM2和PWM6的外围电路有什么区别吗?

    另外,图片没有上传吗?

  • 硬件上是没有任何区别, 这就是上图,黄色波形是其他的无关波形。

  • 方便给出一下CLB部分的配置程序吗?

    可以用回复框下方的“插入 - 代码”来上传代码。

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

    如上配置代码;

    测试波形如下:

    粉色部分是PWM9A经过CLB,配置输入下降沿捕获得到的波形图,黄色波形是原始波形。

  • 采用TMS320F28377D,波形正确。

  • 嗯?你确定上述问题里面的芯片型号正确吗?

    因为F28377D是没有CLB模块的,只有F28378x和F28379x才有CLB模块。。。

  • 抱歉,刚刚看错了型号,F28379D如上配置,输出正确

  • F28379S和F28379D之间的CLB有区别吗?为什么F28379s会出现部分捕获不成功问题呢?

  • 尾缀是D的是双核,S的是单核,基本就这个区别。但是我没想到单核双核之间在CLB方面有什么区别,不知道你是否要了解一下这个问题,如果需要的话我明天问一下其他工程师看是有没有这方面的经验。

  • 这边工程师认为,有可能是示波器的采样率太低。脉冲为 1 CLB 时钟宽,因此为 10ns。例如,如果采样率为每 20ns,则可能会完全错过一个脉冲。根据 Nyquist,采样率需要至少是信号最高频率分量的两倍。