fan_pwm.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "fan_pwm.h"
  2. void fan_pwm_init(void){
  3. tmr_output_config_type tmr_oc_init_structure;
  4. /* compute the div value */
  5. u16 div_value = (uint16_t)(system_core_clock / 1000000) - 1;
  6. /* tmr3 time base configuration */
  7. tmr_base_init(FAN_PWM_TIMER, FAN_MAX_DUTY_COUNT, div_value);
  8. tmr_cnt_dir_set(FAN_PWM_TIMER, TMR_COUNT_UP);
  9. tmr_clock_source_div_set(FAN_PWM_TIMER, TMR_CLOCK_DIV1);
  10. tmr_output_default_para_init(&tmr_oc_init_structure);
  11. tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  12. tmr_oc_init_structure.oc_idle_state = FALSE;
  13. tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  14. tmr_oc_init_structure.oc_output_state = TRUE;
  15. tmr_output_channel_config(FAN_PWM_TIMER, FAN_PWM_CHAN, &tmr_oc_init_structure);
  16. tmr_channel_value_set(FAN_PWM_TIMER, FAN_PWM_CHAN, FAN_MAX_DUTY_COUNT-1);
  17. tmr_output_channel_buffer_enable(FAN_PWM_TIMER, FAN_PWM_CHAN, TRUE);
  18. tmr_period_buffer_enable(FAN_PWM_TIMER, TRUE);
  19. tmr_output_enable(FAN_PWM_TIMER, FALSE);
  20. /* tmr enable counter */
  21. tmr_counter_enable(FAN_PWM_TIMER, TRUE);
  22. }
  23. void fan_stop(void) {
  24. tmr_counter_enable(FAN_PWM_TIMER, FALSE);
  25. }
  26. void fan_set_duty(u8 duty) {
  27. if (duty > 100) {
  28. duty = 100;
  29. }else if (duty > 0 && duty < 30) {
  30. duty = 30;
  31. }
  32. u32 count = (float)duty * (float)FAN_MAX_DUTY_COUNT / 100.0f;
  33. tmr_channel_value_set(FAN_PWM_TIMER,FAN_PWM_CHAN, count);
  34. if (count == 0) {
  35. tmr_output_enable(FAN_PWM_TIMER,FALSE);
  36. }else {
  37. tmr_output_enable(FAN_PWM_TIMER,TRUE);
  38. }
  39. }
  40. bool fan_pwm_is_running(void) {
  41. if (FAN_PWM_TIMER->ctrl1_bit.tmren == TRUE) {
  42. return true;
  43. }
  44. return false;
  45. }