TM_PWM_Result_t TM_PWM_SetChannelPercent(TIM_TypeDef* TIMx, TM_PWM_TIM_t* TIM_Data, TM_PWM_Channel_t Channel, float percent) { if (percent > 100) { return TM_PWM_SetChannel(TIMx, TIM_Data, Channel, TIM_Data->Period); } else if (percent <= 0) { return TM_PWM_SetChannel(TIMx, TIM_Data, Channel, 0); } return TM_PWM_SetChannel(TIMx, TIM_Data, Channel, (uint32_t)((float)(TIM_Data->Period - 1) * percent) / 100); }
int main(void) { TM_PWM_TIM_t TIM4_Data, TIM2_Data; /* Initialize system */ SystemInit(); /* STM32F4-Discovery LEDS start */ /* Leds on PD12, PD13, PD14, PD15 */ /* Set PWM to 1kHz frequency on timer TIM4 */ /* 1 kHz = 1ms = 1000us */ TM_PWM_InitTimer(TIM4, &TIM4_Data, 1000); /* Initialize PWM on TIM4, Channel 1 and PinsPack 2 = PD12 */ TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_1, TM_PWM_PinsPack_2); /* Initialize PWM on TIM4, Channel 2 and PinsPack 2 = PD13 */ TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_2, TM_PWM_PinsPack_2); /* Initialize PWM on TIM4, Channel 3 and PinsPack 2 = PD14 */ TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_3, TM_PWM_PinsPack_2); /* Initialize PWM on TIM4, Channel 4 and PinsPack 2 = PD15 */ TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_4, TM_PWM_PinsPack_2); /* Set channel 1 value, 50% duty cycle */ TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_1, TIM4_Data.Period / 2); /* Set channel 2 value, 33% duty cycle */ TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_2, TIM4_Data.Period / 3); /* Set channel 3 value, 25% duty cycle */ TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_3, TIM4_Data.Period / 4); /* Set channel 4 value, 5% duty cycle*/ TM_PWM_SetChannelPercent(&TIM4_Data, TM_PWM_Channel_4, 5); /* STM32F4-Discovery LEDS stop */ /* Nucleo F4(0/1)1-RE LED start */ /* Led connected to PA5 */ /* Set PWM to 1kHz frequency on timer TIM2 */ /* 1 kHz = 1ms = 1000us */ TM_PWM_InitTimer(TIM2, &TIM2_Data, 1000); /* Initialize PWM on TIM2, Channel 1 and PinsPack 2 = PA5 */ TM_PWM_InitChannel(&TIM2_Data, TM_PWM_Channel_1, TM_PWM_PinsPack_2); /* Set channel 1 value, 500us pulse high = 500 / 1000 = 0.5 = 50% duty cycle */ TM_PWM_SetChannelMicros(&TIM2_Data, TM_PWM_Channel_1, 10); /* Nucleo F4(0/1)1-RE LED stop */ while (1) { } }
TM_PWM_Result_t TM_PWM_SetChannelMicros(TM_PWM_TIM_t* TIM_Data, TM_PWM_Channel_t Channel, uint32_t micros) { /* If we choose too much micro seconds that we have valid */ if (micros > TIM_Data->Micros) { /* Too high pulse */ return TM_PWM_Result_PulseTooHigh; } /* Set PWM channel */ return TM_PWM_SetChannel(TIM_Data, Channel, (uint32_t)((TIM_Data->Period - 1) * micros) / TIM_Data->Micros); }
TM_PWM_Result_t TM_PWM_SetChannelMicros(TIM_TypeDef* TIMx, TM_PWM_TIM_t* TIM_Data, TM_PWM_Channel_t Channel, uint32_t micros) { if (micros > TIM_Data->Micros) { return TM_PWM_Result_PulseTooHigh; } return TM_PWM_SetChannel(TIMx, TIM_Data, Channel, (uint32_t)((TIM_Data->Period - 1) * micros) / TIM_Data->Micros); }