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),实现"环境光暗时呼吸灯亮,环境光亮时呼吸灯灭"的智能控制。

相关推荐
三伏5222 小时前
Cortex-M3权威指南Cn第八章——笔记
笔记·单片机·嵌入式硬件·cortex-m3
学工科的皮皮志^_^2 小时前
以太网PHY芯片学习RTF8211
经验分享·嵌入式硬件·学习·以太网·phy
沐欣工作室_lvyiyi2 小时前
基于单片机的直流伺服电机控制器设计与仿真(论文+源码)
单片机·嵌入式硬件·毕业设计·直流伺服电机
清风6666662 小时前
基于单片机的智能传送带自动计数与数据管理系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Zeku2 小时前
Linux驱动学习笔记:spi-imx.c收发消息的核心流程
stm32·freertos·linux驱动开发·linux应用开发
麒qiqi2 小时前
嵌入式定时器核心解析:51 单片机 / IMX6ULL (EPIT/GPT) 原理与实战
单片机·嵌入式硬件·gpt
蓬荜生灰2 小时前
STM32(7)-- GPIO输出,寄存器版
stm32·单片机·嵌入式硬件
小尧嵌入式2 小时前
【Linux开发五】条件变量|信号量|生产者消费者模型|信号概念和常见信号|信号的使用和处理
linux·运维·服务器·开发语言·c++·嵌入式硬件
Zeku3 小时前
内核日志分析:__spi_pump_messages的Caller_Optimization和KWorker_Thread
stm32·freertos·linux驱动开发·linux应用开发