Problems Setting Prescaler for PWM capture

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Problems Setting Prescaler for PWM capture

2,543 Views
mexp2
Contributor I

We are using a PWM input to capture a external frequency of a tacho.

With the standard settings everything works fine but when i apply a prescaler during initialization

pwmConfig.prescale = kPWM_Prescale_Divide_64;

or by setting it via

void PWM_SetClockMode

the values of CVAL2 and CVAL3 are always 0x00 and the counter is not counting

My signal has a frequency of 200Hz 

0 Kudos
Reply
5 Replies

2,475 Views
mexp2
Contributor I

We use the imxRT1062 with the SDK v 2.13.0

/* Read the PWM default configuration */
PWM_GetDefaultConfig(&pwmConfig);

pwmConfig.reloadLogic 	  = kPWM_ReloadImmediate;
pwmConfig.pairOperation   = kPWM_Independent;
pwmConfig.enableDebugMode = true;

/* Init the pwm */
if( PWM_Init(TACHOPUMP_PERIPHERAL, TACHOPUMP_CHANNEL, &pwmConfig) == kStatus_Fail)
{
	PRINTF("Can't initialize PWM\n");
return;
}

/* Configure the capture input of the PWM for one shot polling */
pwm_input_capture_param_t captureConfig;

captureConfig.captureInputSel = false;
captureConfig.edge0 = kPWM_RisingEdge;
captureConfig.edge1 = kPWM_RisingEdge;
captureConfig.enableOneShotCapture = true;

PWM_SetupInputCapture(TACHOPUMP_PERIPHERAL, TACHOPUMP_CHANNEL, TACHOPUMP_SIGNAL, &captureConfig);

PWM_SetPwmLdok(TACHOPUMP_PERIPHERAL, timerBitmask, true);

PWM_StartTimer(TACHOPUMP_PERIPHERAL, timerBitmask);

with this code everything works as expected, but if i add a prescaler in the configuration

pwmConfig.prescale = kPWM_Prescale_Divide_128;

the counter is not counting anymore

0 Kudos
Reply

2,417 Views
RaRo
NXP TechSupport
NXP TechSupport

Hello @mexp2,

First of all, we apologize for the delay to answer you.

Just for double check, could you please tell us where are you placing the kPWM_Prescale_Divide_128? It might be good if you could write the pwmConfig.prescale=kPWM_Prescale_Divide_128; after pwmConfig.pairOperation=kPWM_Independent; and before PWM_Init(). Also, which clock source are you using?

Finally, could you please try to use other values of the prescaler below 64?

Best regards, Raul.

0 Kudos
Reply

1,225 Views
coderick
Contributor II

你好,我也遇到了楼主同样的问题,将分频代码去掉或者设为1分频时,Counter可以正常运行,但是设置2分频或更高的分频时Counter就停止了,这是什么原因?

