KT25-1015_AC695x_SDK310/apps/kaotings/kt_fan_ac.c

199 lines
7.8 KiB
C
Raw Normal View History

2026-04-20 06:50:04 +00:00
#include "kt_fan_ac.h"
#include "asm/mcpwm.h"
#include "tone_player.h"
2026-04-24 08:03:25 +00:00
#include "kt_led7.h"
2026-04-20 06:50:04 +00:00
2026-04-24 08:03:25 +00:00
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; // 空调档位
2026-04-20 06:50:04 +00:00
} _kt_fan_ac_var;
static _kt_fan_ac_var kt_fan_ac_var;
2026-04-24 08:03:25 +00:00
#define __this (&kt_fan_ac_var)
2026-04-20 06:50:04 +00:00
2026-04-24 08:03:25 +00:00
const u32 fan_level_duty[7] = {0, 1500, 4000, 6000, 7000, 8000, 9500};
2026-04-20 06:50:04 +00:00
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};
2026-04-24 08:03:25 +00:00
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);
2026-04-20 06:50:04 +00:00
void kt_fan_ac_init(void)
{
2026-04-24 08:03:25 +00:00
// 50KHz
// 前风扇 PB5 TIMER3 硬件引脚
// 后风扇 PB6
// 左右风扇 PA10
// 空调 PA11
2026-04-20 06:50:04 +00:00
__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;
2026-04-24 08:03:25 +00:00
//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
2026-04-20 06:50:04 +00:00
}
void kt_fan_level_tone_play(kt_fan_type fan)
{
if (fan == fan_type_front)
{
2026-04-24 08:03:25 +00:00
char str[6] = {0};
sprintf(str, "L-%d", __this->front_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
2026-04-20 06:50:04 +00:00
tone_play(front_fan_level_tone[__this->front_fan_level], 0);
}
else if (fan == fan_type_rear)
{
2026-04-24 08:03:25 +00:00
char str[6] = {0};
sprintf(str, "F-%d", __this->rear_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
2026-04-20 06:50:04 +00:00
tone_play(rear_fan_level_tone[__this->rear_fan_level], 0);
}
else if (fan == fan_type_lr)
{
2026-04-24 08:03:25 +00:00
char str[6] = {0};
sprintf(str, "C-%d", __this->lr_fan_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
2026-04-20 06:50:04 +00:00
tone_play(lr_fan_level_tone[__this->lr_fan_level], 0);
}
else
{
2026-04-24 08:03:25 +00:00
char str[6] = {0};
sprintf(str, "AC%d", __this->ac_level);
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
2026-04-20 06:50:04 +00:00
tone_play(ac_level_tone[__this->ac_level], 0);
}
}
2026-04-24 08:03:25 +00:00
/*
void set_green_pwm_duty(u16 duty)
{
if(duty_temp0 == duty)
return;
duty_temp0 = duty;
2026-04-20 06:50:04 +00:00
2026-04-24 08:03:25 +00:00
mcpwm_set_duty(pwm_ch0, pwm_timer0, 10000-duty_temp0);
}
*/
2026-04-20 06:50:04 +00:00
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);
2026-04-24 08:03:25 +00:00
//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]);
2026-04-20 06:50:04 +00:00
}
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);
2026-04-24 08:03:25 +00:00
//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]);
2026-04-20 06:50:04 +00:00
}
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);
2026-04-24 08:03:25 +00:00
//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]);
2026-04-20 06:50:04 +00:00
}
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);
2026-04-24 08:03:25 +00:00
// set_timer_pwm_duty(JL_TIMER0, __this->ac_level * 1000);
2026-04-20 06:50:04 +00:00
}
}