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.
Dear team:
My client connects PWM6 to CLB via X-Bar and sets CLB to capture falling edge. After capturing the falling edge of the input, it was found that the falling edge of some PWM6 waveforms was not captured successfully with an oscilloscope test.
But the same configuration can be captured correctly with PWM2 test (external hardware is also the same), for CLB, is there any difference between PWM2 and PWM6?
Best regards
Green,
If everything is configured the same, then I don't think there should be a difference. Are they seeing some missing edges or no edges at all?
Regards
Lori
Dear Lori:
Customer feedback that his code can work well on F28379D, but when he use this code on F28379S, The CLB fails to capture the falling edge of PWM wave as circled in the figure below.
The Yellow waveform is PWM. The pink part is the waveform of PWM9A captured by CLB.
Below is his code.
#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); }
Best regards
Green,
Since it is only some samples missing, I suspect that it is due to the sampling rate of the oscilloscope being too low. The pulses are 1 CLB clock wide so 10ns. For example if the sampling rate is every 20ns, then a pulse can be completely missed. Per Nyquist, the sampling rate needs to be at least twice the rate of the signal's highest frequency component.
On F2837xD waveform, the sampling rate of the scope was likely set higher or they lucked out and captured each edge.
Regards
Lori