KT25-1015_AC695x_SDK310/apps/kaotings/kt_fan_ac.c
2026-04-24 16:03:25 +08:00

199 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "kt_fan_ac.h"
#include "asm/mcpwm.h"
#include "tone_player.h"
#include "kt_led7.h"
typedef struct _kt_fan_ac_var_
{
kt_fan_level_type front_fan_level; // 前风扇档位
kt_fan_level_type rear_fan_level; // 后风扇档位
kt_fan_level_type lr_fan_level; // 左右风扇档位
kt_ac_level_type ac_level; // 空调档位
} _kt_fan_ac_var;
static _kt_fan_ac_var kt_fan_ac_var;
#define __this (&kt_fan_ac_var)
const u32 fan_level_duty[7] = {0, 1500, 4000, 6000, 7000, 8000, 9500};
const u32 ac_level_duty[3] = {0, 1500, 8000};
const char *front_fan_level_tone[7] = {TONE_FFAN_L0, TONE_FFAN_L1, TONE_FFAN_L2, TONE_FFAN_L3, TONE_FFAN_L4, TONE_FFAN_L5, TONE_FFAN_L6};
const char *rear_fan_level_tone[7] = {TONE_BFAN_L0, TONE_BFAN_L1, TONE_BFAN_L2, TONE_BFAN_L3, TONE_BFAN_L4, TONE_BFAN_L5, TONE_BFAN_L6};
const char *lr_fan_level_tone[7] = {TONE_CFAN_L0, TONE_CFAN_L1, TONE_CFAN_L2, TONE_CFAN_L3, TONE_CFAN_L4, TONE_CFAN_L5, TONE_CFAN_L6};
const char *ac_level_tone[3] = {TONE_AC_L0, TONE_AC_L1, TONE_AC_L2};
extern void mcpwm_init(struct pwm_platform_data *arg);
extern void mcpwm_set_duty(pwm_ch_num_type pwm_ch, pwm_timer_num_type timer_ch, u16 duty);
void kt_fan_ac_init(void)
{
// 50KHz
// 前风扇 PB5 TIMER3 硬件引脚
// 后风扇 PB6
// 左右风扇 PA10
// 空调 PA11
__this->front_fan_level = fan_level_0;
__this->rear_fan_level = fan_level_0;
__this->lr_fan_level = fan_level_0;
__this->ac_level = ac_level_0;
//timer_pwm_init(JL_TIMER2, 50000, 0, IO_PORTB_05, CH1_T2_PWM_OUT); // 前风扇
//timer_pwm_init(JL_TIMER3, 50000, 0, IO_PORTB_06, CH2_T3_PWM_OUT); // 后风扇
// timer_pwm_init(JL_TIMER0, 50000, 0, IO_PORTA_10, CH0_T3_PWM_OUT); // 左右风扇
// timer_pwm_init(JL_TIMER0, 50000, 0, IO_PORTA_11, CH0_T0_PWM_OUT); //空调
struct pwm_platform_data pwm_p_data;
// CH0
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned; // 边沿对齐
pwm_p_data.frequency = 50000; // 1KHz
pwm_p_data.pwm_ch_num = pwm_ch0; // 通道0
pwm_p_data.pwm_timer_num = pwm_timer0; // 时基选择通道0
pwm_p_data.duty = 0; // 占空比50%
// hw
pwm_p_data.h_pin = IO_PORTB_05; // 没有则填 -1。h_pin_output_ch_num无效可不配置
pwm_p_data.l_pin = -1; // 硬件引脚l_pin_output_ch_num无效可不配置
// output_channel
pwm_p_data.h_pin_output_ch_num = 0; //output channel0 /* */
pwm_p_data.complementary_en = 1; // 两个引脚的波形, 1: 互补, 0: 同步;
mcpwm_init(&pwm_p_data);
#if 1
//CH1
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned; //边沿对齐
pwm_p_data.frequency = 50000; //1KHz
pwm_p_data.pwm_ch_num = pwm_ch1; //通道0
pwm_p_data.pwm_timer_num = pwm_timer1; //时基选择通道0
pwm_p_data.duty = 0; //占空比50%
//hw
pwm_p_data.h_pin = IO_PORTB_06; //没有则填 -1。h_pin_output_ch_num无效可不配置
pwm_p_data.l_pin = -1;
pwm_p_data.h_pin_output_ch_num = 1; //output channel0 /* */
pwm_p_data.complementary_en = 1; //两个引脚的波形同步
mcpwm_init(&pwm_p_data);
// #else
//CH2
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned; //边沿对齐
pwm_p_data.frequency = 50000; //1KHz
pwm_p_data.pwm_ch_num = pwm_ch2; //通道0
pwm_p_data.pwm_timer_num = pwm_timer2; //时基选择通道0
pwm_p_data.duty = 0; //占空比50%
//hw
pwm_p_data.h_pin = IO_PORTA_10;
pwm_p_data.l_pin = -1; //没有则填 -1。h_pin_output_ch_num无效可不配置
//output_channel
/* pwm_p_data.h_pin = IO_PORTB_05; //没有则填 -1。h_pin_output_ch_num无效可不配置 */
pwm_p_data.h_pin_output_ch_num = 2; //output channel0 /* */
pwm_p_data.complementary_en = 1; //两个引脚的波形同步
mcpwm_init(&pwm_p_data);
/* //CH3
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned; //边沿对齐
pwm_p_data.frequency = 100000; //1KHz
pwm_p_data.pwm_ch_num = pwm_ch4; //通道0
pwm_p_data.pwm_timer_num = pwm_timer4; //时基选择通道0
pwm_p_data.duty = 4000; //占空比40%
//hw
pwm_p_data.h_pin = IO_PORTA_11; //没有则填 -1。h_pin_output_ch_num无效可不配置
//output_channel
pwm_p_data.h_pin_output_ch_num = 1; //output channel0
//hw
pwm_p_data.l_pin = -1; //硬件引脚l_pin_output_ch_num无效可不配置
pwm_p_data.complementary_en = 1; //两个引脚的波形互补
mcpwm_init(&pwm_p_data); */
//timer_pwm_init(JL_TIMER3, 100000, 4000, IO_PORTA_11, CH2_CH2_PWM_L); // 空调
#endif
}
void kt_fan_level_tone_play(kt_fan_type fan)
{
if (fan == fan_type_front)
{
char str[6] = {0};
sprintf(str, "L-%d", __this->front_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
tone_play(front_fan_level_tone[__this->front_fan_level], 0);
}
else if (fan == fan_type_rear)
{
char str[6] = {0};
sprintf(str, "F-%d", __this->rear_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
tone_play(rear_fan_level_tone[__this->rear_fan_level], 0);
}
else if (fan == fan_type_lr)
{
char str[6] = {0};
sprintf(str, "C-%d", __this->lr_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
tone_play(lr_fan_level_tone[__this->lr_fan_level], 0);
}
else
{
char str[6] = {0};
sprintf(str, "AC%d", __this->ac_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
tone_play(ac_level_tone[__this->ac_level], 0);
}
}
/*
void set_green_pwm_duty(u16 duty)
{
if(duty_temp0 == duty)
return;
duty_temp0 = duty;
mcpwm_set_duty(pwm_ch0, pwm_timer0, 10000-duty_temp0);
}
*/
void kt_fan_level_change(kt_fan_type fan)
{
if (fan == fan_type_front)
{
__this->front_fan_level++;
if (__this->front_fan_level > fan_level_6)
{
__this->front_fan_level = fan_level_0;
}
kt_fan_level_tone_play(fan_type_front);
//set_timer_pwm_duty(JL_TIMER2, fan_level_duty[__this->front_fan_level]);
mcpwm_set_duty(pwm_ch0, pwm_timer0, fan_level_duty[__this->front_fan_level]);
}
else if (fan == fan_type_rear)
{
__this->rear_fan_level++;
if (__this->rear_fan_level > fan_level_6)
{
__this->rear_fan_level = fan_level_0;
}
kt_fan_level_tone_play(fan_type_rear);
//set_timer_pwm_duty(JL_TIMER3, fan_level_duty[__this->rear_fan_level]);
mcpwm_set_duty(pwm_ch1, pwm_timer1, fan_level_duty[__this->rear_fan_level]);
}
else if (fan == fan_type_lr)
{
__this->lr_fan_level++;
if (__this->lr_fan_level > fan_level_6)
{
__this->lr_fan_level = fan_level_0;
}
kt_fan_level_tone_play(fan_type_lr);
//set_timer_pwm_duty(JL_TIMER0, fan_level_duty[__this->lr_fan_level]);
mcpwm_set_duty(pwm_ch2, pwm_timer2, fan_level_duty[__this->lr_fan_level]);
}
else
{
__this->ac_level++;
if (__this->ac_level > ac_level_2)
{
__this->ac_level = ac_level_0;
}
kt_fan_level_tone_play(fan_type_ac);
// set_timer_pwm_duty(JL_TIMER0, __this->ac_level * 1000);
}
}