/** * @file ws2812Task.c * @brief WS2812 LED control task * @author TuxMonkey (nqx2004@gmail.com) * @version 1.0 * @date 2025-07-08 * * @copyright Copyright (c) 2025 DLMU-C.ONE * * @par 修改日志: * *
Date Version Author Description *
2025-07-08 1.0 TuxMonkey 内容 *
*/ //真的有点抽象了不太清楚什么问题,24V的时候用16的分频器可以 5V时候就只能用32的分频器了 spi6的 这个之后注意一下吧 如果要开发还是用32的分频器。 /*---------------------INCLUDES----------------------*/ #include "ws2812status.h" #include "ws2812.h" #include "cmsis_os.h" #include "tim.h" #include "delayticks.h" #include "robot_def.h" /*---------------------VARIABLES---------------------*/ uint8_t r = 0; uint8_t g = 0; uint8_t b = 0; /*---------------------FUNCTIONS---------------------*/ void robotSelfCheck(void) { WS2812_Ctrl(255, 0, 0); HAL_Delay(300); WS2812_Ctrl(0, 0, 255); HAL_Delay(300); WS2812_Ctrl(0, 255, 0); HAL_Delay(300); WS2812_Ctrl(0, 255, 0); } /** * @brief WS2812 LED control task * @param argument */ void ws2812Task(void *argument) { (void) argument; while (1) { switch (RobotMode) { case NORMAL_MODE: BlinkGreen(); break; case SYS_ERROR_OCCURRED: BlinkRed(); break; case REMOTE_NOT_CONNECTED: BlinkYellow(); break; case REMOTE_CONNECTED: BlinkBlue(); break; case AUTO_SHOOTING_MODE: BlinkCyan(); break; case IMU_CALIBERATION_MODE: BlinkPurple(); break; default: BlinkYellow(); } osDelay(10); // 每个任务最后都要写在while里,要不然会导致任务切换失败 } } void BlinkYellow(void) { r = 255; // 红色分量 g = 255; // 绿色分量 b = 0; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为黄色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkRed(void) { r = 255; // 红色分量 g = 0; // 绿色分量 b = 0; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为红色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkGreen(void) { r = 0; // 红色分量 g = 255; // 绿色分量 b = 0; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为绿色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkBlue(void) { r = 0; // 红色分量 g = 0; // 绿色分量 b = 255; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为蓝色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkWhite(void) { r = 255; // 红色分量 g = 255; // 绿色分量 b = 255; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为白色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkCyan(void) { r = 0; // 红色分量 g = 255; // 绿色分量 b = 255; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为青色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void BlinkPurple(void) { r = 255; // 红色分量 g = 0; // 绿色分量 b = 255; // 蓝色分量 WS2812_Ctrl(r, g, b); // 设置为紫色 delay_ticks(500); // 延时500毫秒 WS2812_Ctrl(0, 0, 0); // 关闭LED灯 delay_ticks(500); // 延时500毫秒 } void PWMControwLed(void) { // // WS2812_Ctrl(r, g, b); // r++; // g += 5; // b += 10; // r=0;g=255;b=0;//绿色 // WS2812_Ctrl(r, g, b); // delay_ticks(500); // 使用延时函数代替osDelay,避免任务切换失败 // r=0;g=0;b=255;//蓝色 // WS2812_Ctrl(r, g, b); // delay_ticks(500); // r=0;g=255;b=255;//青色 // WS2812_Ctrl(r, g, b); // delay_ticks(500); // r=255;g=0;b=255;//紫色 // WS2812_Ctrl(r, g, b); // delay_ticks(500); // r=255;g=255;b=255; // WS2812_Ctrl(r, g, b); // delay_ticks(1000); // osDelay(1); // osDelay(100); }