user_fan.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "user_fan.h"
  2. #include "define.h"
  3. #include "stdarg.h"
  4. static void left_fan_duty(uint16_t duty);
  5. static void right_fan_duty(uint16_t duty);
  6. static fan_work_s fan_work[2] = {
  7. {
  8. .idx = LEFT_IDX,
  9. .speed = 0,
  10. .set_duty = left_fan_duty,
  11. },
  12. {
  13. .idx = RIGHT_IDX,
  14. .speed = 0,
  15. .set_duty = right_fan_duty,
  16. },
  17. };
  18. /*******************************************************************************
  19. * @函数名称 fan_pwm_init
  20. * @函数说明 初始化
  21. * @输入参数 无
  22. * @输出参数 无
  23. * @返回参数 无
  24. *******************************************************************************/
  25. static void fan_pwm_init(void)
  26. {
  27. GPIO_InitTypeDef GPIO_InitStructure={0};
  28. TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  29. TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
  30. TIM_BDTRInitTypeDef BDTR_Structure;
  31. FAN_GPIO_RCC_ENABLE;
  32. GPIO_InitStructure.GPIO_Pin = LEFT_FAN_PIN;
  33. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  34. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35. GPIO_Init(LEFT_FAN_GPIO, &GPIO_InitStructure );
  36. GPIO_InitStructure.GPIO_Pin = RIGHT_FAN_PIN;
  37. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  38. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  39. GPIO_Init(RIGHT_FAN_GPIO, &GPIO_InitStructure );
  40. FAN_PWM_RCC_ENABLE;
  41. #ifdef FAN_REMAPCONFIG_ENABLE
  42. FAN_REMAPCONFIG_ENABLE;
  43. #endif
  44. TIM_BaseInitStructure.TIM_Period = TIM_FAN_PERIOD;
  45. TIM_BaseInitStructure.TIM_Prescaler = TIM_FAN_PRESCALER - 1;
  46. TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
  47. TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  48. TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
  49. TIM_TimeBaseInit(TIM_IND_FAN,&TIM_BaseInitStructure);
  50. TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
  51. TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  52. TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
  53. TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  54. TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  55. TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  56. TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  57. TIM_OutputCompareInitStructure.TIM_Pulse = 0;
  58. BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  59. BDTR_Structure.TIM_Break = TIM_Break_Disable;
  60. BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  61. BDTR_Structure.TIM_DeadTime = 0x80;
  62. BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  63. BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
  64. BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
  65. TIM_BDTRConfig(TIM_IND_FAN,&BDTR_Structure);
  66. LEFT_FAN_INIT(&TIM_OutputCompareInitStructure);
  67. RIGHT_FAN_INIT(&TIM_OutputCompareInitStructure);
  68. LEFT_FAN_RUN;
  69. RIGHT_FAN_RUN;
  70. LEFT_FAN_COMPARE(0);
  71. RIGHT_FAN_COMPARE(0);
  72. TIM_Cmd(TIM_IND_FAN,ENABLE);
  73. }
  74. /*******************************************************************************
  75. * @函数名称 left_fan_duty
  76. * @函数说明 设置左风扇PWM百分比
  77. * @输入参数 duty:百分比
  78. * @输出参数 无
  79. * @返回参数 无
  80. *******************************************************************************/
  81. static void left_fan_duty(uint16_t duty)
  82. {
  83. uint16_t value = TIM_FAN_PERIOD * duty / 100;
  84. LEFT_FAN_COMPARE(value);
  85. }
  86. /*******************************************************************************
  87. * @函数名称 right_fan_duty
  88. * @函数说明 设置右边风扇PWM百分比
  89. * @输入参数 duty:百分比
  90. * @输出参数 无
  91. * @返回参数 无
  92. *******************************************************************************/
  93. static void right_fan_duty(uint16_t duty)
  94. {
  95. uint16_t value = TIM_FAN_PERIOD * duty / 100;
  96. RIGHT_FAN_COMPARE(value);
  97. }
  98. /*******************************************************************************
  99. * @函数名称 set_fan_indication
  100. * @函数说明 风扇转速设置
  101. * @输入参数 idx:左边或右边
  102. speed:转速百分比
  103. * @输出参数 无
  104. * @返回参数 无
  105. *******************************************************************************/
  106. bool set_fan_indication(uint8_t idx, uint8_t speed)
  107. {
  108. bool stat = false;
  109. if(idx != LEFT_IDX && idx != RIGHT_IDX)
  110. {
  111. goto exit;
  112. }
  113. if(speed > 100)
  114. {
  115. goto exit;
  116. }
  117. fan_work[idx].speed = speed;
  118. fan_work[idx].set_duty(speed);
  119. stat = true;
  120. exit:
  121. return stat;
  122. }
  123. /*******************************************************************************
  124. * @函数名称 fan_init
  125. * @函数说明 初始化
  126. * @输入参数 无
  127. * @输出参数 无
  128. * @返回参数 无
  129. *******************************************************************************/
  130. void fan_init(void)
  131. {
  132. fan_pwm_init();
  133. }