基于立创EDA与AIR001的智能手持风扇DIY:PWM调速、快充与充电宝功能全解析

基于立创EDA与AIR001的智能手持风扇DIY:PWM调速、快充与充电宝功能全解析 基于立创EDA与AIR001的智能手持风扇DIYPWM调速、快充与充电宝功能全解析最近天气越来越热你是不是也想自己动手做一个功能强大的智能手持风扇既能享受DIY的乐趣又能得到一个集成了快充、充电宝和炫酷屏显的实用小工具。今天我就来手把手带你复现这个基于立创EDA和AIR001芯片的“夏日手持风扇”项目。这个项目麻雀虽小五脏俱全。它用上了台达的服务器风扇风力强劲通过PWM实现0-255级无级调速支持市面上主流的快充协议给电池充电还能反向输出当充电宝用最后一块0.96寸的OLED屏实时显示电压和挡位科技感十足。整个项目在立创EDA上完成设计用Arduino IDE编程对嵌入式新手和电子爱好者非常友好。咱们的目标是看完这篇教程你不仅能理解整个项目的设计思路还能自己动手把它做出来。下面我们就从硬件选型开始一步步拆解。1. 核心硬件选型与原理做项目第一步得先把“演员”认全。这个风扇的硬件架构非常清晰各司其职咱们一个个来看。1.1 大脑AIR001主控芯片这个项目的核心控制器是AIR001。为什么选它首先它“不要钱”社区有免费申请或低成本获取渠道性价比极高。对于Arduino爱好者来说它最大的优点是完美兼容Arduino IDE这意味着你可以用熟悉的Arduino库和语法来编程大大降低了开发门槛。AIR001是一颗基于ARM Cortex-M0内核的微控制器性能足以应对我们这个项目的需求产生PWM信号、读取按键、驱动OLED屏、处理逻辑。在Arduino环境下我们可以像操作UNO、Nano一样去操作它的GPIO、定时器等外设非常方便。1.2 心脏动力与电源系统风扇的动力和供电是项目的关键这里用到了几个核心芯片风扇台达 PFC0912DE。这是一款9厘米的服务器风扇额定电压12V。服务器风扇的特点是风量大、噪音控制好、寿命长。用它来做手持风扇风力绝对够劲满速时风速能达到22 m/s。你完全可以替换成其他12V风扇只要接口GND, VCC对应就行。充电管理芯片IP2326。它的任务是给三节串联的18650锂电池组充电。普通充电器只能输出5V而我们的电池组充满电电压是12.6V3 * 4.2V。IP2326的厉害之处在于它能通过Type-C接口与充电器“协商”也叫诱骗请求更高的电压比如9V、7V或5V从而实现快速充电。它支持PD等主流快充协议。充电宝控制芯片IP6505。当你想把风扇里的电池当成充电宝给手机充电时就轮到它上场了。IP6505能将电池的电压大概9V-12.6V升压或降压到稳定的5V输出。它同样支持BC1.2、Apple、三星、QC、华为等多种快充协议兼容性很强。注意项目中使用了三节18650锂电池串联总电压较高满电12.6V。安全第一务必使用带保护板的电池并在焊接和测试时格外小心避免短路。短路会导致电池瞬间大电流放电非常危险。1.3 交互屏幕与按键显示屏0.96寸OLED驱动芯片为SSD1306采用I2C通信。这种屏幕功耗低、显示对比度高适合便携设备。它的接口非常简单只有4根线GND地、VCC电源、SCL时钟线、SDA数据线。按键侧边拨动开关系统总电源开关。拨动它整个板子才通电。正面二档拨动开关用于调节风扇挡位。向右拨一下挡位1向左拨一下挡位-1。正面按键控制充电宝功能的开关。按一下开启5V输出再按一下关闭。2. 系统工作原理全景图了解了各个部件我们再把它们串联起来看看整个系统是怎么协同工作的。理解了原理写程序和控制逻辑就会清晰很多。整个系统的工作流程可以概括为以下几步上电拨动侧边总开关电池为整个系统供电。AIR001单片机启动OLED屏幕点亮。信息显示AIR001通过ADC模数转换器读取电池电压并通过I2C总线将当前电压值和风扇速度挡位发送到OLED屏显示。风速控制用户拨动正面的二档开关来增减挡位0-255。AIR001根据挡位值通过一个GPIO引脚输出对应占空比的PWM脉冲宽度调制信号。PWM频率是10kHz。这个PWM信号控制一个MOS管的导通程度。MOS管相当于一个高速电子开关串联在风扇的电源VCC回路中。PWM占空比高MOS管导通时间长风扇得到的平均电压高转速就快反之则慢。这就实现了无级调速。充电模式插入Type-C充电线。IP2326芯片与充电器通信诱骗出合适的快充电压5V/7V/9V为三节串联的18650电池充电。充电宝模式用户按下正面按键开启充电宝功能。IP6505芯片开始工作将电池电压转换为稳定的5V从Type-C口输出。再次按下按键关闭输出。可以看到AIR001主要负责“指挥”处理按键、计算PWM、驱动屏幕。而具体的“重体力活”快充、降压/升压则交给了专业的电源管理芯片IP2326, IP6505。这种设计既保证了功能强大又让主控编程变得简单。3. Arduino软件编程详解硬件搭好了接下来就是赋予它灵魂——编程。我们使用Arduino IDE来开发整个过程非常直观。3.1 开发环境搭建首先你需要在Arduino IDE中添加对AIR001的开发板支持。通常芯片厂商或社区会提供板支持包Board Support Package, BSP。你需要根据AIR001社区提供的指南在“开发板管理器”中添加相应的网址并安装。安装成功后在“工具”-“开发板”菜单中就能找到“AIR001”选项了。选择正确的开发板和端口就可以开始编程了。3.2 核心功能代码实现我们主要实现三个功能读取按键、输出PWM、驱动OLED屏。这里给出关键代码片段和思路。1. 引脚定义与初始化首先我们需要定义各个功能对应的引脚。// 假设引脚定义具体请根据实际PCB原理图调整 #define FAN_PWM_PIN 9 // 控制风扇的PWM引脚 #define KEY_UP_PIN 2 // 加挡位开关引脚假设 #define KEY_DOWN_PIN 3 // 减挡位开关引脚假设 #define KEY_PB_PIN 4 // 充电宝开关按键引脚 #define BAT_ADC_PIN A0 // 电池电压检测ADC引脚 #include Wire.h #include Adafruit_SSD1306.h // 需要安装Adafruit SSD1306库 #include Adafruit_GFX.h Adafruit_SSD1306 display(128, 64, Wire, -1); // 初始化OLED对象 int fanSpeed 128; // 风扇速度挡位初始化为中间值128 (0-255) bool powerBankMode false; // 充电宝模式状态标志在setup()函数中我们需要初始化这些引脚和外围设备。void setup() { // 初始化串口用于调试 Serial.begin(115200); // 初始化PWM引脚为输出 pinMode(FAN_PWM_PIN, OUTPUT); // 初始化按键引脚为输入并启用内部上拉电阻如果硬件没有上拉 pinMode(KEY_UP_PIN, INPUT_PULLUP); pinMode(KEY_DOWN_PIN, INPUT_PULLUP); pinMode(KEY_PB_PIN, INPUT_PULLUP); // 初始化OLED屏幕 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C地址通常是0x3C Serial.println(F(SSD1306 allocation failed)); for(;;); // 初始化失败死循环 } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(Fan System Ready); display.display(); delay(2000); // 初始化PWM频率为10kHz (以AVR芯片为例AIR001需查手册使用特定定时器) // 注意Arduino默认PWM频率约490Hz需要修改定时器配置以达到10kHz。 // 这里是一个示例AIR001的具体配置方法请参考其芯片手册或BSP示例。 // analogWriteFrequency(FAN_PWM_PIN, 10000); // 某些核心支持此函数 }提示将PWM频率设置为10kHz是为了避免风扇电机产生可闻的噪音低频啸叫。Arduino默认的~490Hz频率可能产生噪音需要根据AIR001的定时器寄存器进行配置。具体方法需要查阅AIR001的Arduino核心库或数据手册。2. 按键扫描与挡位控制我们需要在loop()函数中不断检测按键状态。void loop() { // 1. 扫描加挡位按键假设按下为低电平 if(digitalRead(KEY_UP_PIN) LOW) { delay(50); // 简单消抖 if(digitalRead(KEY_UP_PIN) LOW) { fanSpeed 1; if(fanSpeed 255) fanSpeed 255; while(digitalRead(KEY_UP_PIN) LOW); // 等待按键释放 } } // 2. 扫描减挡位按键 if(digitalRead(KEY_DOWN_PIN) LOW) { delay(50); if(digitalRead(KEY_DOWN_PIN) LOW) { fanSpeed - 1; if(fanSpeed 0) fanSpeed 0; while(digitalRead(KEY_DOWN_PIN) LOW); } } // 3. 扫描充电宝开关按键 if(digitalRead(KEY_PB_PIN) LOW) { delay(50); if(digitalRead(KEY_PB_PIN) LOW) { powerBankMode !powerBankMode; // 状态取反 // 这里可以控制一个GPIO来开关IP6505的使能脚或者IP6505本身有按键控制功能 // digitalWrite(PB_EN_PIN, powerBankMode ? HIGH : LOW); Serial.print(Power Bank Mode: ); Serial.println(powerBankMode ? ON : OFF); while(digitalRead(KEY_PB_PIN) LOW); } } // 4. 更新PWM输出 analogWrite(FAN_PWM_PIN, fanSpeed); // 输出PWM控制风扇 // 5. 读取电池电压 (假设电池电压通过电阻分压后接入ADC引脚) int adcValue analogRead(BAT_ADC_PIN); float voltage (adcValue / 1023.0) * 3.3 * (R1 R2) / R2; // 计算实际电压R1,R2为分压电阻阻值 // 6. 更新OLED显示 updateDisplay(voltage, fanSpeed); delay(100); // 主循环延迟 }3. OLED显示函数专门写一个函数来刷新屏幕显示。void updateDisplay(float batVoltage, int speed) { display.clearDisplay(); display.setCursor(0, 0); display.print(BAT: ); display.print(batVoltage, 2); // 显示2位小数 display.println( V); display.setCursor(0, 20); display.print(SPEED: ); if(speed 0) { display.println(- - -); // 速度为0时特殊显示如项目更新日志所述 } else { display.println(speed); // 去掉“”号直接显示数值 } display.setCursor(0, 40); display.print(PB: ); display.println(powerBankMode ? ON : OFF); display.display(); }3.3 项目调试与常见问题在实际焊接和调试中你可能会遇到以下问题风扇不转或抖动首先检查PWM频率。如果频率太低如默认的490Hz风扇可能会发出“滋滋”声且转动不正常。务必按照AIR001的方法将控制风扇的PWM引脚频率设置为10kHz左右。其次检查MOS管是否焊接正确能否被PWM正常驱动。OLED不显示最常见的原因是I2C地址不对或接线错误。先用Arduino的I2C扫描程序社区有现成代码检查一下OLED的地址是否是0x3C或0x3D。确认GND、VCC、SCL、SDA四根线连接正确。充电宝功能不稳定根据项目更新日志这个问题在PCB更新后已修复。如果你自己设计PCB需要特别注意IP6505芯片周围的电感、电容等功率器件的选型和布局遵循数据手册的推荐设计确保大电流路径足够粗。电池电压读数不准ADC读数受参考电压和分压电阻精度影响。确保你使用的分压电阻精度如1%足够并在代码中校准计算公式里的实际电阻值。可以在电池端接一个万用表对比读取的电压值并在代码中增加一个校准系数。这个项目的硬件原理图和PCB设计文件可以在立创EDA的开源平台找到软件代码也会在社区如提到的QQ群更新。强烈建议你先仔细研究原理图理解每一个元器件的连接关系然后再动手焊接和编程。自己动手做一个这样的智能风扇不仅能学到单片机控制、PWM调速、I2C通信、电源管理等多方面知识还能获得一个独一无二的夏日神器。祝你制作顺利享受创造的乐趣