void Capture_config(void)
{
    pwm_input_capture_param_t pwm_input_capture;
    gpio_pin_config_t PWM_pin_config;
  
    //初始化输入捕获管脚
    IOMUXC_SetPinMux(PWM2_PWMA03_IOMUXC, 0U);                             //设置外部引脚的复用功能                              
    IOMUXC_SetPinConfig(PWM2_PWMA03_IOMUXC, PWMC_INPUT_PAD_CONFIG_DATA);     //设置引脚的 pad 属性 

    PWM_pin_config.direction = kGPIO_DigitalInput;
    PWM_pin_config.interruptMode = kGPIO_NoIntmode;

    GPIO_PinInit(PWM2_PWMA03_GPIO, PWM2_PWMA03_GPIO_PIN, &PWM_pin_config);

    //初始化输入捕获配置参数
    pwm_input_capture.captureInputSel = false;
    pwm_input_capture.edge0 = kPWM_RisingEdge;
    //pwm_input_capture.edge1 = kPWM_FallingEdge;
    pwm_input_capture.enableOneShotCapture = false;
    //pwm_input_capture.edgeCompareValue = 10;  //当captureInputSel为FALSE时,此处设值无意义
    pwm_input_capture.fifoWatermark = 0;
    PWM_SetupInputCapture(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_PwmA, &pwm_input_capture);

    //开启捕获中断
    //set_IRQn_Priority(PWM2_3_IRQn,Group4_PreemptPriority_0, Group4_SubPriority_0);//设置中断优先级
    //PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable| kPWM_CaptureA1InterruptEnable );
    PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable );
    EnableIRQ(PWM2_3_IRQn);  
}

 /**
* @brief  初始化 PWM  配置参数 
* @retval 无
*/
void PWM_config(void)
{
    pwm_config_t pwmConfig;//定义pwm 配置结构体

    PWM_Deinit(PI_PWM_BASEADDR, kPWM_Module_3);
    /*设置AHB总线时钟和IP总线时钟*/
    CLOCK_SetDiv(kCLOCK_IpgDiv, 0x3); /* Set IPG PODF to 3, divede by 4 */

    /*设置pwm 错误输入为高电平,表示没有错误,只有当pwm 没有错误输入或者禁止错误检测才能正常输出pwm波*/
    XBARA_Init(XBARA1);
    XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault0);
    XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault1);
    XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault2);
    XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault3); 
    
    PWM_GetDefaultConfig(&pwmConfig);
    pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; //新值在上一个pwm周期输出结束之后加载到缓冲寄存器中
    pwmConfig.pairOperation = kPWM_Independent;      // 工作在独立模式
    pwmConfig.clockSource = kPWM_BusClock;
    pwmConfig.enableDebugMode = true;                // 使能DebugMode 
    pwmConfig.prescale = kPWM_Prescale_Divide_128;    //1320000000/128/65535=16Hz=PWM最小频率

    //初始化 PWM 并且判断初始化是否成功
    if (PWM_Init(PI_PWM_BASEADDR, kPWM_Module_3, &pwmConfig) == kStatus_Fail)
    {
        PRINTF("PWM initialization failed\n");
    }
    Capture_config();
    PWM_SetPwmLdok(PI_PWM_BASEADDR,kPWM_Control_Module_3 , true);   
    PWM_StartTimer(PI_PWM_BASEADDR, kPWM_Control_Module_3 );
}
Tags (2)
0 Kudos
Reply

2,515 Views
Sanket_Parekh
NXP TechSupport
NXP TechSupport

Hi @mexp2 ,

I hope you are doing well.

Please specify which i.MX Processor is used to debug further.

Thanks & Regards,
Sanket Parekh

0 Kudos
Reply

1,124 Views
isharaby
Contributor I

Hello,

I've encountered the same issue,
when configuring the any of the four PWM peripherals clock perscaler with values other than kPWM_Prescale_Divide_1 , the counter of the selected PWM peripheral doesn't work at all.

I'm using the imxrt1062 processor and MCUXpresso IDE v11.9.1

I hope, you can support me as soon as possible.
And, here is a snippet of my code where I configure and initialize the pwm peripherals.

static void pwm_init(void)

