客户的需求很简单:蓝牙播歌 + 风扇调速 + 电量显示 + 充电唤醒。市面上大部分蓝牙风扇的方案是:蓝牙芯片负责音频,另外加一颗单片机控制风扇电机。                    

这次我们用CK6969D 直接一颗芯片搞定,蓝牙 + 风扇 PWM + 升压控制 + ADC 采样 + 电量显示全部集成,省去额外搭配 MCU 的环节。

核心难点

1. 动态升压控制:PWM 闭环调压,划分 5 个档位,对应输出 5V~10.8V 电压,电压输出状态稳定,不会因为电机负载发生变化而出现偏移。

2. 电量显示 0~100%:做好信号滤波处理后,电量数值显示平稳,不会出现跳动现象,设备开关机前后,电量数值也不会产生明显变动。

3. 三路独立唤醒:拨动开关唤醒蓝牙、按键唤醒风扇、充电器插入唤醒显示,三类唤醒逻辑相互独立,运行过程不会互相干扰。

核心思路

CK6969D自带硬件 Timer PWM 和 ADC 外设,硬件资源可以满足风扇的升压闭环控制需求,无需额外外接单片机。

一、硬件引脚分配

升压电路工作原理:PA3 引脚输出 200kHz 的 PWM 信号驱动 MOS 管,MOS 管配合升压电感完成储能、释能动作,最终输出 5V~10.8V 可调电压。PA0 引脚外接分压电阻,对升压输出电压进行采样,将采样数据传输至 ADC,以此实现闭环控制。

二、风扇速度与升压电压

风扇设置 5 档调速模式,不同档位对应不同的升压输出电压,相关参数定义如下:

#define FAN_LEVEL_OFF        0

#define FAN_LEVEL_1          20    // 低速

#define FAN_LEVEL_2          40    // 中低

#define FAN_LEVEL_3          60    // 中等

#define FAN_LEVEL_4          80    // 中高

#define FAN_LEVEL_5          100   // 高速

速度与升压电压映射公式:boost_mv = 5000 + (level - 20) * 5000 / 80档位对应电压参考:1 档 = 5.0V,2 档 = 6.25V,3 档 = 7.5V,4 档 = 8.75V,5 档 = 10.8V。

该映射参数经过多轮调试确定,电压偏低会出现电机无法启动的情况,电压偏高则会加剧电机发热,10.8V 为该款电机的适配上限电压。

升压输出电压通过分压电阻接入 PA0 引脚,分压参数定义:

#define VBST_DET_DIV     11   // 分压比 11:1

举例:升压电路输出 10V 电压时,PA0 引脚采样得到的电压约为 10000/11 ≈ 909mV。

三、升压闭环控制(核心)

这是整套方案的关键部分,由 PWM 驱动升压电路,ADC 完成电压采样反馈,软件层面实现闭环 PID 调节。

PWM 配置代码

static void fan_pwm_init(void){

    timer_pwm_init(FAN_PWM_TIMER, 10000, 0, FAN_PWM_PIN, FAN_PWM_OUT_CH);

    // 直接操作Timer寄存器,设置200kHz工作频率

    FAN_PWM_TIMER->PRD = FAN_PWM_PRD; // 周期=120

    FAN_PWM_TIMER->CNT = FAN_PWM_PRD;

    FAN_PWM_TIMER->PWM = 0;           // 初始占空比0

    // 配置PWM输出引脚

    gpio_output_channle(FAN_PWM_PIN, FAN_PWM_OUT_CH);}

升压状态机定义

升压控制逻辑每 5ms 执行一次,划分三个工作状态:

enum {

    FAN_BST_OFF = 0,       // 关闭状态

    FAN_BST_ADJUSTING,    // 电压调节中,自动增减PWM占空比

    FAN_BST_STABLE,       // 电压稳定状态};

控制逻辑说明

1. 系统每 5ms 读取一次 ADC 采样数据;

2. 增加过压保护逻辑,连续检测到过压状态时,设备自动关机;

3. 根据当前选择的风扇档位,计算目标输出电压;

4. 执行闭环调节:采样电压低于目标值则增加 PWM 占空比,采样电压高于目标值则降低占空比,电压处于容差区间内时,保持参数不变。

采样抖动问题解决方案

ADC 原始采样数值存在明显抖动,直接使用原始数据做闭环控制,会造成 PWM 参数频繁跳变,电机运行时产生异响。优化方案:采用 128 点滑动平均滤波,同时增加尖峰数据丢弃逻辑,采样数值超过 1500mV 判定为异常数据并直接过滤,剩余有效数据做移位平均处理。经过滤波后,采样波形更加平稳,PWM 参数不再频繁变化。

四、风扇独立控制

风扇运行逻辑与蓝牙功能相互独立,相关底层定义如下:

// 风扇开关独立于蓝牙#define FAN_SW_ON()  do { \

