Other Parts Discussed in Thread: TMS320F28377D
你好,我采用PWM6通过xbar连接到CLB,设置CLB输入下降沿捕获,在输入下降沿捕获过后用示波器测试其波形,发现部分PWM6波形的下降沿并未捕获成功,如下图
...
粉色部分为捕获波形,从波形图上看出,并未捕获成功,但是采用PWM2使用一样的配置,捕获完全正确,请问一下,PWM2和PWM6之间的区别在哪儿,对CLB中的输入滤波器有什么影响?
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.
你好,我采用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,配置输入下降沿捕获得到的波形图,黄色波形是原始波形。
嗯?你确定上述问题里面的芯片型号正确吗?
因为F28377D是没有CLB模块的,只有F28378x和F28379x才有CLB模块。。。
尾缀是D的是双核,S的是单核,基本就这个区别。但是我没想到单核双核之间在CLB方面有什么区别,不知道你是否要了解一下这个问题,如果需要的话我明天问一下其他工程师看是有没有这方面的经验。
这边工程师认为,有可能是示波器的采样率太低。脉冲为 1 CLB 时钟宽,因此为 10ns。例如,如果采样率为每 20ns,则可能会完全错过一个脉冲。根据 Nyquist,采样率需要至少是信号最高频率分量的两倍。