Changing FTM_PWM period and duty cycle

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

Changing FTM_PWM period and duty cycle

2,156 Views
bartezz32
Contributor I

I'm using S32K148 with FTM_PWM and OSIF modules in Processor Expert. I want to update PWM period from 1Hz to 4Hz.
When 1Hz 50% duty cycle signal using "FTM_DRV_UpdatePwmChannel()" is generated everything looks good:

FTM_DRV_UpdatePwmChannel.PNG

 

After delay for 2 seconds (from OSIF module - "OSIF_TimeDelay()") and PWM period update to 4Hz using "FTM_DRV_UpdatePwmPeriod()" period is not changed and signal is not generated anymore:

FTM_DRV_UpdatePwmPeriod_2sec_OSIF_Delay.PNG
Calling again "FTM_DRV_UpdatePwmChannel()" after "FTM_DRV_UpdatePwmPeriod()" not show any change.

My FTM_PWM configuration in Processor Expert:

flexTimer_pwm1_Configuration.PNGflexTimer_pwm1_Initialization.PNG
Example code in main.c:

bartezz32_1-1615981426353.png

What cause a problem? Do I need manually change value in registers, instead of PE configuration?

0 Kudos
Reply
5 Replies

2,043 Views
bartezz32
Contributor I

Hello, 

This code works, but I have another question.
Is it possible in "Next Loading Point" sync mode to find a reload opportunity after period update in faster way? In pictures below a red signal show the moment when Period and Duty Cycle update methods are called, but generating signal with new period value is done later. Red signal is generated using GPIO pin connected to another port in the board.  

FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 500, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 1000, true);
PINS_DRV_WritePin(PTD, 17, 1);
OSIF_TimeDelay(980);
PINS_DRV_WritePin(PTD, 17, 0);
FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 125, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 250, true);
PINS_DRV_WritePin(PTD, 17, 1);

 

1.PNG

 

2.PNG

Depending on value in OSIF_TimeDelay() the update is done different moments (red line goes from 1 to 0 and back to 1). But signal is changed later (at next reload opportunity). 
In immediate reload is done instantly. Like in this pictures bellow
immediate.PNG

 

immediate_2.PNG

I was trying to call a methods: 

FTM_DRV_SetHalfCycleCmd(FTM0, true);
FTM_DRV_SetHalfCycleReloadPoint(INST_FLEXTIMER_PWM1, 500, false);

Between FTM_DRV_Init() and FTM_DRV_InitPwm(), but nothing happens. Is it even possible to find a faster reload opportunity, because now reload opportunity is delayed?

 

 

0 Kudos
Reply

2,011 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hello @bartezz32,

Please try this:

FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 500, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 1000, true);

OSIF_TimeDelay(2000);

FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 125, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 250, false);

FTM_DRV_SetHalfCycleReloadPoint(INST_FLEXTIMER_PWM1, 500, true);

OSIF_TimeDelay(2000);

 

The two functions UpdatePWMChannel() and UpdatePWMPeriod() do not trigger the synchronization but the SetHalfCycleReloadPoint() does. 

 

Regards,

Daniel

0 Kudos
Reply

2,129 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi,

Can you attach the project do that I can test it?

 

BR, Daniel

0 Kudos
Reply

2,126 Views
bartezz32
Contributor I

When sync point (in Processor Expert) is changed from "Next Loading Point" to "Immediate" signal is generated in proper way. If I'm using "Next Loading Point" I need to change something more in registers to work as it should?Sync_Point_Immediate.PNG

 

0 Kudos
Reply

2,069 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi,

Sorry for the delayed response.

I tested the code and it updates the C1V register to a higher number than the value in the MOD register.

Can you use something like this instead?

FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 500, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 1000, true);

OSIF_TimeDelay(2000);

FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM1, 1U, FTM_PWM_UPDATE_IN_TICKS, 125, 0U, false);
FTM_DRV_UpdatePwmPeriod(INST_FLEXTIMER_PWM1, FTM_PWM_UPDATE_IN_TICKS, 250, true);

 

Thanks,

Daniel

0 Kudos
Reply