    gpio_set_direction(FAN_SW_PIN, 0); \

    gpio_set_output_value(FAN_SW_PIN, 1); \} while(0)

#define FAN_SW_OFF() do { \

    gpio_set_direction(FAN_SW_PIN, 0); \

    gpio_set_output_value(FAN_SW_PIN, 0); \} while(0)

PA2 引脚负责控制风扇电源通断,即便蓝牙模块进入 idle 休眠模式,PA2 依旧可以输出高电平,维持风扇正常运转。

档位循环切换代码

通过按键实现档位循环切换,切换逻辑为:关闭→1 档→2 档→3 档→4 档→5 档→关闭

void fan_ctrl_level_cycle(void){

    static const u8 level_table[] = { 0, 20, 40, 60, 80, 100 };  

    for (int i = 0; i < 6; i++) {

        if (fan_ctrl.level < level_table[i]) {

            fan_ctrl_set_level(level_table[i]);

            return;

        }

    }

    fan_ctrl_off(); // 切换至最高档后再次按键,关闭风扇}

五、充电独立唤醒

设备接入充电器时,需要自动唤醒芯片并展示充电状态,此过程无需启动蓝牙功能。引脚定义说明:

· PA4:充电检测引脚 (DC_DET)

· PB5:拨动开关检测引脚 (SW_DET)

工作逻辑:充电器插入后,引脚变为高电平,芯片完成唤醒,进入假开机模式,仅展示电量信息,蓝牙模块不启动;拨动开关拨至工作档位,设备完成真开机,蓝牙与风扇功能均可正常使用。

整套设计实现三类独立电源管理逻辑:

1. 拨动开关:控制蓝牙模块整体启停;

2. 实体按键:控制风扇档位切换;

3. 充电器插拔:控制充电显示功能的唤醒与休眠。

六、电量显示

电池电压与电量百分比的对应关系如下表:

电池电压 电量占比

3.30V 0%

3.50V 15%

3.60V 30%

3.70V 50%

3.80V 70%

3.90V 85%

4.20V 100%

设备支持数码管或 LED 指示灯展示电量。切换风扇档位时,数码管会临时展示当前档位,持续 2 秒后自动切换回电量显示界面,对应调用逻辑:

// 切换风扇档位时临时显示档位user_bat_disp_set_temp(TEMP_DISP_FAN_LEVEL, disp_level, 2);// 第三个参数代表2秒后恢复电量显示

七、平滑启动功能

电机直接从静止切换至目标转速,会产生较大的启动电流冲击。本次方案增加平滑启动逻辑,优化使用体验。

#define FAN_SMOOTH_INTERVAL_MS 150 // 每150ms提升一个档位

static void fan_smooth_timer_cb(void *priv){

    if (fan_ctrl.level < FAN_MAX_LEVEL) {

        fan_ctrl.level++;

    }

    // 档位达到上限后,关闭定时器

    if (fan_ctrl.level >= FAN_MAX_LEVEL) {

        sys_timer_del(smooth_timer_id);

        smooth_timer_id = 0;

    }}

void fan_ctrl_smooth_start(void){

    fan_ctrl_on(FAN_LEVEL_1);

    smooth_timer_id = sys_timer_add(NULL, fan_smooth_timer_cb, 150);}

工作逻辑:长按按键,风扇从 1 档开始启动,每 150ms 自动提升一个档位,松开按键后,风扇停留在当前档位运行,规避瞬间大电流带来的不良影响。

八、配置宏定义

在板级配置文件中开启对应功能,参数配置如下:

#define USER_FAN_CTRL_EN        1   // 风扇控制功能使能

#define USER_BAT_DISP_EN        1   // 电量显示功能使能

#define USER_FAN_INDEPENDENT_EN 1   // 风扇独立工作模式使能

#define USER_SW_DC_WAKEUP_EN    1   // 拨动开关+充电唤醒功能

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