硬件设计笔记:CK6869D蓝牙风扇PWM调速、升压闭环、电量检测开发要点
客户的需求很简单:蓝牙播歌 + 风扇调速 + 电量显示 + 充电唤醒。市面上大部分蓝牙风扇的方案是:蓝牙芯片负责音频,另外加一颗单片机控制风扇电机。
这次我们用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 // 拨动开关+充电唤醒功能
更多推荐



所有评论(0)