В LED добавлен режим помежуточной яркости диода

This commit is contained in:
2026-02-05 17:30:27 +03:00
parent c0733a1d31
commit 5ad51f0d61
2 changed files with 39 additions and 2 deletions

View File

@@ -63,8 +63,9 @@ typedef enum
{
LED_IS_OFF = 0, ///< Светодиод выключен
LED_IS_ON = 1, ///< Светодиод включен
LED_IS_BLINKING = 2, ///< Моргание светодиодом
LED_IS_FADING = 3, ///< Плавное моргание светодиодом
LED_IS_DUTY = 2, ///< Светодиод включен на частичную яркость
LED_IS_BLINKING = 3, ///< Моргание светодиодом
LED_IS_FADING = 4, ///< Плавное моргание светодиодом
}GPIO_LEDStateTypeDef;
/**
@@ -80,6 +81,7 @@ typedef struct
uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит)
uint32_t LED_Period; ///< Период моргания светодиода
uint32_t LED_Duty; ///< Текущая яркость светодиода
uint32_t tickprev;
}GPIO_LEDTypeDef;
@@ -192,6 +194,8 @@ HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led);
HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led);
/* Выставить светодиод по переменной */
HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state);
/* Выставить яркость светодиод */
HAL_StatusTypeDef GPIO_LED_Duty_Set(GPIO_LEDTypeDef *led, uint8_t led_duty);
/* Активировать моргание светодиодом */
HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period);
/* Активировать моргание светодиодом */

View File

@@ -136,6 +136,23 @@ HAL_StatusTypeDef GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state)
return GPIO_LED_Off(led);
}
}
/**
* @brief Выставить яркость светодиод
* @param led Указатель на структуру светодиода
* @param led_duty Яркость светодиода
* @return HAL Status
*/
HAL_StatusTypeDef GPIO_LED_Duty_Set(GPIO_LEDTypeDef *led, uint8_t led_duty)
{
if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin))
return HAL_ERROR;
led_duty = (led_duty*LED_PWM_TICKS)/100;
led->state = LED_IS_DUTY;
led->LED_Duty = led_duty;
return HAL_OK;
}
/**
* @brief Активировать моргание светодиодом
* @param led Указатель на структуру светодиода
@@ -199,6 +216,21 @@ void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
led->tickprev = tickcurrent;
}
}
/* Режим промежуточной яркости светодиода */
else if(led->state == LED_IS_DUTY)
{
uint32_t tickcurrent = local_time();
/* Формирование ШИМ для яркости */
int duty_crt = (led->LED_Duty*led->LED_Duty/LED_PWM_TICKS);
if(tickcurrent%LED_PWM_TICKS < duty_crt)
{
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, led->LED_ActiveLvl);
}
else
{
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, !led->LED_ActiveLvl);
}
}
/* Режим плавного моргания светодиода */
else if(led->state == LED_IS_FADING)
{
@@ -229,6 +261,7 @@ void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
}
led->tickprev = tickcurrent;
}
led->LED_Duty = duty;
/* Формирование ШИМ для изменения яркости */
int duty_crt = (duty*duty/LED_PWM_TICKS);
if(tickcurrent%LED_PWM_TICKS < duty_crt)