led.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "main.h"
  2. #include "led.h"
  3. // 定义两个灯的控制器
  4. //LEDControl_t led_green = {GPIOB, LED_GREEN_Pin, 1000, 0, 1}; // 默认1秒闪一次
  5. //LEDControl_t led_red = {GPIOB, LED_RED_Pin, 0, 0, 0}; // 默认不闪
  6. LEDControl_t led_red = {
  7. .GPIOx = LED2_R_GPIO_PORT,
  8. .GPIO_Pin = LED2_R_PIN,
  9. .enabled = 0,
  10. .flash_interval_ms = 0,
  11. .counter = 0,
  12. .flash_times = 0,
  13. .current_flash_count = 0,
  14. .flash_pause_ms = 0,
  15. .pause_counter = 0,
  16. .in_pause = 0,
  17. .pin_state = 0
  18. };
  19. LEDControl_t led_green = {
  20. .GPIOx = LED1_R_GPIO_PORT,
  21. .GPIO_Pin = LED1_G_PIN,
  22. .enabled = 0,
  23. .flash_interval_ms = 0,
  24. .counter = 0,
  25. .flash_times = 0,
  26. .current_flash_count = 0,
  27. .flash_pause_ms = 0,
  28. .pause_counter = 0,
  29. .in_pause = 0,
  30. .pin_state = 0
  31. };
  32. // 每个灯的闪烁处理函数
  33. void LED_FlashHandler(LEDControl_t* led)
  34. {
  35. if (!led->enabled || led->flash_interval_ms == 0)
  36. return;
  37. led->counter += 10;
  38. if (led->in_pause)
  39. {
  40. if (led->counter >= led->flash_pause_ms)
  41. {
  42. led->counter = 0;
  43. led->current_flash_count = 0;
  44. led->in_pause = 0;
  45. led->pin_state = 0; // 确保暂停阶段LED灭
  46. HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_RESET);
  47. }
  48. return;
  49. }
  50. if (led->counter >= led->flash_interval_ms)
  51. {
  52. led->counter = 0;
  53. led->pin_state = !led->pin_state;
  54. if (led->pin_state)
  55. {
  56. HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_SET); // 先亮
  57. }
  58. else
  59. {
  60. HAL_GPIO_WritePin(led->GPIOx, led->GPIO_Pin, GPIO_PIN_RESET); // 再灭
  61. led->current_flash_count++; // 只在灭时计一次闪
  62. if (led->current_flash_count >= led->flash_times)
  63. {
  64. led->in_pause = 1;
  65. }
  66. }
  67. }
  68. }
  69. void UpdateLEDStatus(LEDStatus_t status)
  70. {
  71. switch (status)
  72. {
  73. case LED_NORMAL:
  74. led_green.enabled = 0;
  75. // led_green.flash_interval_ms = 1000;
  76. led_red.enabled = 0;
  77. HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
  78. HAL_GPIO_WritePin(LED2_R_GPIO_PORT, LED2_R_PIN, GPIO_PIN_SET); // 红灯常亮
  79. break;
  80. case LED_COMM:
  81. led_green.enabled = 1;
  82. led_green.flash_interval_ms = 500;
  83. led_red.enabled = 0;
  84. break;
  85. case LED_WARNING_1:
  86. led_green.enabled = 1;
  87. led_green.flash_interval_ms = 500;
  88. led_red.enabled = 1;
  89. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  90. led_red.flash_times = 1; // 连闪1次
  91. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  92. led_red.current_flash_count = 0;
  93. led_red.in_pause = 0;
  94. break;
  95. case LED_WARNING_2:
  96. led_green.enabled = 1;
  97. led_green.flash_interval_ms = 500;
  98. led_red.enabled = 1;
  99. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  100. led_red.flash_times = 2; // 连闪2次
  101. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  102. led_red.current_flash_count = 0;
  103. led_red.in_pause = 0;
  104. break;
  105. case LED_WARNING_3:
  106. led_green.enabled = 1;
  107. led_green.flash_interval_ms = 500;
  108. led_red.enabled = 1;
  109. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  110. led_red.flash_times = 3; // 连闪3次
  111. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  112. led_red.current_flash_count = 0;
  113. led_red.in_pause = 0;
  114. break;
  115. case LED_WARNING_4:
  116. led_green.enabled = 1;
  117. led_green.flash_interval_ms = 500;
  118. led_red.enabled = 1;
  119. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  120. led_red.flash_times = 4; // 连闪4次
  121. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  122. led_red.current_flash_count = 0;
  123. led_red.in_pause = 0;
  124. break;
  125. case LED_WARNING_5:
  126. led_green.enabled = 1;
  127. led_green.flash_interval_ms = 500;
  128. led_red.enabled = 0;
  129. HAL_GPIO_WritePin(LED2_R_GPIO_PORT, LED2_R_PIN, GPIO_PIN_SET); // 红灯常亮
  130. break;
  131. case LED_IAP:
  132. led_green.enabled = 1;
  133. led_green.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  134. led_green.flash_times = 5; // 连闪5次
  135. led_green.flash_pause_ms = 200; // 每轮连闪之间暂停200ms
  136. led_green.current_flash_count = 0;
  137. led_green.in_pause = 0;
  138. led_red.enabled = 1;
  139. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  140. led_red.flash_times = 5; // 连闪5次
  141. led_red.flash_pause_ms = 200; // 每轮连闪之间暂停200ms
  142. led_red.current_flash_count = 0;
  143. led_red.in_pause = 0;
  144. break;
  145. default:
  146. led_green.enabled = 0;
  147. led_red.enabled = 0;
  148. break;
  149. }
  150. }
  151. /***************************************************************/
  152. // PWM 控制
  153. // LED控制结构体
  154. LED_Control leds[] = {
  155. {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},
  156. {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}
  157. };
  158. // 设置LED亮度
  159. void LED_SetBrightness(LED_Control* led, uint8_t r_brightness, uint8_t g_brightness)
  160. {
  161. if (r_brightness > 100) r_brightness = 100; // 限制亮度范围
  162. if (g_brightness > 100) g_brightness = 100; // 限制亮度范围
  163. led->r_brightness = r_brightness;
  164. led->g_brightness = g_brightness;
  165. uint16_t r_pwm_value = (r_brightness * htim15.Init.Period) / 100; // 计算占空比
  166. uint16_t g_pwm_value = (g_brightness * htim15.Init.Period) / 100; // 计算占空比
  167. __HAL_TIM_SET_COMPARE(&htim15, led->R_PWM_Channel, r_pwm_value); // 设置PWM占空比
  168. __HAL_TIM_SET_COMPARE(&htim15, led->G_PWM_Channel, g_pwm_value); // 设置PWM占空比
  169. }
  170. // 设置LED状态
  171. void LED_SetState(LED_Control* led, LED_State state)
  172. {
  173. led->state = state;
  174. switch (state) {
  175. case LED_OFF:
  176. LED_SetBrightness(led, 0, 0); // 关闭LED
  177. break;
  178. case LED_ON:
  179. LED_SetBrightness(led, 100, 100); // 打开LED(最大亮度)
  180. break;
  181. case LED_BREATHING:
  182. // 初始化呼吸灯参数
  183. led->r_brightness = 0; // 初始亮度为0
  184. led->g_brightness = 0;
  185. led->blink_count = 0; // 呼吸灯不需要闪烁次数
  186. led->blink_interval = 10; // 呼吸灯亮度变化间隔(ms)
  187. break;
  188. case LED_BLINKING:
  189. // 初始化闪烁灯参数
  190. led->r_brightness = 100; // 初始亮度为100
  191. led->g_brightness = 100;
  192. led->blink_count = 10; // 闪烁次数(例如闪烁10次)
  193. led->blink_interval = 500; // 闪烁间隔(ms)
  194. break;
  195. }
  196. }
  197. // 呼吸灯效果
  198. void LED_BreathingEffect(LED_Control* led)
  199. {
  200. static uint8_t direction = 1; // 1: 增加亮度, 0: 减少亮度
  201. static uint8_t brightness = 0;
  202. if (direction) {
  203. brightness++;
  204. if (brightness >= 100) direction = 0;
  205. } else {
  206. brightness--;
  207. if (brightness <= 0) direction = 1;
  208. }
  209. // 设置红色和绿色亮度
  210. LED_SetBrightness(led, brightness, brightness);
  211. // 延时,控制呼吸灯速度
  212. HAL_Delay(led->blink_interval);
  213. }
  214. // 闪烁灯效果
  215. void LED_BlinkingEffect(LED_Control* led)
  216. {
  217. static uint32_t last_tick = 0;
  218. static uint8_t led_state = 0;
  219. if (HAL_GetTick() - last_tick >= led->blink_interval) {
  220. last_tick = HAL_GetTick();
  221. led_state = !led_state; // 切换亮灭状态
  222. LED_SetBrightness(led, led_state ? 100 : 0, led_state ? 100 : 0); // 设置亮度
  223. if (led->blink_count > 0) led->blink_count--; // 减少剩余闪烁次数
  224. }
  225. }
  226. // LED状态机更新
  227. void LED_UpdateStateMachine(void)
  228. {
  229. for (int i = 0; i < 2; i++) {
  230. switch (leds[i].state) {
  231. case LED_BREATHING:
  232. LED_BreathingEffect(&leds[i]); // 处理呼吸灯效果
  233. break;
  234. case LED_BLINKING:
  235. LED_BlinkingEffect(&leds[i]); // 处理闪烁灯效果
  236. if (leds[i].blink_count == 0) {
  237. LED_SetState(&leds[i], LED_OFF); // 闪烁结束后关闭LED
  238. }
  239. break;
  240. default:
  241. break;
  242. }
  243. }
  244. }