| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include "user_fan.h"
- #include "define.h"
- #include "stdarg.h"
- static void left_fan_duty(uint16_t duty);
- static void right_fan_duty(uint16_t duty);
- static fan_work_s fan_work[2] = {
- {
- .idx = LEFT_IDX,
- .speed = 0,
- .set_duty = left_fan_duty,
- },
- {
- .idx = RIGHT_IDX,
- .speed = 0,
- .set_duty = right_fan_duty,
- },
- };
- /*******************************************************************************
- * @函数名称 fan_pwm_init
- * @函数说明 初始化
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void fan_pwm_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure={0};
- TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
- TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
- TIM_BDTRInitTypeDef BDTR_Structure;
- FAN_GPIO_RCC_ENABLE;
- GPIO_InitStructure.GPIO_Pin = LEFT_FAN_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(LEFT_FAN_GPIO, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = RIGHT_FAN_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(RIGHT_FAN_GPIO, &GPIO_InitStructure );
- FAN_PWM_RCC_ENABLE;
- #ifdef FAN_REMAPCONFIG_ENABLE
- FAN_REMAPCONFIG_ENABLE;
- #endif
-
- TIM_BaseInitStructure.TIM_Period = TIM_FAN_PERIOD;
- TIM_BaseInitStructure.TIM_Prescaler = TIM_FAN_PRESCALER - 1;
- TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
- TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM_IND_FAN,&TIM_BaseInitStructure);
- TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
- TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
- TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
- TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
- TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
- TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
- TIM_OutputCompareInitStructure.TIM_Pulse = 0;
- BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
- BDTR_Structure.TIM_Break = TIM_Break_Disable;
- BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
- BDTR_Structure.TIM_DeadTime = 0x80;
- BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
- BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
- BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
- TIM_BDTRConfig(TIM_IND_FAN,&BDTR_Structure);
- LEFT_FAN_INIT(&TIM_OutputCompareInitStructure);
- RIGHT_FAN_INIT(&TIM_OutputCompareInitStructure);
- LEFT_FAN_RUN;
- RIGHT_FAN_RUN;
- LEFT_FAN_COMPARE(0);
- RIGHT_FAN_COMPARE(0);
- TIM_Cmd(TIM_IND_FAN,ENABLE);
- }
- /*******************************************************************************
- * @函数名称 left_fan_duty
- * @函数说明 设置左风扇PWM百分比
- * @输入参数 duty:百分比
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void left_fan_duty(uint16_t duty)
- {
- uint16_t value = TIM_FAN_PERIOD * duty / 100;
- LEFT_FAN_COMPARE(value);
- }
- /*******************************************************************************
- * @函数名称 right_fan_duty
- * @函数说明 设置右边风扇PWM百分比
- * @输入参数 duty:百分比
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void right_fan_duty(uint16_t duty)
- {
- uint16_t value = TIM_FAN_PERIOD * duty / 100;
- RIGHT_FAN_COMPARE(value);
- }
- /*******************************************************************************
- * @函数名称 set_fan_indication
- * @函数说明 风扇转速设置
- * @输入参数 idx:左边或右边
- speed:转速百分比
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- bool set_fan_indication(uint8_t idx, uint8_t speed)
- {
- bool stat = false;
- if(idx != LEFT_IDX && idx != RIGHT_IDX)
- {
- goto exit;
- }
- if(speed > 100)
- {
- goto exit;
- }
- fan_work[idx].speed = speed;
- fan_work[idx].set_duty(speed);
- stat = true;
- exit:
- return stat;
- }
- /*******************************************************************************
- * @函数名称 fan_init
- * @函数说明 初始化
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void fan_init(void)
- {
- fan_pwm_init();
- }
|