| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include "fan_pwm.h"
- void fan_pwm_init(void){
- uint16_t chno = FAN_PWM_CHAN;
- /* -----------------------------------------------------------------------
- TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:
- TIMER1CLK = SystemCoreClock / 108 = 1MHz
- TIMER1 channel1 duty cycle = (4000/ 16000)* 100 = 25%
- TIMER1 channel2 duty cycle = (8000/ 16000)* 100 = 50%
- TIMER1 channel3 duty cycle = (12000/ 16000)* 100 = 75%
- ----------------------------------------------------------------------- */
- timer_oc_parameter_struct timer_ocintpara;
- timer_parameter_struct timer_initpara;
- rcu_periph_clock_enable(GPIO_FAN_OUT_RCU);
- rcu_periph_clock_enable(RCU_AF);
- /*Configure PA1 PA2 PA3(TIMER1 CH1 CH2 CH3) as alternate function*/
- gpio_init(GPIO_FAN_OUT_GROUP, GPIO_FAN_OUT_MODE, GPIO_OSPEED_50MHZ, GPIO_FAN_OUT_PIN);
-
- rcu_periph_clock_enable(FAN_TIMER_RCU);
- timer_deinit(FAN_PWM_TIMER);
- /* TIMER1 configuration 1M*/
- timer_initpara.prescaler = 119;
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.period = FAN_MAX_DUTY_COUNT;
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
- timer_initpara.repetitioncounter = 1;
- timer_init(FAN_PWM_TIMER,&timer_initpara);
- /* CH2 and CH3 configuration in PWM mode1 */
- timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
- timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
- timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_LOW;
- timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
- timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
- timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
- timer_channel_output_config(FAN_PWM_TIMER,chno,&timer_ocintpara);
- /* CH2 configuration in PWM mode1,duty cycle 46% */
- timer_channel_output_pulse_value_config(FAN_PWM_TIMER,chno,FAN_MAX_DUTY_COUNT-1);
- timer_channel_output_mode_config(FAN_PWM_TIMER,chno,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(FAN_PWM_TIMER,chno,TIMER_OC_SHADOW_ENABLE);
- /* auto-reload preload enable */
- timer_auto_reload_shadow_enable(FAN_PWM_TIMER);
- timer_enable(FAN_PWM_TIMER);
- }
- void fan_stop(void) {
- timer_disable(FAN_PWM_TIMER);
- }
- void fan_set_duty(u8 duty) {
- uint16_t chno = FAN_PWM_CHAN;
- if (duty > 100) {
- duty = 100;
- }else if (duty > 0 && duty < 30) {
- duty = 30;
- }
- u32 count = (float)duty * (float)FAN_MAX_DUTY_COUNT / 100.0f;
- timer_channel_output_pulse_value_config(FAN_PWM_TIMER,chno, count);
- if (count == 0) {
- timer_primary_output_config(FAN_PWM_TIMER,DISABLE);
- }else {
- timer_primary_output_config(FAN_PWM_TIMER,ENABLE);
- }
- }
- bool fan_pwm_is_running(void) {
- if (TIMER_CCHP(FAN_PWM_TIMER) & (uint32_t)TIMER_CCHP_POEN) {
- return true;
- }
- return false;
- }
|