123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #include "main.h"
- #include "led.h"
- // 定义两个灯的控制器
- //LEDControl_t led_green = {GPIOB, LED_GREEN_Pin, 1000, 0, 1}; // 默认1秒闪一次
- //LEDControl_t led_red = {GPIOB, LED_RED_Pin, 0, 0, 0}; // 默认不闪
- LEDControl_t led_red = {
- .GPIOx = LED2_R_GPIO_PORT,
- .GPIO_Pin = LED2_R_PIN,
- .enabled = 0,
- .flash_interval_ms = 0,
- .counter = 0,
- .flash_times = 0,
- .current_flash_count = 0,
- .flash_pause_ms = 0,
- .pause_counter = 0,
- .in_pause = 0,
- .pin_state = 0
- };
- LEDControl_t led_green = {
- .GPIOx = LED1_R_GPIO_PORT,
- .GPIO_Pin = LED1_G_PIN,
- .enabled = 0,
- .flash_interval_ms = 0,
- .counter = 0,
- .flash_times = 0,
- .current_flash_count = 0,
- .flash_pause_ms = 0,
- .pause_counter = 0,
- .in_pause = 0,
- .pin_state = 0
- };
- // 每个灯的闪烁处理函数
- void LED_FlashHandler(LEDControl_t* led)
- {
- if (!led->enabled || led->flash_interval_ms == 0)
- return;
- led->counter += 10;
- if (led->in_pause)
- {
- if (led->counter >= led->flash_pause_ms)
- {
- led->counter = 0;
- led->current_flash_count = 0;
- led->in_pause = 0;
- led->pin_state = 0; // 确保暂停阶段LED灭
- HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_RESET);
- }
- return;
- }
- if (led->counter >= led->flash_interval_ms)
- {
- led->counter = 0;
- led->pin_state = !led->pin_state;
- if (led->pin_state)
- {
- HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_SET); // 先亮
- }
- else
- {
- HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_RESET); // 再灭
- led->current_flash_count++; // 只在灭时计一次闪
- if (led->current_flash_count >= led->flash_times)
- {
- led->in_pause = 1;
- }
- }
- }
- }
- void UpdateLEDStatus(LEDStatus_t status)
- {
- switch (status)
- {
- case LED_NORMAL:
- led_green.enabled = 0;
- // led_green.flash_interval_ms = 1000;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
- HAL_GPIO_WritePin(LED2_R_GPIO_PORT, LED2_R_PIN, GPIO_PIN_SET); // 红灯常亮
- break;
- case LED_COMM:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 0;
- break;
- case LED_WARNING_1:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 1; // 连闪1次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_2:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 2; // 连闪2次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_3:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 3; // 连闪3次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_4:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 4; // 连闪4次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_5:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED2_R_GPIO_PORT, LED2_R_PIN, GPIO_PIN_SET); // 红灯常亮
- break;
-
- case LED_IAP:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_green.flash_times = 5; // 连闪5次
- led_green.flash_pause_ms = 200; // 每轮连闪之间暂停200ms
- led_green.current_flash_count = 0;
- led_green.in_pause = 0;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 5; // 连闪5次
- led_red.flash_pause_ms = 200; // 每轮连闪之间暂停200ms
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- default:
- led_green.enabled = 0;
- led_red.enabled = 0;
- break;
- }
- }
- /***************************************************************/
- // PWM 控制
- // LED控制结构体
- LED_Control leds[] = {
- {LED1_R_GPIO_PORT, LED1_R_PIN, LED1_G_GPIO_PORT, LED1_G_PIN, LED1_R_PWM_CHANNEL, LED1_G_PWM_CHANNEL, LED_OFF, 0, 0, 0, 0},
- {LED2_R_GPIO_PORT, LED2_R_PIN, LED2_G_GPIO_PORT, LED2_G_PIN, LED2_R_PWM_CHANNEL, LED2_G_PWM_CHANNEL, LED_OFF, 0, 0, 0, 0}
- };
- // 设置LED亮度
- void LED_SetBrightness(LED_Control* led, uint8_t r_brightness, uint8_t g_brightness)
- {
- if (r_brightness > 100) r_brightness = 100; // 限制亮度范围
- if (g_brightness > 100) g_brightness = 100; // 限制亮度范围
- led->r_brightness = r_brightness;
- led->g_brightness = g_brightness;
- uint16_t r_pwm_value = (r_brightness * htim15.Init.Period) / 100; // 计算占空比
- uint16_t g_pwm_value = (g_brightness * htim15.Init.Period) / 100; // 计算占空比
- __HAL_TIM_SET_COMPARE(&htim15, led->R_PWM_Channel, r_pwm_value); // 设置PWM占空比
- __HAL_TIM_SET_COMPARE(&htim15, led->G_PWM_Channel, g_pwm_value); // 设置PWM占空比
- }
- // 设置LED状态
- void LED_SetState(LED_Control* led, LED_State state)
- {
- led->state = state;
- switch (state) {
- case LED_OFF:
- LED_SetBrightness(led, 0, 0); // 关闭LED
- break;
- case LED_ON:
- LED_SetBrightness(led, 100, 100); // 打开LED(最大亮度)
- break;
- case LED_BREATHING:
- // 初始化呼吸灯参数
- led->r_brightness = 0; // 初始亮度为0
- led->g_brightness = 0;
- led->blink_count = 0; // 呼吸灯不需要闪烁次数
- led->blink_interval = 10; // 呼吸灯亮度变化间隔(ms)
- break;
- case LED_BLINKING:
- // 初始化闪烁灯参数
- led->r_brightness = 100; // 初始亮度为100
- led->g_brightness = 100;
- led->blink_count = 10; // 闪烁次数(例如闪烁10次)
- led->blink_interval = 500; // 闪烁间隔(ms)
- break;
- }
- }
- // 呼吸灯效果
- void LED_BreathingEffect(LED_Control* led)
- {
- static uint8_t direction = 1; // 1: 增加亮度, 0: 减少亮度
- static uint8_t brightness = 0;
- if (direction) {
- brightness++;
- if (brightness >= 100) direction = 0;
- } else {
- brightness--;
- if (brightness <= 0) direction = 1;
- }
- // 设置红色和绿色亮度
- LED_SetBrightness(led, brightness, brightness);
- // 延时,控制呼吸灯速度
- HAL_Delay(led->blink_interval);
- }
- // 闪烁灯效果
- void LED_BlinkingEffect(LED_Control* led)
- {
- static uint32_t last_tick = 0;
- static uint8_t led_state = 0;
- if (HAL_GetTick() - last_tick >= led->blink_interval) {
- last_tick = HAL_GetTick();
- led_state = !led_state; // 切换亮灭状态
- LED_SetBrightness(led, led_state ? 100 : 0, led_state ? 100 : 0); // 设置亮度
- if (led->blink_count > 0) led->blink_count--; // 减少剩余闪烁次数
- }
- }
- // LED状态机更新
- void LED_UpdateStateMachine(void)
- {
- for (int i = 0; i < 2; i++) {
- switch (leds[i].state) {
- case LED_BREATHING:
- LED_BreathingEffect(&leds[i]); // 处理呼吸灯效果
- break;
- case LED_BLINKING:
- LED_BlinkingEffect(&leds[i]); // 处理闪烁灯效果
- if (leds[i].blink_count == 0) {
- LED_SetState(&leds[i], LED_OFF); // 闪烁结束后关闭LED
- }
- break;
- default:
- break;
- }
- }
- }
|