feat: LEDB 红色呼吸灯 (PB23, PWM11)
- 新增 pwm_led_init(): 初始化 PWM11, f≈5.86kHz, 分辨率128级 - 新增四相呼吸状态机 (渐亮/高亮保持/渐灭/低亮保持), ~13.5s周期 - gpio_uart_init(): LEDB 从 GPIO 改为 PWM 控制 - LEDB_ON/OFF 宏保留备用 (不再用于呼吸控制) - 注: PB23 需在 ISP 烧录时关闭外部复位 (RB_CFG_RESET_EN=0)
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include <stdlib.h>
|
||||
#include "cmcng.h"
|
||||
#include "dbn_ble_srv.h"
|
||||
#include "CH59x_pwm.h"
|
||||
|
||||
|
||||
uint8_t g_flag_bt_state = 0; // 0 蓝牙没有连接,1 有蓝牙连接
|
||||
@@ -69,6 +70,23 @@ uint32_t g_sys_freq = 0;
|
||||
/* 光耦输入预留 (逻辑待定) */
|
||||
#define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10))
|
||||
|
||||
/*===========================================================================
|
||||
* LEDB 红色呼吸灯 (PB23, PWM11)
|
||||
* PWM freq ≈ 60MHz / (PWM_CLK_DIV * 128) ≈ 5.86kHz @DIV=80
|
||||
* 呼吸周期 ≈ (127*2*50ms) + 0.5s + 0.3s ≈ 13.5s
|
||||
*===========================================================================*/
|
||||
#define PWM_CLK_DIV 80
|
||||
#define PWM_CYCLE 128 // 7-bit 分辨率 (0~127)
|
||||
#define BREATH_STEP_DELAY 1 // 每 50ms 更新一次占空比 (步进平滑)
|
||||
#define BREATH_FADE_IN 0
|
||||
#define BREATH_HOLD_HIGH 1
|
||||
#define BREATH_FADE_OUT 2
|
||||
#define BREATH_HOLD_LOW 3
|
||||
|
||||
static uint8_t g_breath_phase = BREATH_FADE_IN;
|
||||
static uint8_t g_breath_duty = 0;
|
||||
static uint8_t g_breath_tick = 0;
|
||||
|
||||
const uint8_t MAX_Store_Size = 80;
|
||||
uint8_t g_loop_power_up_state = 0; // 开机启动时线圈是否连接
|
||||
uint8_t g_disconnect_active = 0; // 当前线圈是否断开中 (1=断开)
|
||||
@@ -368,11 +386,29 @@ void gpio_uart_init(void)
|
||||
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);
|
||||
RLY1_OFF;
|
||||
|
||||
/*--- 指示灯 (PB22=LEDA绿, PB23=LEDB红, 低电平有效) ---*/
|
||||
GPIOB_SetBits(GPIO_Pin_22 | GPIO_Pin_23);
|
||||
GPIOB_ModeCfg(GPIO_Pin_22 | GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
|
||||
/*--- LEDA 绿色 (PB22, GPIO, 低电平有效) ---*/
|
||||
GPIOB_SetBits(GPIO_Pin_22);
|
||||
GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA);
|
||||
LEDA_OFF;
|
||||
LEDB_OFF;
|
||||
|
||||
/*--- LEDB 红色 (PB23, PWM11, 呼吸灯) ---*/
|
||||
pwm_led_init();
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* pwm_led_init -- 初始化 LEDB (PB23) 红色呼吸灯 (PWM11)
|
||||
* PWM 频率 ≈ 60MHz / (80 * 128) ≈ 5.86kHz
|
||||
* 初始占空比 = 0 (LED 灭)
|
||||
* 注: PB23 需在 ISP 烧录时关闭外部复位功能 (RB_CFG_RESET_EN=0)
|
||||
*===========================================================================*/
|
||||
static void pwm_led_init(void)
|
||||
{
|
||||
GPIOB_SetBits(GPIO_Pin_23);
|
||||
GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
|
||||
|
||||
PWMX_CLKCfg(PWM_CLK_DIV);
|
||||
PWMX_CycleCfg(PWMX_Cycle_128); // 128 级占空比分辨率
|
||||
PWMX_ACTOUT(CH_PWM11, 0, Low_Level, ENABLE); // 初始 duty=0, LED 灭
|
||||
}
|
||||
|
||||
|
||||
@@ -1086,6 +1122,45 @@ void TMR1_IRQHandler(void)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*--- LEDB 红色呼吸灯 (PWM11, 50ms tick) ---*/
|
||||
g_breath_tick++;
|
||||
switch (g_breath_phase) {
|
||||
case BREATH_FADE_IN: // 渐亮 0 → max, 每300ms一步
|
||||
if (g_breath_tick >= BREATH_STEP_DELAY) {
|
||||
g_breath_tick = 0;
|
||||
g_breath_duty++;
|
||||
PWM11_ActDataWidth(g_breath_duty);
|
||||
if (g_breath_duty >= PWM_CYCLE - 1) {
|
||||
g_breath_phase = BREATH_HOLD_HIGH;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BREATH_HOLD_HIGH: // 最亮保持 ~0.5s
|
||||
if (g_breath_tick >= 10) {
|
||||
g_breath_phase = BREATH_FADE_OUT;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
break;
|
||||
case BREATH_FADE_OUT: // 渐灭 max → 0, 每300ms一步
|
||||
if (g_breath_tick >= BREATH_STEP_DELAY) {
|
||||
g_breath_tick = 0;
|
||||
g_breath_duty--;
|
||||
PWM11_ActDataWidth(g_breath_duty);
|
||||
if (g_breath_duty == 0) {
|
||||
g_breath_phase = BREATH_HOLD_LOW;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BREATH_HOLD_LOW: // 最暗保持 ~0.3s
|
||||
if (g_breath_tick >= 6) {
|
||||
g_breath_phase = BREATH_FADE_IN;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*--- 线圈载波检测 & 继电器输出刷新 (每 5ms) ---*/
|
||||
|
||||
Reference in New Issue
Block a user