一、系统概述与核心功能
1. 系统定位
设计基于STM32 Nucleo开发板(以Nucleo-F103RB为例),结合CubeMX图形化配置工具与HAL库,实现一款低成本、高扩展性的彩色LED照明灯。系统通过PWM驱动RGB LED实现全彩调光,支持颜色切换、亮度调节、呼吸灯效,并预留UART/I2C接口用于上位机或传感器扩展。Nucleo板自带ST-Link调试器,无需额外下载器,特别适合快速原型开发与教学演示。
2. 核心功能模块
| 模块 | 功能描述 |
|---|---|
| 主控核心 | STM32F103RB(Nucleo-F103RB),72MHz Cortex-M3,128KB Flash,20KB RAM |
| LED驱动 | 1W RGB大功率LED(共阳极),通过3路PWM独立控制R/G/B通道,实现1677万色混合 |
| 人机交互 | 2个用户按键(模式切换/参数调节)+ 1个蓝色用户LED(状态指示) |
| 电源管理 | Nucleo板通过USB 5V供电,外接DC-DC降压模块为LED提供恒流驱动(350mA/路) |
| 扩展接口 | 预留UART(蓝牙/Wi-Fi控制)、I2C(光照/温湿度传感器)、ADC(电位器调光)接口 |
二、硬件设计方案
1. Nucleo-F103RB核心资源分配
| 外设 | 引脚 | 功能 | CubeMX配置模式 |
|---|---|---|---|
| PWM_TIM3_CH1 | PA6 (A5) | RGB红色通道PWM调光 | Alternate Function Push Pull |
| PWM_TIM3_CH2 | PA7 (A6) | RGB绿色通道PWM调光 | Alternate Function Push Pull |
| PWM_TIM3_CH3 | PB0 (A7) | RGB蓝色通道PWM调光 | Alternate Function Push Pull |
| 按键_USER1 | PC13 (B1) | 模式切换(颜色/亮度/灯效) | Input mode with pull-up |
| 按键_USER2 | PA0 (A0) | 参数调节(+/-) | Input mode with pull-up |
| LED_USER | PA5 (LED2) | 系统状态指示(闪烁=运行,常亮=故障) | General Purpose Output |
| UART1 | PA9(TX)/PA10(RX) | 上位机通信(AT指令控制) | Asynchronous mode |
2. RGB LED驱动电路设计
关键设计点 :Nucleo GPIO输出电流有限(最大20mA),无法直接驱动1W LED,需外接恒流驱动电路。
+5V (USB/Nucleo VIN)
│
├─[10μF电解电容]─┐
│ │
│ XL4005 DC-DC │← 350mA恒流设置(Iset=0.2V/Rset)
│ 降压模块 │
└─[100nF瓷片电容]─┘
│
├─R_LED+ (共阳极)
│ ┌─R_LED- ──[100Ω限流] ── IRF540N MOSFET ── GND
│ ┌─G_LED- ──[100Ω限流] ── IRF540N MOSFET ── GND
│ ┌─B_LED- ──[100Ω限流] ── IRF540N MOSFET ── GND
│
└─MOSFET栅极 ← PA6/PA7/PB0 (PWM信号)
注意 :若仅需演示,可替换为WS2812B智能LED灯带(单线控制,无需驱动电路,直接接Nucleo 5V/GND/D11)。
3. 电源与抗干扰设计
- 电源隔离:Nucleo板5V与LED驱动电源分开,通过磁珠(600Ω@100MHz)单点共地,避免大电流干扰MCU。
- 退耦电容:每个LED负极串联100Ω电阻+100nF电容,滤除PWM高频噪声。
- 按键消抖:CubeMX中配置GPIO上拉输入,软件中采用10ms延时消抖。
三、CubeMX配置步骤(图文详解)
1. 工程新建与MCU选择
- 打开CubeMX → File → New Project → 搜索 Nucleo-F103RB → 双击选择。
- Project Manager 选项卡:
- Project Name:
Nucleo_RGB_Light - Toolchain/IDE:
MDK-ARM(或STM32CubeIDE) - 勾选 Generate peripheral initialization as a pair of .c/.h files per peripheral。
- Project Name:
2. 时钟树配置(Clock Configuration)
- HSE :选择
Crystal/Ceramic Resonator(Nucleo板载8MHz晶振)。 - PLL Source Mux :
HSE。 - PLLMul :
x9(8MHz ×9 =72MHz)。 - APB1 Prescaler :
/2(36MHz,TIM3时钟源)。 - System Clock Mux :
PLLCLK。 - SYSCLK:72MHz。
3. 外设参数配置(Pinout & Configuration)
3.1 TIM3 PWM配置(核心)
| 参数 | 设置值 | 说明 |
|---|---|---|
| TIM3 Mode | PWM Generation CH1-3 |
启用3路PWM输出 |
| Prescaler (PSC) | 71 |
72MHz/(71+1)=1MHz,PWM计数频率 |
| Counter Period (ARR) | 999 |
PWM周期=1ms(1kHz),分辨率1‰ |
| Pulse (CCR1-3) | 0 |
初始占空比0%(全灭) |
| CH Polarity | High |
高电平有效(LED点亮) |
3.2 GPIO配置
| 引脚 | 模式 | Pull-up/Pull-down | Label |
|---|---|---|---|
| PC13 | Input mode | Pull-up | USER_BTN1 |
| PA0 | Input mode | Pull-up | USER_BTN2 |
| PA5 | Output mode | No pull-up/pull-down | USER_LED |
3.3 USART1配置(可选)
- Mode:
Asynchronous - Baud Rate:
115200 Bits/s - Word Length:
8 Bits - Parity:
None - Stop Bits:
1
4. 代码生成
点击 Project → Generate Code,CubeMX自动生成HAL库初始化代码。
参考代码 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发) www.youwenfan.com/contentcst/123517.html
四、软件设计与核心代码(基于HAL库)
1. 系统架构(前后台系统)
- 后台 :CubeMX生成的硬件初始化代码(
main.c中的MX_xxx_Init())。 - 前台 :
while(1)主循环扫描按键,定时器中断更新LED灯效。
2. 核心代码实现
2.1 RGB颜色控制宏定义(main.h)
c
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f1xx_hal.h"
// PWM参数
#define PWM_PERIOD 999 // ARR值(1kHz)
#define PWM_MAX 999 // 最大占空比(100%)
// 颜色宏(R,G,B值0-255)
#define COLOR_RED (255,0,0)
#define COLOR_GREEN (0,255,0)
#define COLOR_BLUE (0,0,255)
#define COLOR_WHITE (255,255,255)
#define COLOR_YELLOW (255,255,0)
// RGB LED控制函数
void RGB_SetColor(uint8_t r, uint8_t g, uint8_t b);
void RGB_SetBrightness(uint8_t brightness); // 0-100%
#endif
2.2 RGB PWM驱动函数(main.c)
c
// 设置RGB颜色(内部将8位颜色值转换为PWM占空比)
void RGB_SetColor(uint8_t r, uint8_t g, uint8_t b) {
// 8位颜色值(0-255) → PWM占空比(0-999)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (r * PWM_PERIOD) / 255);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, (g * PWM_PERIOD) / 255);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, (b * PWM_PERIOD) / 255);
}
// 设置整体亮度(百分比)
void RGB_SetBrightness(uint8_t brightness) {
static uint8_t last_r, last_g, last_b;
if (brightness > 100) brightness = 100;
// 基于当前颜色调整亮度
RGB_SetColor((last_r * brightness) / 100,
(last_g * brightness) / 100,
(last_b * brightness) / 100);
}
2.3 呼吸灯效果实现(定时器中断)
c
// 全局变量
uint8_t breath_dir = 0; // 0=渐暗,1=渐亮
uint16_t breath_val = 0; // 当前亮度值(0-100)
// TIM2中断回调函数(1ms周期,用于呼吸灯)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
if (breath_dir == 0) {
breath_val++;
if (breath_val >= 100) breath_dir = 1;
} else {
breath_val--;
if (breath_val == 0) breath_dir = 0;
}
RGB_SetBrightness(breath_val); // 更新亮度
}
}
2.4 主函数逻辑(main.c)
c
int main(void) {
HAL_Init();
SystemClock_Config();
// CubeMX生成的初始化
MX_GPIO_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
// 启动PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
// 启动呼吸灯定时器(TIM2)
HAL_TIM_Base_Start_IT(&htim2);
// 初始颜色:白色,亮度50%
RGB_SetColor(COLOR_WHITE);
RGB_SetBrightness(50);
while (1) {
// 扫描按键1:切换颜色模式
if (HAL_GPIO_ReadPin(USER_BTN1_GPIO_Port, USER_BTN1_Pin) == GPIO_PIN_RESET) {
HAL_Delay(10); // 消抖
static uint8_t color_mode = 0;
switch(color_mode++) {
case 0: RGB_SetColor(COLOR_RED); break;
case 1: RGB_SetColor(COLOR_GREEN); break;
case 2: RGB_SetColor(COLOR_BLUE); break;
case 3: RGB_SetColor(COLOR_YELLOW); break;
default: color_mode=0; break;
}
while(HAL_GPIO_ReadPin(USER_BTN1_GPIO_Port, USER_BTN1_Pin) == GPIO_PIN_RESET);
}
// 扫描按键2:调节亮度
if (HAL_GPIO_ReadPin(USER_BTN2_GPIO_Port, USER_BTN2_Pin) == GPIO_PIN_RESET) {
static uint8_t bright = 50;
bright += 10;
if (bright > 100) bright = 10;
RGB_SetBrightness(bright);
HAL_Delay(200);
}
}
}
五、系统调试与扩展
1. 调试步骤
| 阶段 | 操作 | 工具 |
|---|---|---|
| 硬件检查 | 测量Nucleo板5V输出,LED驱动电压是否稳定 | 万用表 |
| PWM验证 | 用示波器观察PA6/PA7/PB0引脚波形,确认1kHz PWM | 示波器 |
| 功能测试 | 按下USER_BTN1/2,观察LED颜色与亮度变化 | 肉眼观察 |
| 通信测试 | 上位机发送"AT+COLOR=R255,G0,B0\r\n",验证控制 | 串口助手(SSCOM) |
2. 扩展功能(CubeMX新增配置)
| 扩展功能 | CubeMX配置 | 实现效果 |
|---|---|---|
| 蓝牙控制 | USART1 → HC-05蓝牙模块 | 手机APP远程调光、切换灯效 |
| 光照自适应 | ADC1_IN0 → 光敏电阻 | 根据环境光自动调节亮度(白天暗,夜晚亮) |
| 音乐律动 | ADC1_IN1 → 咪头(声音传感器) | LED随音乐节奏闪烁(需FFT算法) |
| WS2812B驱动 | TIM1_CH1 → WS2812B(单线) | 单IO控制多颗LED,实现流水灯、彩虹灯效 |
六、总结
设计基于STM32 Nucleo-F103RB与CubeMX纯图形化开发,实现了低成本、高稳定性的彩色LED照明系统。通过TIM3 PWM精准控制RGB三色混合,结合定时器中断实现呼吸灯效,硬件上利用Nucleo板载资源减少外围电路,软件上依托HAL库提升可移植性。
开发建议:
- 优先调试PWM输出,确保LED无频闪(频率≥1kHz)。
- 若驱动大功率LED,务必添加恒流驱动电路,避免烧毁Nucleo板。
- 扩展功能时,直接在CubeMX中新增外设配置,无需修改原有代码框架。
应用场景:智能家居氛围灯、桌面装饰灯、教学实验套件、工业状态指示灯。