TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28379S: CLB输入下降沿捕获,出现捕获部分缺失

Part Number:TMS320F28379SOther Parts Discussed in Thread:TMS320F28377D

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

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

Green Deng:

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

另外,图片没有上传吗?

,

feng xiwang:

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

,

Green Deng:

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

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

,

feng xiwang:

#include "driverlib.h"
#include "device.h"
#include "clb_config.h"
#include "clb.h"/** 由于上下计数,频率为f =100M/(2 * EPWM2_TIMER_TBPRD) = 50k 占空比为* 此处固定占空比为50%*/
#define EPWM6_TIMER_TBPRD1000U//< 计数加载值
#define EPWM6_CMPA500U//< 计数比较值A未使用
#define EPWM6_CMPB500U//< 计数比较值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);//< PWM8AGPIO_setDirectionMode(14, GPIO_DIR_MODE_OUT);GPIO_setPinConfig(GPIO_14_OUTPUTXBAR3);GPIO_setPadConfig(15, GPIO_PIN_TYPE_STD);//< PWM8BGPIO_setDirectionMode(15, GPIO_DIR_MODE_OUT);GPIO_setPinConfig(GPIO_15_OUTPUTXBAR4);GPIO_setPadConfig(16, GPIO_PIN_TYPE_STD);//< PWM9AGPIO_setDirectionMode(16, GPIO_DIR_MODE_OUT);GPIO_setPinConfig(GPIO_16_OUTPUTXBAR7);GPIO_setPadConfig(17, GPIO_PIN_TYPE_STD);//< PWM9BGPIO_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);/* 初始化CLBTILEx */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 InputCLB_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_AUXSIG3CLB_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 InputCLB_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-BarXBAR_setOutputMuxConfig(XBAR_OUTPUT3, XBAR_OUT_MUX01_CLB1_OUT4);//< XBAR_INPUT1PWM8AXBAR_enableOutputMux(XBAR_OUTPUT3, XBAR_MUX01);XBAR_setOutputMuxConfig(XBAR_OUTPUT4, XBAR_OUT_MUX03_CLB1_OUT5);//< XBAR_INPUT2PWM8BXBAR_enableOutputMux(XBAR_OUTPUT4, XBAR_MUX03);//配置输出CLB4X-BarXBAR_setOutputMuxConfig(XBAR_OUTPUT7, XBAR_OUT_MUX09_CLB3_OUT4);//< XBAR_INPUT3PWM9AXBAR_enableOutputMux(XBAR_OUTPUT7, XBAR_MUX09);XBAR_setOutputMuxConfig(XBAR_OUTPUT8, XBAR_OUT_MUX11_CLB3_OUT5);//< XBAR_INPUT4PWM9BXBAR_enableOutputMux(XBAR_OUTPUT8, XBAR_MUX11);CLB_setOutputMask(CLB1_BASE, 0x30, false);//< 使能CLB1 output4 output5CLB_setOutputMask(CLB3_BASE, 0x30, false);//< 使能CLB1 output4 output5int 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,配置输入下降沿捕获得到的波形图,黄色波形是原始波形。

,

feng xiwang:

 这是CLB的配置。

,

feng xiwang:

采用TMS320F28377D,波形正确。

,

Green Deng:

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

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

,

feng xiwang:

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

,

feng xiwang:

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

,

Green Deng:

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

,

Green Deng:

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28379S: CLB输入下降沿捕获,出现捕获部分缺失
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1