STM32F103CBT6驱动AW9523B实现呼吸灯实例

一、硬件连接

STM32F103CBT6与AW9523B的硬件连接需遵循I2C通信规范,核心连接如下:

STM32引脚 AW9523B引脚 功能说明
PB6 SCL I2C时钟线(需外接4.7kΩ上拉电阻)
PB7 SDA I2C数据线(需外接4.7kΩ上拉电阻)
3.3V VCC 电源(2.4V~5.5V兼容)
GND GND 共地
PA0 INT 中断输出(可选,用于按键唤醒)

注意:AW9523B的ADDR0/ADDR1引脚需接地(或接VCC),以设置I2C从机地址(默认0x5B)。

二、STM32CubeMX配置

使用STM32CubeMX生成初始化代码,步骤如下:

  1. 选择芯片:STM32F103CBT6。

  2. 配置I2C

    • 选择I2C1,模式为"Full Master"。

    • 时钟频率:100kHz(标准模式)。

    • 使能"GPIO Pull-Up"(PB6/PB7上拉)。

  3. 配置GPIO

    • 将PB6/PB7设置为"Alternate Function Open Drain"(I2C复用)。
  4. 生成代码:选择"MDK-ARM"作为工具链,生成工程文件。

三、AW9523B驱动代码

以下是AW9523B的核心驱动代码(基于HAL库):

1. 寄存器定义(aw9523b.h)
c 复制代码
#ifndef __AW9523B_H
#define __AW9523B_H

#include "stm32f1xx_hal.h"

// AW9523B I2C地址(ADDR0=0, ADDR1=0)
#define AW9523B_ADDR 0x5B << 1  // 左移1位(HAL库要求)

// 寄存器地址
#define AW9523B_REG_CFG    0x00  // 配置寄存器(LED模式/ GPIO模式)
#define AW9523B_REG_PWM0   0x01  // PWM0占空比(0~255)
#define AW9523B_REG_PWM1   0x02  // PWM1占空比(0~255)
#define AW9523B_REG_CTRL   0x03  // 控制寄存器(使能PWM)

// 配置参数
#define AW9523B_LED_MODE  0x00  // LED模式(恒流驱动)
#define AW9523B_PWM_EN    0x01  // 使能PWM输出

void AW9523B_Init(I2C_HandleTypeDef *hi2c);
void AW9523B_SetPWM(I2C_HandleTypeDef *hi2c, uint8_t pwm_ch, uint8_t duty);

#endif
2. 驱动实现(aw9523b.c)
c 复制代码
#include "aw9523b.h"

// 初始化AW9523B(设置为LED模式,使能PWM)
void AW9523B_Init(I2C_HandleTypeDef *hi2c) {
    uint8_t cfg_data = AW9523B_LED_MODE;
    HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, AW9523B_REG_CFG, 1, &cfg_data, 1, 100);
    
    uint8_t ctrl_data = AW9523B_PWM_EN;
    HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, AW9523B_REG_CTRL, 1, &ctrl_data, 1, 100);
}

// 设置PWM占空比(pwm_ch:0~1,duty:0~255)
void AW9523B_SetPWM(I2C_HandleTypeDef *hi2c, uint8_t pwm_ch, uint8_t duty) {
    uint8_t reg_addr = (pwm_ch == 0) ? AW9523B_REG_PWM0 : AW9523B_REG_PWM1;
    HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, reg_addr, 1, &duty, 1, 100);
}
四、呼吸灯实现

呼吸灯通过线性调整PWM占空比 实现,核心是渐变算法(从0到255再到0循环)。

1. 主函数(main.c)
c 复制代码
#include "stm32f1xx_hal.h"
#include "aw9523b.h"

I2C_HandleTypeDef hi2c1;  // I2C句柄(CubeMX生成)

int main(void) {
    HAL_Init();
    SystemClock_Config();  // 系统时钟配置(72MHz)
    MX_I2C1_Init();       // I2C初始化(CubeMX生成)
    
    AW9523B_Init(&hi2c1);  // 初始化AW9523B
    
    uint8_t duty = 0;
    int8_t step = 1;
    
    while (1) {
        // 设置PWM占空比(控制LED亮度)
        AW9523B_SetPWM(&hi2c1, 0, duty);
        
        // 渐变逻辑(0→255→0)
        duty += step;
        if (duty >= 255) step = -1;
        else if (duty <= 0) step = 1;
        
        HAL_Delay(10);  // 延迟10ms(调整呼吸速度)
    }
}
2. 呼吸灯效果优化
  • 非线性渐变 :使用正弦函数调整占空比(duty = 127 * sin(theta) + 127),使呼吸更自然。

  • 多LED同步:通过AW9523B的PWM1通道控制另一盏LED,实现双灯交替呼吸。

参考代码 Stm32fl03CBT6对AW9523B呼吸灯的驱动以及控制实例 www.youwenfan.com/contentcsq/56531.html

五、调试与验证
  1. I2C通信测试:使用逻辑分析仪捕获SCL/SDA波形,确认地址(0x5B)和数据传输正确。

  2. PWM输出测试 :用示波器测量AW9523B的PWM引脚(如P0.0),确认占空比随duty变化。

  3. 呼吸灯效果 :观察LED亮度是否从暗到亮再到暗循环,调整HAL_Delay参数改变呼吸速度。

六、注意事项
  1. I2C地址冲突:若总线上有多个AW9523B,需通过ADDR0/ADDR1引脚设置不同地址(如0x5C、0x5D)。

  2. 电源稳定性:AW9523B的VCC需并联100nF电容,避免电源噪声影响PWM输出。

  3. 中断处理:若使用INT引脚(如按键唤醒),需配置EXTI中断,在中断服务函数中处理唤醒事件。

七、扩展应用
  • 多灯联动:通过AW9523B的16路LED驱动,实现多盏LED的同步呼吸(如流水灯效果)。

  • 传感器联动:结合光敏电阻(如BH1750),实现"环境光暗时呼吸灯亮,环境光亮时呼吸灯灭"的智能控制。

相关推荐
Hello_Embed1 天前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
VekiSon1 天前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天1 天前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技1 天前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii1 天前
STC AI8052U单片机特点
单片机
MAR-Sky1 天前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗1 天前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
羽获飞1 天前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
飞睿科技1 天前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
来自晴朗的明天1 天前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程