修改空调PWM问题

This commit is contained in:
flym 2026-05-20 15:00:27 +08:00
parent ee5fcf0ad2
commit b3a97e0a7e
9 changed files with 30409 additions and 30323 deletions

View File

@ -1,5 +1,6 @@
#include "kt_fan_ac.h" #include "kt_fan_ac.h"
#include "asm/mcpwm.h" #include "asm/mcpwm.h"
#include "system/timer.h"
#include "tone_player.h" #include "tone_player.h"
#include "kt_led7.h" #include "kt_led7.h"
@ -14,8 +15,18 @@ typedef struct _kt_fan_ac_var_
static _kt_fan_ac_var kt_fan_ac_var; static _kt_fan_ac_var kt_fan_ac_var;
#define __this (&kt_fan_ac_var) #define __this (&kt_fan_ac_var)
#define KT_FAN_PWM_FREQ 50000
#define KT_AC_PWM_FREQ 100000
#define KT_AC_RUN_DUTY 4000 /* 空调运行占空比 40% */
#define KT_AC_BURST_MS 1000 /* AC1 断续1s 开 / 1s 关 */
/* 1: 上电即输出不同占空比,便于示波器/万用表区分各路;量产改 0 */
#define KT_PWM_BOOT_TEST_EN 1
const u32 fan_level_duty[7] = {0, 1500, 4000, 6000, 7000, 8000, 9500}; const u32 fan_level_duty[7] = {0, 1500, 4000, 6000, 7000, 8000, 9500};
const u32 ac_level_duty[3] = {0, 1500, 8000};
static u16 ac_burst_timer;
static u8 ac_burst_pwm_on;
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 *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 *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};
@ -25,87 +36,121 @@ 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_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); extern void mcpwm_set_duty(pwm_ch_num_type pwm_ch, pwm_timer_num_type timer_ch, u16 duty);
static void kt_ac_burst_stop(void)
{
if (ac_burst_timer) {
sys_timer_del(ac_burst_timer);
ac_burst_timer = 0;
}
}
static void kt_ac_pwm_output(u16 duty)
{
set_timer_pwm_duty(JL_TIMER0, duty);
}
static void kt_ac_burst_cb(void *priv)
{
(void)priv;
if (__this->ac_level != ac_level_1) {
return;
}
ac_burst_pwm_on = !ac_burst_pwm_on;
kt_ac_pwm_output(ac_burst_pwm_on ? KT_AC_RUN_DUTY : 0);
}
static void kt_ac_apply_mode(void)
{
kt_ac_burst_stop();
switch (__this->ac_level) {
case ac_level_0:
ac_burst_pwm_on = 0;
kt_ac_pwm_output(0);
break;
case ac_level_1:
ac_burst_pwm_on = 1;
kt_ac_pwm_output(KT_AC_RUN_DUTY);
ac_burst_timer = sys_timer_add(NULL, kt_ac_burst_cb, KT_AC_BURST_MS);
break;
case ac_level_2:
ac_burst_pwm_on = 1;
kt_ac_pwm_output(KT_AC_RUN_DUTY);
break;
default:
ac_burst_pwm_on = 0;
kt_ac_pwm_output(0);
break;
}
}
void kt_fan_ac_init(void) void kt_fan_ac_init(void)
{ {
// 50KHz /*
// 前风扇 PB5 TIMER3 硬件引脚 * PB5 : MCPWM CH0 + output_channel 0
// 后风扇 PB6 * PB6 : MCPWM CH2 L
// 左右风扇 PA10 * PA10: MCPWM CH4 L
// 空调 PA11 * PA11 : Timer0 + CH0_T0_PWM_OUTCH3 output_channel
*/
#if KT_PWM_BOOT_TEST_EN
/* 前15% / 后40% / 左右60% / 空调80%,上电即可区分四路 */
__this->front_fan_level = fan_level_1;
__this->rear_fan_level = fan_level_2;
__this->lr_fan_level = fan_level_3;
__this->ac_level = ac_level_2;
#else
__this->front_fan_level = fan_level_0; __this->front_fan_level = fan_level_0;
__this->rear_fan_level = fan_level_0; __this->rear_fan_level = fan_level_0;
__this->lr_fan_level = fan_level_0; __this->lr_fan_level = fan_level_0;
__this->ac_level = ac_level_0; __this->ac_level = ac_level_0;
#endif
//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; 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 /* 前风扇 PB5 */
pwm_p_data.pwm_timer_num = pwm_timer0; // 时基选择通道0 pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
pwm_p_data.duty = 0; // 占空比50% pwm_p_data.frequency = KT_FAN_PWM_FREQ;
// hw pwm_p_data.pwm_ch_num = pwm_ch0;
pwm_p_data.h_pin = IO_PORTB_05; // 没有则填 -1。h_pin_output_ch_num无效可不配置 pwm_p_data.pwm_timer_num = pwm_timer0;
pwm_p_data.l_pin = -1; // 硬件引脚l_pin_output_ch_num无效可不配置 pwm_p_data.duty = fan_level_duty[__this->front_fan_level];
// output_channel pwm_p_data.h_pin = KT_CFG_FRONT_FAN_PIN;
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.l_pin = -1;
pwm_p_data.h_pin_output_ch_num = 1; //output channel0 /* */ pwm_p_data.h_pin_output_ch_num = 0;
pwm_p_data.complementary_en = 1; //两个引脚的波形同步 pwm_p_data.complementary_en = 0;
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); mcpwm_init(&pwm_p_data);
/* //CH3 /* 后风扇 PB6 */
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned; //边沿对齐 pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
pwm_p_data.frequency = 100000; //1KHz pwm_p_data.frequency = KT_FAN_PWM_FREQ;
pwm_p_data.pwm_ch_num = pwm_ch2;
pwm_p_data.pwm_timer_num = pwm_timer2;
pwm_p_data.duty = fan_level_duty[__this->rear_fan_level];
pwm_p_data.h_pin = -1;
pwm_p_data.l_pin = KT_CFG_REAR_FAN_PIN;
pwm_p_data.complementary_en = 0;
mcpwm_init(&pwm_p_data);
pwm_p_data.pwm_ch_num = pwm_ch4; //通道0 /* 左右风扇 PA10 */
pwm_p_data.pwm_timer_num = pwm_timer4; //时基选择通道0 pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
pwm_p_data.duty = 4000; //占空比40% pwm_p_data.frequency = KT_FAN_PWM_FREQ;
//hw pwm_p_data.pwm_ch_num = pwm_ch4;
pwm_p_data.h_pin = IO_PORTA_11; //没有则填 -1。h_pin_output_ch_num无效可不配置 pwm_p_data.pwm_timer_num = pwm_timer4;
//output_channel pwm_p_data.duty = fan_level_duty[__this->lr_fan_level];
pwm_p_data.h_pin_output_ch_num = 1; //output channel0 pwm_p_data.h_pin = -1;
//hw pwm_p_data.l_pin = KT_CFG_LR_FAN_PIN;
pwm_p_data.l_pin = -1; //硬件引脚l_pin_output_ch_num无效可不配置 pwm_p_data.complementary_en = 0;
pwm_p_data.complementary_en = 1; //两个引脚的波形互补 mcpwm_init(&pwm_p_data);
mcpwm_init(&pwm_p_data); */
//timer_pwm_init(JL_TIMER3, 100000, 4000, IO_PORTA_11, CH2_CH2_PWM_L); // 空调 /* 空调 PA11 */
timer_pwm_init(JL_TIMER0, KT_AC_PWM_FREQ, 0, KT_CFG_AIR_COND_PIN, CH0_T0_PWM_OUT);
kt_ac_apply_mode();
#if KT_PWM_BOOT_TEST_EN
printf("PWM boot test: PB5=%u%% PB6=%u%% PA10=%u%% PA11=AC%d\n",
fan_level_duty[__this->front_fan_level] / 100,
fan_level_duty[__this->rear_fan_level] / 100,
fan_level_duty[__this->lr_fan_level] / 100,
__this->ac_level);
#endif #endif
} }
@ -140,16 +185,6 @@ void kt_fan_level_tone_play(kt_fan_type fan)
tone_play(ac_level_tone[__this->ac_level], 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) void kt_fan_level_change(kt_fan_type fan)
{ {
@ -161,7 +196,6 @@ void kt_fan_level_change(kt_fan_type fan)
__this->front_fan_level = fan_level_0; __this->front_fan_level = fan_level_0;
} }
kt_fan_level_tone_play(fan_type_front); 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]); mcpwm_set_duty(pwm_ch0, pwm_timer0, fan_level_duty[__this->front_fan_level]);
} }
else if (fan == fan_type_rear) else if (fan == fan_type_rear)
@ -172,8 +206,7 @@ void kt_fan_level_change(kt_fan_type fan)
__this->rear_fan_level = fan_level_0; __this->rear_fan_level = fan_level_0;
} }
kt_fan_level_tone_play(fan_type_rear); 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_ch2, pwm_timer2, 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) else if (fan == fan_type_lr)
{ {
@ -183,8 +216,7 @@ void kt_fan_level_change(kt_fan_type fan)
__this->lr_fan_level = fan_level_0; __this->lr_fan_level = fan_level_0;
} }
kt_fan_level_tone_play(fan_type_lr); 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_ch4, pwm_timer4, fan_level_duty[__this->lr_fan_level]);
mcpwm_set_duty(pwm_ch2, pwm_timer2, fan_level_duty[__this->lr_fan_level]);
} }
else else
{ {
@ -194,6 +226,6 @@ void kt_fan_level_change(kt_fan_type fan)
__this->ac_level = ac_level_0; __this->ac_level = ac_level_0;
} }
kt_fan_level_tone_play(fan_type_ac); kt_fan_level_tone_play(fan_type_ac);
// set_timer_pwm_duty(JL_TIMER0, __this->ac_level * 1000); kt_ac_apply_mode();
} }
} }

