ESP32无线充电跟随系统:磁共振WPT与伺服控制实践

ESP32无线充电跟随系统:磁共振WPT与伺服控制实践 1. 项目概述一个会“追着”你充电的无线能量臂几年前当无线充电还只是手机背板上那个固定的小圆盘时我就一直在想能不能让能量传输变得更“主动”一些比如一个放在桌角的充电器能不能像向日葵一样自动转向并跟随你的设备始终保持最佳的充电位置这个听起来有点“极客”甚至“多余”的想法最终催生了这个项目一个基于ESP32的无线充电跟随系统。简单来说这是一个由两个核心部分组成的装置一个固定在底座上的无线能量发射端和一个集成在你设备比如一个移动电源或特定设备外壳上的接收端。发射端搭载在一个由两个舵机组成的云台上可以上下左右转动。接收端内置了姿态传感器。当接收端移动时它会通过Wi-Fi实时将自己的倾斜角度发送给发射端发射端则驱动舵机调整自身姿态让发射线圈始终对准接收线圈从而在约3英寸7.6厘米的距离内实现最高约10瓦的稳定无线能量传输。这不仅仅是一个“无线充电器”更是一个动态的能量指向系统。它的价值在于解决了中短距离、非固定位置设备的持续供电问题。想象一下在桌面机器人、旋转展示台、或者一些需要避免线缆缠绕的DIY项目中这种主动跟随的供电方式会非常优雅和实用。对于电子爱好者、物联网开发者以及自动化相关领域的学习者而言这个项目涵盖了无线电力传输WPT原理、高频谐振电路设计、PCB定制、ESP32双机通信、以及伺服闭环控制等多个硬核知识点是一个绝佳的综合性实践平台。接下来我将以第一视角拆解我从设计到实现这个系统的完整过程包括电路设计的权衡、代码调试的坑以及那些数据手册里不会告诉你的调谐细节。2. 系统核心设计思路与方案选型在动手画第一根线之前明确系统的整体架构和每个环节的技术选型至关重要。这个项目本质上是一个“感知-决策-执行”的闭环系统但与传统闭环不同它的“被控对象”是空间中的电磁场耦合强度。2.1 整体系统架构拆解整个系统可以清晰地划分为发射端和接收端两个独立模块它们之间通过两种“通道”连接一是用于传输能量的127kHz高频电磁场二是用于传输控制数据的2.4GHz Wi-Fi信号。发射端基站主控ESP32。负责与接收端建立Wi-Fi连接接收姿态数据并生成PWM信号控制两个舵机。能量发射单元由全桥或半桥逆变电路将直流电19V转换为127kHz的交流电驱动串联谐振的发射线圈。执行机构两个SG90微型舵机组成的二维云台负责调整发射线圈的空间指向。电源19V笔记本电源适配器为整个发射端电路和舵机供电。接收端设备端主控ESP32。负责读取内置的加速度计/陀螺仪如MPU6050数据计算自身姿态并通过Wi-Fi发送给发射端。能量接收与管理单元接收线圈与谐振电容构成并联谐振电路拾取高频交流电。专用芯片LTC4120负责将交流电整流、稳压并为后端的锂电池进行安全充电管理。电源3.7V锂聚合物电池为接收端所有电路供电并由LTC4120充电。为什么选择Wi-Fi而不是蓝牙这是一个关键设计决策。虽然蓝牙功耗更低但在这个项目中接收端本身由电池供电且需要持续发送数据Wi-Fi在传输速率、连接稳定性和穿透性上更具优势。更重要的是ESP32的Wi-Fi支持简单的点对点Peer-to-Peer通信如ESP-NOW协议可以实现低延迟、无需路由器的直接数据传输完美契合本应用场景。如果选择蓝牙在复杂电磁环境下的延迟和断连风险会更高。2.2 无线电力传输方案选择磁感应谐振式无线充电技术主要有三种电磁感应式、磁共振式和无线电波式。后两者传输距离远但效率低、电路复杂。电磁感应式最常见如Qi标准要求线圈紧密对准、距离极近毫米级效率高。但距离稍大效率就急剧下降不适合本项目“跟随”所需的数厘米距离。磁共振式通过让发射和接收线圈在相同频率下谐振能在数厘米到数米的距离内实现较高效率的能量传输。这正是本项目需要的。因此我们选择了磁共振式无线电力传输。其核心在于让发射回路和接收回路都谐振在同一个频率本项目为127kHz。当发射线圈通以该频率的交变电流时会产生同频交变磁场。接收线圈处于该磁场中由于谐振即使距离较远也能高效地耦合磁场能量产生感生电流。谐振就像给两个线圈“调到了同一个频道”极大地提高了能量传输的距离和效率。2.3 主控与伺服选型理由ESP32选择它而非更简单的ESP8266或Arduino Uno主要看中三点其一强大的双核处理能力和丰富的外设能同时流畅处理Wi-Fi通信、舵机控制和传感器数据解析其二内置蓝牙可作为备用调试通道其三成熟的Arduino核心支持开发环境友好生态丰富。SG90舵机这是一种廉价的模拟舵机虽然精度和扭矩一般但对于演示性质的云台来说足够。其控制信号是标准的50Hz PWMESP32可以轻松生成。在选型时需要注意舵机的扭矩要能带动线圈和PCB板的重量。SG90的扭矩约为1.6kg·cm经计算在臂长3-4厘米时带动几十克的负载是可行的。如果负载更重则需要选择如MG996R这类金属齿轮、更大扭矩的舵机。3. 硬件设计与核心电路解析硬件是项目的骨架尤其是高频功率电路设计不当轻则效率低下重则损坏芯片。这里我重点解析几个关键电路模块。3.1 发射端功率电路从直流到127kHz交流发射端的核心任务是将19V直流电高效地转换为127kHz的大电流交流电驱动发射线圈。常见的方案有E类放大器和全桥/半桥逆变器。E类放大器理论上效率最高90%但电路调谐极其敏感负载或频率稍有变化效率就会暴跌不适合负载接收端位置动态变化的场景。全桥/半桥逆变器采用MOSFET开关通过方波驱动。虽然理论效率略低于E类但鲁棒性强负载适应性好。本项目采用了全桥逆变拓扑。全桥由四个N沟道MOSFET如IRF540N构成对角线上的管子轮流导通在线圈两端产生±Vcc的方波电压。这个方波电压富含奇次谐波我们需要的是其基波分量127kHz。后级的LC串联谐振回路就像一个“频率过滤器”其阻抗在谐振点时最小因此127kHz的基波电流最大而其他频率的谐波则被有效抑制从而在线圈中产生近乎正弦波的大电流。关键参数计算谐振频率f 1 / (2π√(LC))。设定 f 127kHz发射线圈电感 L_tx 测量为 4.95µH。计算谐振电容C_tx 1 / ( (2πf)² * L_tx ) 1 / ( (2 * 3.1416 * 127000)² * 4.95e-6 ) ≈ 318nF。 实际电路中我们会使用一个接近该值的固定电容如330nF再并联一个可调电容如5-50pF的瓷介微调电容用于精细调谐补偿元件公差和寄生参数的影响。注意事项MOSFET的驱动。全桥的高边MOSFET上管的源极电压是浮动的不能直接用单片机IO口驱动需要专门的栅极驱动芯片如IR2110或使用自举电路。这是新手最容易出错的地方之一。我最初尝试用分立元件搭自举电路结果发现高频下开关损耗大MOSFET发热严重。后来改用IR2110驱动芯片后波形干净发热显著降低。3.2 接收端能量接收与管理LTC4120的应用接收端电路相对更“精致”因为它处理的是微弱的感应能量并需安全地为电池充电。核心是LTC4120这是一款专为无线充电接收端设计的芯片。它的工作流程很巧妙谐振与整流接收线圈L_rx与谐振电容C_rx并联谐振在127kHz频率下呈现高阻抗从而在两端感应出较高的交流电压。这个交流电压经过一个由LTC4120内部MOSFET和外部肖特基二极管如BAT54组成的同步整流器被转换为直流电。动态调谐这是LTC4120的精华所在。芯片会监测直流输入电压和输出电流。如果接收到的功率过多它会通过一个外接的功率MOSFET在接收线圈两端并联一个额外的电容从而轻微地“失谐”接收回路降低其Q值减少从磁场中耦合的能量。这是一种闭环的功率调节方式避免了简单的线性稳压带来的巨大热损耗。电池充电管理整流稳压后的电能进入芯片的充电管理部分以恒流/恒压模式为单节锂离子/聚合物电池充电并集成过压、过流、超时和热保护。接收端谐振参数为了达到最佳传输效率发射与接收线圈的电感量需要满足一个比例。通常接收线圈电感量是发射线圈的3倍左右即L_rx ≈ 3 * L_tx。因此我们需要绕制一个电感量约为14.85µH的接收线圈。其谐振电容的计算方式与发射端相同C_rx 1 / ((2πf)² * L_rx)。3.3 PCB设计要点与避坑指南这个项目有发射和接收两块PCB设计时高频功率部分和数字控制部分需要区别对待。布局分区板上严格划分为功率区域和控制区域。功率区域全桥、驱动、谐振线圈接口的走线要短而粗尽可能减少环路面积以降低寄生电感和电磁辐射。控制区域ESP32、晶振、Flash则相对独立。地平面处理采用单点接地策略。数字地DGND和功率地PGND在PCB上通过磁珠或0欧电阻在一点连接通常是电源输入滤波电容的接地脚。这可以防止大功率开关噪声通过地线串扰到敏感的MCU电路导致ESP32死机或Wi-Fi断开。电源去耦这是老生常谈但至关重要。在ESP32的每个电源引脚附近1cm都必须放置一个100nF的陶瓷电容到地。同时在板级电源入口处需要并联一个大容量的电解电容如100µF和一个小的陶瓷电容如100nF以滤除不同频率的噪声。线圈接口连接发射/接收线圈的焊盘或接线柱要足够坚固能承受高频大电流。建议使用通孔焊盘并在PCB背面用“铺铜”的方式加强其与地或电源的连接避免因电流过大而烧毁焊盘。实操心得关于PCB打样。原作者提到用LPKF激光雕刻机自制了一块板子。对于简单的双面板这可行。但对于我们这个项目功率部分有较大的通孔元件如谐振电容、接线柱和可能的多层需求更好的地平面强烈建议使用专业的PCB打样服务。像嘉立创、PCBWay等平台10cm*10cm以内的小板子价格已经非常低廉且工艺质量远非手工可比。提交文件时务必仔细检查生成的Gerber文件用查看器软件预览每一层确保没有断线、短路或遗漏的孔。4. 软件逻辑与通信协议实现硬件搭建好后是赋予系统“灵魂”的软件部分。代码主要分为发射端和接收端两个固件核心逻辑是建立稳定的Wi-Fi连接并传输姿态控制数据。4.1 双机Wi-Fi通信协议选择ESP-NOW如前所述我们选择了ESP32的ESP-NOW协议。这是一种由乐鑫定义的短数据包、低功耗的无线通信协议它允许设备在没有Wi-Fi路由器的情况下直接相互通信类似于高级别的蓝牙但速率更快、连接更简单。为什么不用传统的TCP/IP在简单的点对点通信中建立TCP连接需要经历握手、维护套接字等过程开销较大。而ESP-NOW是一种更底层的、基于MAC地址的协议数据发送就像“喊话”延迟极低毫秒级非常适合本项目中需要实时传输姿态数据的场景。通信流程设计角色定义接收端设备端作为主设备Master发射端基站作为从设备Slave。这是因为姿态数据源在接收端由它主动发起和控制通信流程更合理。配对与初始化发射端上电后初始化Wi-Fi为Station模式但更重要的是它要将其MAC地址通过某种方式比如首次烧录时写死或通过串口打印出来告知开发者。接收端代码中需要预先写入发射端的MAC地址。上电后接收端初始化Wi-Fi为Station模式然后使用esp_now_add_peer()函数将发射端添加为对等节点。数据发送与接收接收端通过I2C读取MPU6050的数据经过滤波如互补滤波或卡尔曼滤波计算出当前的俯仰角Pitch和横滚角Roll。将这两个浮点数封装到一个简单的结构体中。// 接收端数据发送示例 #include esp_now.h #include WiFi.h typedef struct struct_message { float pitch; float roll; } struct_message; struct_message myData; // 发射端的MAC地址 uint8_t broadcastAddress[] {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; void setup() { WiFi.mode(WIFI_STA); if (esp_now_init() ! ESP_OK) { /* 初始化失败处理 */ } esp_now_peer_info_t peerInfo; memcpy(peerInfo.peer_addr, broadcastAddress, 6); peerInfo.channel 0; peerInfo.encrypt false; esp_now_add_peer(peerInfo); // 初始化MPU6050... } void loop() { myData.pitch getFilteredPitch(); // 获取滤波后的角度 myData.roll getFilteredRoll(); esp_err_t result esp_now_send(broadcastAddress, (uint8_t *) myData, sizeof(myData)); delay(10); // 控制发送频率如100Hz }发射端定义相同的结构体并在esp_now_register_recv_cb()注册的回调函数中解析数据。// 发射端数据接收示例 void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(myData, incomingData, sizeof(myData)); // 此时 myData.pitch 和 myData.roll 已更新 // 立即调用函数更新舵机角度 updateServo(myData.pitch, myData.roll); }4.2 姿态解算与滤波处理从MPU6050读取的原始数据是加速度计和陀螺仪的原始值不能直接使用。加速度计求角度在设备静止或匀速运动时可以通过加速度计的三轴数据计算倾角。例如俯仰角pitch_acc atan2(Ay, Az) * 180/PI。但加速度计对振动非常敏感动态情况下噪声大。陀螺仪积分求角度陀螺仪输出角速度积分后可以得到角度变化。它动态响应好但存在漂移积分误差会随时间累积。互补滤波一种简单有效的融合算法。核心思想是用高通滤波器滤除加速度计的低频噪声振动用低通滤波器滤除陀螺仪的高频噪声漂移然后将两者融合。// 简化的互补滤波示例 float pitch_gyro pitch_angle gyro_y * dt; // 陀螺仪积分 float pitch_acc atan2(accY, accZ) * 180/PI; // 加速度计计算 pitch_angle 0.98 * pitch_gyro 0.02 * pitch_acc; // 融合系数可调系数0.98和0.02决定了信任陀螺仪和加速度计的比例需要根据实际传感器噪声情况调整。对于更精确的要求可以使用卡尔曼滤波但实现更复杂。4.3 舵机控制与跟随算法收到目标角度后需要将其转换为舵机的脉冲宽度。SG90舵机的控制信号是周期20ms50Hz的PWM波脉宽在0.5ms到2.4ms之间对应0度到180度。角度映射首先需要将接收到的姿态角度例如-90°到90°映射到舵机的有效运动范围。由于云台是两轴需要建立一个简单的运动学模型。通常接收端的横滚角Roll控制发射端云台的第一个水平舵机俯仰角Pitch控制第二个垂直舵机。但要注意当第一个舵机转动时第二个舵机的实际运动平面会发生变化如果需要高精度对准可能需要做坐标变换。对于本项目演示简单的直接映射已足够。void updateServo(float targetPitch, float targetRoll) { // 假设舵机初始位置在90度中间角度变化范围±45度 int servo1Angle 90 (int)(targetRoll * k1); // k1是缩放系数 int servo2Angle 90 (int)(targetPitch * k2); servo1Angle constrain(servo1Angle, 45, 135); // 限制在安全范围 servo2Angle constrain(servo2Angle, 45, 135); servo1.write(servo1Angle); servo2.write(servo2Angle); }平滑移动如果直接将计算出的角度设置给舵机动作会显得生硬、跳跃。可以加入平滑滤波比如每次只移动目标角度与当前角度差值的一部分。float currentAngle1 servo1.read(); float smoothAngle1 currentAngle1 (targetAngle1 - currentAngle1) * 0.2; // 平滑系数0.2 servo1.write(smoothAngle1);这样舵机会平缓地“跟随”目标角度移动看起来更自然。5. 系统集成、调试与性能优化当硬件焊接完毕代码也烧录好后真正的挑战——调试——才刚刚开始。这个过程往往是问题最集中的阶段。5.1 上电前检查与静态测试安全第一在连接高压19V电源前务必完成以下检查目视检查用放大镜检查PCB有无桥连、虚焊、漏焊特别是MOSFET、电容和芯片引脚。万用表通断测试检查电源19V 3.3V对地是否短路。检查全桥MOSFET的栅极G与源极S之间是否短路应呈现高阻态或电容充放电特性。检查谐振电容两端是否短路应无直流通路。低压上电测试先不要接19V用可调电源或电池给控制部分如ESP32的3.3V供电。观察ESP32能否正常启动LED闪烁。用逻辑分析仪或示波器检查ESP32的PWM输出引脚看是否有正确的50Hz方波输出控制舵机。通过串口监视器查看ESP-NOW是否初始化成功能否打印出自身的MAC地址。5.2 谐振电路调谐与功率测试这是无线充电效率的核心必须仔细进行。空载调谐最重要发射端接19V电源暂时不接发射线圈。用示波器探头最好用差分探头或两个通道相减测量全桥输出点即谐振电容两端的波形。调整信号发生器或MCU产生的PWM频率在127kHz附近微调同时观察波形幅度。当频率等于LC回路的固有谐振频率时即使空载由于回路Q值高也会在电容两端观察到很高的正弦电压可能是电源电压的数十倍。记录下这个频率f_res。这就是你电路实际的谐振频率。然后调整程序中产生127kHz方波的定时器参数使其输出频率等于这个实测的f_res。这一步确保了驱动频率与硬件谐振点完全匹配。接线圈轻载测试接上发射线圈在距离发射线圈几厘米处放置接收线圈不接负载。用高频电流探头或小电阻采样法测量发射线圈的电流。电流应为一个干净的正弦波。用示波器测量接收线圈两端的开路电压。这个电压应该很高可能几十伏特。此时可以微调发射端或接收端的可调电容观察接收端电压是否达到最大。找到最大值点。带载效率测试在接收端输出接一个可调电子负载如电阻箱。测量发射端输入功率P_in 19V * I_in和接收端输出功率P_out V_out * I_out。计算效率 η P_out / P_in * 100%。改变负载电阻和传输距离记录效率变化。你会发现在某个特定负载和距离下效率存在一个峰值。本系统设计目标是在3英寸距离、输出5V/2A10W时系统整体效率能达到50%以上就算成功。常见问题发射端MOSFET严重发热。可能原因1驱动不足。栅极驱动电压不够应高于MOSFET的开启电压Vgs_th且最好在10-15V或驱动电流不够导致开关速度慢处于线性区时间过长。检查你的栅极驱动电路确保使用专门的驱动芯片。可能原因2死区时间不当。全桥电路上下管切换时如果死区时间两者都关闭的时间太短会导致上下管直通瞬间大电流短路。如果死区时间太长则会增加体二极管导通损耗。需要在MCU的PWM输出中设置合适的死区时间。可能原因3谐振失谐。如果驱动频率偏离谐振点太远线圈呈现感性或容性会导致电流相位与电压相位不一致增加开关损耗。务必按照上述步骤精确调谐。5.3 跟随功能联调当能量传输稳定后最后集成控制部分。舵机单独测试编写简单代码让两个舵机分别在其行程范围内运动确保机械结构顺畅无卡顿且舵机扭矩足够。通信测试将发射端和接收端靠近打开串口监视器查看接收端是否成功发送数据发射端是否成功接收并解析出角度值。可以打印角度值来验证。开环测试屏蔽掉接收端的真实传感器数据改为发送一组已知的、周期性变化的角度值如正弦波。观察发射端舵机是否平滑地跟随这个预设的“轨迹”运动。闭环集成最后接入真实的MPU6050数据。手持接收端模块缓慢移动观察发射端云台是否能够跟随。此时可能会发现跟随有延迟或抖动。延迟优化代码减少不必要的延时确保ESP-NOW发送频率如100Hz远高于舵机响应频率。抖动加强姿态数据的滤波增大互补滤波中陀螺仪的权重并对舵机目标角度进行平滑处理如前面提到的低通滤波。6. 项目总结与扩展思考经过数周的设计、焊接、调试和“抓虫”当看到云台终于能平稳地跟随手中的接收模块转动并且LED灯指示着能量正在稳定传输时那种成就感是无与伦比的。这个项目麻雀虽小却五脏俱全它强迫你从电磁场理论一路实践到嵌入式软件和自动控制。回顾整个过程我认为有几点经验值得分享第一仿真先于实物。在画PCB之前我用LTspice仿真了全桥谐振电路大致确定了元件参数和波形这避免了很多基础错误。对于高频功率电路仿真非常有必要。第二分模块调试。不要试图一次性把所有东西连起来。先确保电源、MCU、通信、传感器、功率电路每一块单独都能工作再逐步集成。这能极大降低排查问题的复杂度。第三仪器是你的眼睛。没有示波器调谐振电路就是盲人摸象。一个能测到几百kHz的示波器是必备的。逻辑分析仪对于调试ESP-NOW通信包也很有帮助。这个系统目前只是一个原型还有很多可以优化和扩展的方向效率提升可以尝试使用GaN氮化镓MOSFET替代传统的硅MOSFET它能工作在更高频率、具有更低的开关损耗有望将效率提升10%以上。多设备充电修改接收端ID识别和通信协议理论上可以让一个发射端轮流为多个不同位置的接收端设备充电。增加反馈闭环目前系统是开环的发射端不知道能量传输的实际效率。可以在发射端增加一个电流采样电路监测输入功率结合接收端反馈的输出功率可通过通信回传实现真正的效率最优跟随控制比如在信号弱时自动微调线圈角度寻找最佳耦合点。美学与结构优化使用3D打印设计一个更美观、线材隐藏更好的外壳将整个系统产品化。无线能量传输的世界充满魅力这个项目就像打开了一扇门。它不仅仅是让一个线圈转动起来更是对电磁理论、电力电子、嵌入式系统和控制算法的一次深度融合实践。希望我的这些踩坑经验和实现细节能为你自己的探索之路点亮一盏灯。