fan_pwm.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "fan_pwm.h"
  2. void fan_pwm_init(void){
  3. uint16_t chno = FAN_PWM_CHAN;
  4. TIM_TimeBaseInitType TIM_TimeBaseStructure;
  5. OCInitType TIM_OCInitStructure;
  6. TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
  7. /* Time base configuration */
  8. TIM_TimeBaseStructure.Period = FAN_MAX_DUTY_COUNT;
  9. TIM_TimeBaseStructure.Prescaler = TIM_CLOCK_MHz - 1;
  10. TIM_TimeBaseStructure.ClkDiv = 0;
  11. TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;
  12. TIM_InitTimeBase(FAN_PWM_TIMER, &TIM_TimeBaseStructure);
  13. /* PWM1 Mode configuration: Channel1 */
  14. TIM_OCInitStructure.OcMode = TIM_OCMODE_PWM1;
  15. TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
  16. TIM_OCInitStructure.Pulse = FAN_MAX_DUTY_COUNT-1;
  17. TIM_OCInitStructure.OcPolarity = TIM_OC_POLARITY_HIGH;
  18. if (chno == TIM_CH_1) {
  19. TIM_InitOc1(FAN_PWM_TIMER, &TIM_OCInitStructure);
  20. }else if (chno == TIM_CH_2) {
  21. TIM_InitOc2(FAN_PWM_TIMER, &TIM_OCInitStructure);
  22. }else if (chno == TIM_CH_3) {
  23. TIM_InitOc3(FAN_PWM_TIMER, &TIM_OCInitStructure);
  24. }else if (chno == TIM_CH_4) {
  25. TIM_InitOc4(FAN_PWM_TIMER, &TIM_OCInitStructure);
  26. }
  27. TIM_ConfigOc1Preload(FAN_PWM_TIMER, TIM_OC_PRE_LOAD_ENABLE);
  28. TIM_ConfigArPreload(FAN_PWM_TIMER, ENABLE);
  29. /* TIM3 enable counter */
  30. TIM_Enable(FAN_PWM_TIMER, ENABLE);
  31. }
  32. void fan_stop(void) {
  33. TIM_Enable(FAN_PWM_TIMER, DISABLE);
  34. }
  35. void fan_set_duty(u8 duty) {
  36. uint16_t chno = FAN_PWM_CHAN;
  37. if (duty > 100) {
  38. duty = 100;
  39. }else if (duty > 0 && duty < 30) {
  40. duty = 30;
  41. }
  42. u32 count = (float)duty * (float)FAN_MAX_DUTY_COUNT / 100.0f;
  43. if (chno == TIM_CH_1) {
  44. TIM_SetCmp1(FAN_PWM_TIMER, count);
  45. }else if (chno == TIM_CH_2) {
  46. TIM_SetCmp2(FAN_PWM_TIMER, count);
  47. }else if (chno == TIM_CH_3) {
  48. TIM_SetCmp3(FAN_PWM_TIMER, count);
  49. }else if (chno == TIM_CH_4) {
  50. TIM_SetCmp4(FAN_PWM_TIMER, count);
  51. }
  52. if (FAN_PWM_TIMER == TIM8) {
  53. if (count == 0) {
  54. TIM_EnableCtrlPwmOutputs(FAN_PWM_TIMER, DISABLE);
  55. }else {
  56. TIM_EnableCtrlPwmOutputs(FAN_PWM_TIMER, ENABLE);
  57. }
  58. }
  59. }
  60. bool fan_pwm_is_running(void) {
  61. uint16_t chno = FAN_PWM_CHAN;
  62. u32 count = 0;
  63. if (chno == TIM_CH_1) {
  64. count = TIM_GetCap1(FAN_PWM_TIMER);
  65. }else if (chno == TIM_CH_2) {
  66. count = TIM_GetCap2(FAN_PWM_TIMER);
  67. }else if (chno == TIM_CH_3) {
  68. count = TIM_GetCap3(FAN_PWM_TIMER);
  69. }else if (chno == TIM_CH_4) {
  70. count = TIM_GetCap4(FAN_PWM_TIMER);
  71. }
  72. return (count != 0);
  73. }