Binary file not shown.

View File

@ -1726,14 +1726,18 @@ objs/apps/kaotings/kt_led7.c.o
objs/apps/kaotings/kt_fan_ac.c.o objs/apps/kaotings/kt_fan_ac.c.o
-r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_ac_init,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_ac_init,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,mcpwm_init,l -r=objs/apps/kaotings/kt_fan_ac.c.o,mcpwm_init,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,timer_pwm_init,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,printf,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_level_tone_play,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_level_tone_play,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,sprintf,l -r=objs/apps/kaotings/kt_fan_ac.c.o,sprintf,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,kt_led7_show_string,l -r=objs/apps/kaotings/kt_fan_ac.c.o,kt_led7_show_string,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,tone_play,l -r=objs/apps/kaotings/kt_fan_ac.c.o,tone_play,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_level_change,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,kt_fan_level_change,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,mcpwm_set_duty,l -r=objs/apps/kaotings/kt_fan_ac.c.o,mcpwm_set_duty,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,sys_timer_add,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,sys_timer_del,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,set_timer_pwm_duty,l
-r=objs/apps/kaotings/kt_fan_ac.c.o,fan_level_duty,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,fan_level_duty,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,ac_level_duty,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,front_fan_level_tone,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,front_fan_level_tone,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,rear_fan_level_tone,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,rear_fan_level_tone,pl
-r=objs/apps/kaotings/kt_fan_ac.c.o,lr_fan_level_tone,pl -r=objs/apps/kaotings/kt_fan_ac.c.o,lr_fan_level_tone,pl

File diff suppressed because it is too large Load Diff