{

pwm_config_t pwmConfig;

pwm_input_capture_param_t captureConfig;

pwm_fault_param_t faultConfig;

 

/* Read the PWM default configuration */

PWM_GetDefaultConfig(&pwmConfig);

pwmConfig.clockSource = kPWM_BusClock;

pwmConfig.prescale = kPWM_Prescale_Divide_2;

pwmConfig.pairOperation = kPWM_Independent;

pwmConfig.initializationControl = kPWM_Initialize_LocalSync;

pwmConfig.reloadLogic = kPWM_ReloadImmediate;

pwmConfig.reloadSelect = kPWM_LocalReload;

pwmConfig.reloadFrequency = kPWM_LoadEveryOportunity;

pwmConfig.forceTrigger = kPWM_Force_LocalSync;

pwmConfig.enableDebugMode = true;

 

PWM_Init(PWM1_BASEADDR, kPWM_Module_3, &pwmConfig);

PWM_Init(PWM2_BASEADDR, kPWM_Module_3, &pwmConfig);

PWM_Init(PWM3_BASEADDR, kPWM_Module_1, &pwmConfig);

PWM_Init(PWM4_BASEADDR, kPWM_Module_1, &pwmConfig);

 

// fault configuration

PWM_FaultDefaultConfig(&faultConfig);

/* Sets up the PWM fault protection */

PWM_SetupFaults(PWM1_BASEADDR, kPWM_Fault_0, &faultConfig);

PWM_SetupFaults(PWM1_BASEADDR, kPWM_Fault_1, &faultConfig);

PWM_SetupFaults(PWM1_BASEADDR, kPWM_Fault_2, &faultConfig);

PWM_SetupFaults(PWM1_BASEADDR, kPWM_Fault_3, &faultConfig);

 

/* Set PWM fault disable mapping for submodule 0/1/2 */

PWM_SetupFaultDisableMap(PWM1_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM1_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM1_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM1_BASEADDR, kPWM_Module_3, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

 

/* Sets up the PWM fault protection */

PWM_SetupFaults(PWM2_BASEADDR, kPWM_Fault_0, &faultConfig);

PWM_SetupFaults(PWM2_BASEADDR, kPWM_Fault_1, &faultConfig);

PWM_SetupFaults(PWM2_BASEADDR, kPWM_Fault_2, &faultConfig);

PWM_SetupFaults(PWM2_BASEADDR, kPWM_Fault_3, &faultConfig);

 

/* Set PWM fault disable mapping for submodule 0/1/2 */

PWM_SetupFaultDisableMap(PWM2_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM2_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM2_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM2_BASEADDR, kPWM_Module_3, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

 

/* Sets up the PWM fault protection */

PWM_SetupFaults(PWM3_BASEADDR, kPWM_Fault_0, &faultConfig);

PWM_SetupFaults(PWM3_BASEADDR, kPWM_Fault_1, &faultConfig);

PWM_SetupFaults(PWM3_BASEADDR, kPWM_Fault_2, &faultConfig);

PWM_SetupFaults(PWM3_BASEADDR, kPWM_Fault_3, &faultConfig);

 

/* Set PWM fault disable mapping for submodule 0/1/2 */

PWM_SetupFaultDisableMap(PWM3_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM3_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM3_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM3_BASEADDR, kPWM_Module_3, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

 

/* Sets up the PWM fault protection */

PWM_SetupFaults(PWM4_BASEADDR, kPWM_Fault_0, &faultConfig);

PWM_SetupFaults(PWM4_BASEADDR, kPWM_Fault_1, &faultConfig);

PWM_SetupFaults(PWM4_BASEADDR, kPWM_Fault_2, &faultConfig);

PWM_SetupFaults(PWM4_BASEADDR, kPWM_Fault_3, &faultConfig);

 

/* Set PWM fault disable mapping for submodule 0/1/2 */

PWM_SetupFaultDisableMap(PWM4_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM4_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM4_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_SetupFaultDisableMap(PWM4_BASEADDR, kPWM_Module_3, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

 

 

/* Configure the capture input of the PWM for one shot polling */

captureConfig.captureInputSel = true;

captureConfig.edge0 = kPWM_RiseAndFallEdge;

captureConfig.edge1 = kPWM_Disable;

captureConfig.enableOneShotCapture = false;

captureConfig.edgeCompareValue = 1;

 

PWM_SetupInputCapture(PWM1_BASEADDR, kPWM_Module_3, kPWM_PwmA, &captureConfig);

PWM_SetupInputCapture(PWM2_BASEADDR, kPWM_Module_3, kPWM_PwmA, &captureConfig);

PWM_SetupInputCapture(PWM3_BASEADDR, kPWM_Module_1, kPWM_PwmA, &captureConfig);

PWM_SetupInputCapture(PWM4_BASEADDR, kPWM_Module_1, kPWM_PwmA, &captureConfig);

 

PWM_SetPwmLdok(PWM1_BASEADDR, kPWM_Control_Module_3, true);

PWM_SetPwmLdok(PWM2_BASEADDR, kPWM_Control_Module_3, true);

PWM_SetPwmLdok(PWM3_BASEADDR, kPWM_Control_Module_1, true);

PWM_SetPwmLdok(PWM4_BASEADDR, kPWM_Control_Module_1, true);

 

PWM_StartTimer(PWM1_BASEADDR, kPWM_Control_Module_3);

PWM_StartTimer(PWM2_BASEADDR, kPWM_Control_Module_3);

PWM_StartTimer(PWM3_BASEADDR, kPWM_Control_Module_1);

PWM_StartTimer(PWM4_BASEADDR, kPWM_Control_Module_1);

}

 

0 Kudos
Reply