☰
无线充电Qi协议5阶段与ASK电压调节工程拆解
2026/10/15 22:56:53 网站建设 项目流程

简介:这份PDF资料面向无线充电方向的硬件工程师、嵌入式开发者及电子类专业学生,系统讲解基于Qi协议的无线充电系统原理,并以Richtek RT1650无线电源接收器为例展开分析,帮助读者理解从电磁感应传能到通信协议落地的完整链路。资源为单个PDF文件,压缩包约1.9MB,内容涵盖无线电源传输的优点与原理、Qi标准体系、协议建立通信的探测、身份验证、配置、同步与功率传输五个阶段,以及ASK幅度键控调制、接收端电压动态调节、异物检测FOD等关键机制。文中还以Nokia DT601发射器与RT1650评估板组成的实际系统为例,梳理待机、启动、ASK通信与电压调节等环节,并附有用户可用的固件设定说明。目前已有1950人学习,适合作为无线充电入门与方案选型的参考材料。

1. 无线充电系统原理:从Qi协议5阶段到ASK电压动态调节的工程拆解

很多人第一次拆无线充电板,都会盯着那个硬币大小的线圈发愣——就这俩铜圈,凭什么能把5W、10W甚至15W的功率隔空送过去?更让人费解的是,手机放上去之后,充电板怎么知道该给多少电压?怎么知道手机什么时候充满了?这背后其实是一套完整的通信协议在跑,而Qi协议就是目前最主流的那个。它把整个充电过程拆成了5个阶段,每个阶段都有明确的信号交互和状态判断。而ASK(幅移键控)就是这套通信的物理层手段——接收端通过改变负载来调制线圈上的电压幅度,发送端解调出这些幅度变化,就得到了手机发来的控制指令。RT1650这类接收端芯片,核心工作就是完成ASK解调和电压动态调节。这篇文章不讲虚的,直接把这5个阶段拆开,把ASK调制解调的参数和坑讲清楚,让想自己搭一套无线充电验证平台的工程师能照着跑起来。

2. Qi协议5阶段的状态机与ASK通信链路

2.1 五个阶段到底在干什么

Qi协议把一次完整的充电会话拆成Selection、Ping、Identification & Configuration、Power Transfer、Charging Complete这5个阶段。Selection阶段是发射端在探测有没有物体放上来——它会在线圈上周期性发一个短脉冲,检测谐振点的变化。如果放上去的是金属异物,谐振频率会偏移,发射端就判断为异物,不进入下一步。Ping阶段是发射端发一个数字ping信号,接收端如果活着,会回一个信号强度包。这个包很关键,它告诉发射端“我在这里,我需要多少初始功率”。Identification & Configuration阶段是双方交换能力信息——接收端告诉发射端自己支持什么协议版本、最大需要多少功率;发射端告诉接收端自己能提供多少功率。Power Transfer阶段就是真正的功率传输了,接收端通过ASK持续发送控制误差包,告诉发射端“电压高了”“电压低了”“保持”。Charging Complete阶段是接收端发一个结束包,发射端停止功率输出。

这5个阶段不是随便分的,每个阶段都有超时机制。比如Ping阶段如果发射端发了ping但没收到回应,它会等一段时间然后回到Selection。Identification阶段如果双方能力不匹配,比如接收端要15W但发射端只能给5W,协议允许发射端拒绝或者降级到5W继续。这些超时和降级逻辑在RT1650这类芯片的固件里都有实现,调试的时候如果发现充电断断续续,大概率是某个阶段的超时参数没配对。

2.2 ASK调制在接收端是怎么实现的

ASK在无线充电里的实现方式有点特殊——它不是直接调制一个载波,而是通过改变接收端的负载来影响发射端线圈上的电压幅度。具体来说,接收端在通信的时候会并联一个调制电容或者调制电阻,通过MOS管切换这个负载的通断。负载变了,反射到发射端的阻抗就变了,发射端线圈上的电压幅度就会跟着变。发射端检测这个幅度变化,解调出0和1。

通信速率方面,Qi协议规定ASK的调制频率是2kHz,也就是每个bit的周期是500微秒。这个速率不高,但足够传控制指令了。调制深度一般要求在0.5%到5%之间——太浅了解调不出来,太深了会影响功率传输效率。实际调试的时候,调制深度和通信可靠性是一对矛盾:深度大了通信稳,但功率损耗大;深度小了效率高,但误码率上去了。我一般会先把调制深度设在2%左右,然后根据误码率测试结果微调。

接收端这边,RT1650内部有一个ASK解调电路,它会把线圈上的电压包络检波出来,然后跟一个参考电平比较,还原出数字信号。这个参考电平的设定很关键——如果发射端和接收端的线圈耦合系数变了(比如手机壳厚度不同),包络的直流分量会变,参考电平如果不跟着自适应,解调就会出错。RT1650的做法是先用一个DAC产生参考电平,然后在Ping阶段做一次校准,把参考电平设在包络峰峰值的中间。

2.3 电压动态调节的闭环逻辑

电压动态调节是Power Transfer阶段的核心任务。接收端要输出一个稳定的5V或者9V或者更高的电压给负载(比如手机电池充电管理芯片),但线圈耦合系数会变、负载电流会变、发射端的输入电压也会变。这些扰动都会导致接收端整流后的电压波动。接收端的做法是:采样整流后的电压,跟目标电压比较,得到误差,然后把误差编码成控制误差包,通过ASK发给发射端。发射端收到这个包,调整自己的发射功率——通常是调发射端的输入电压或者调逆变器的占空比。

这个闭环的控制周期是多少?Qi协议没有硬性规定,但一般建议在1ms到10ms之间。周期太短了,ASK通信带宽不够,包发不出去;周期太长了,负载突变的时候电压会掉太多。RT1650的默认控制周期是4ms,这个值在大多数场景下够用。如果负载是电机或者扬声器这种动态负载,可能需要把周期缩到2ms,但这时候要检查ASK的误码率有没有恶化。

控制误差包的编码方式也有讲究。Qi协议定义了两种:一种是控制误差值,范围是-128到+127,负值表示“电压高了,降功率”,正值表示“电压低了,升功率”;另一种是接收功率包,告诉发射端当前接收端实际收到了多少功率。发射端用这两个信息做前馈和反馈的混合控制。实际调试的时候,如果发现电压振荡,一般是控制误差的增益设太大了,把比例系数降一半通常能解决。

3. 用RT1650搭一套最小验证平台

3.1 硬件选型与线圈匹配

RT1650是一颗Qi接收端芯片,支持5W到15W的输出。搭最小验证平台需要这些东西:一个发射端板子(可以用现成的Qi发射模组,但要注意它的通信解调能力要支持ASK)、一个RT1650的评估板、一对匹配的线圈、一个电子负载、一个示波器。线圈的选型很关键——发射端和接收端的线圈电感量要匹配,一般发射端是6.3微亨,接收端是10微亨左右。如果电感量差太多,谐振频率对不上,效率会很低甚至通信失败。

线圈的耦合系数在0.3到0.6之间比较合适。耦合系数太低,接收端感应到的电压不够,RT1650可能启动不了;耦合系数太高,调制深度会变得很大,通信反而容易出错。实际测试的时候,我会先用LCR表量一下两个线圈的电感量和品质因数,然后用一个简单的谐振电路测一下耦合系数。如果耦合系数不在范围内,调整线圈的距离或者加一个磁屏蔽片。

3.2 固件配置与寄存器设置

RT1650的固件配置主要通过I2C接口写寄存器。下面这段代码是初始化RT1650的基本流程,包括设置目标电压、控制周期、ASK调制深度。

// RT1650 初始化配置示例 // 假设 I2C 地址为 0x3C,寄存器地址为 8 位 #define RT1650_ADDR 0x3C // 寄存器定义(根据实际数据手册调整) #define REG_VOUT_TARGET 0x10 // 目标输出电压,单位 mV #define REG_CTRL_PERIOD 0x11 // 控制周期,单位 us #define REG_ASK_DEPTH 0x12 // ASK 调制深度,单位 0.1% #define REG_CTRL_GAIN 0x13 // 控制误差增益 #define REG_REF_DAC 0x14 // ASK 解调参考电平 void rt1650_init(void) { // 设置目标输出电压为 5000mV i2c_write(RT1650_ADDR, REG_VOUT_TARGET, 5000); // 设置控制周期为 4000us i2c_write(RT1650_ADDR, REG_CTRL_PERIOD, 4000); // 设置 ASK 调制深度为 2.0%(寄存器值 20) i2c_write(RT1650_ADDR, REG_ASK_DEPTH, 20); // 设置控制误差增益为 1(默认值,先不调) i2c_write(RT1650_ADDR, REG_CTRL_GAIN, 1); // 参考电平先设为中间值,Ping 阶段会自动校准 i2c_write(RT1650_ADDR, REG_REF_DAC, 128); }

这段代码的逻辑很直接:先把目标电压设成5V,然后把控制周期设成4ms,调制深度设成2%。参考电平先给一个中间值,等Ping阶段芯片自己校准。这里要注意,REG_VOUT_TARGET的单位是mV,写5000就是5V,别写成5。REG_ASK_DEPTH的单位是0.1%,写20就是2.0%。如果写200那就是20%,调制深度太大了,功率传输效率会掉得很厉害。

3.3 用示波器抓ASK波形和电压调节过程

硬件和固件都配好之后,下一步是抓波形验证。把示波器的探头接到发射端线圈的两端,触发方式设成边沿触发,触发电平设在包络的中间。然后给接收端加一个负载,比如100欧姆的电阻。这时候应该能看到发射端线圈上的电压包络在周期性变化——这就是ASK调制。

抓到的波形要检查几个东西:第一,调制深度是不是在2%左右。如果深度明显偏大或者偏小,回去调REG_ASK_DEPTH。第二,控制误差包的周期是不是4ms。如果周期不对,检查REG_CTRL_PERIOD的写入值。第三,接收端整流后的电压是不是稳定在5V附近。如果电压一直在振荡,先把REG_CTRL_GAIN降到0,看看是不是增益太大导致的。如果降到0还振荡,那可能是发射端的响应太慢,需要换一个发射端模组。

下面这段Python代码是用示波器抓数据之后做简单分析的例子,可以算调制深度和控制周期。

import numpy as np # 假设从示波器导出的数据是两列:时间(us) 和 电压(mV) data = np.loadtxt('scope_data.csv', delimiter=',') t = data[:, 0] v = data[:, 1] # 计算包络:用滑动窗口找局部最大值 window_size = 50 envelope = np.array([np.max(v[i:i+window_size]) for i in range(len(v)-window_size)]) # 计算调制深度:包络的峰峰值除以平均值 v_pp = np.max(envelope) - np.min(envelope) v_avg = np.mean(envelope) mod_depth = v_pp / v_avg * 100 # 百分比 print(f"调制深度: {mod_depth:.2f}%") # 计算控制周期:找包络的周期性 # 用 FFT 找主频 envelope_centered = envelope - np.mean(envelope) fft_result = np.fft.fft(envelope_centered) freqs = np.fft.fftfreq(len(envelope_centered), d=(t[1]-t[0])*1e-6) # 转成 Hz dominant_freq = freqs[np.argmax(np.abs(fft_result[1:len(freqs)//2]))+1] period = 1 / dominant_freq * 1e6 # 转成 us print(f"控制周期: {period:.0f} us")

这段代码先算调制深度,再算控制周期。调制深度的计算是用包络的峰峰值除以平均值。控制周期是用FFT找包络的主频,然后取倒数。实际用的时候,如果示波器数据有噪声,可以先做一个低通滤波再算。另外,窗口大小要根据采样率调整——如果采样率是10MSa/s,窗口50个点就是5微秒,对于2kHz的ASK信号来说够用了。

4. 调试无线充电系统时最容易翻车的几个地方

4.1 现象:充电断断续续,几秒就断一次

原因:最常见的是Ping阶段的信号强度包没发出去或者发错了。接收端在Ping阶段要回一个信号强度包,这个包的内容是接收端感应到的电压幅度。如果这个值设得太低,发射端会认为接收端不需要功率,直接回到Selection阶段。如果设得太高,发射端可能会过冲。

解决:用示波器抓Ping阶段的波形,看接收端有没有在正确的时隙里发信号。然后检查RT1650的REG_SIGNAL_STRENGTH寄存器(假设地址是0x15),确保写入的值跟实际感应电压匹配。一般建议把这个值设在感应电压的50%到70%之间。

4.2 现象:电压调节振荡,示波器上看到5V上下跳

原因:控制误差增益太大,或者控制周期太短。增益太大导致系统对误差反应过度,周期太短导致ASK包还没发完下一个包就来了,发射端来不及响应。

解决:先把REG_CTRL_GAIN降到0,看振荡是否消失。如果消失,逐步增加增益,每次加0.1,直到振荡刚好不出现。如果降到0还振荡,把REG_CTRL_PERIOD从4000us增加到8000us,看是否改善。如果还不行,检查发射端的响应时间——有些发射端模组的响应时间超过10ms,这种模组不适合做动态负载测试。

4.3 现象:ASK解调误码率高,通信经常失败

原因:调制深度不够,或者参考电平没校准好。调制深度不够的话,发射端检测到的幅度变化太小,解调不出来。参考电平没校准好的话,包络的直流分量偏移会导致比较器输出错误。

解决:先把REG_ASK_DEPTH从20增加到40(也就是4%),看误码率是否下降。如果下降,说明是深度不够。如果没变化,检查REG_REF_DAC的值——在Ping阶段之后读一下这个寄存器,看芯片自动校准到了多少。如果校准值跟理论值差很远,可能是线圈耦合系数不对,需要调整线圈距离或者换线圈。

4.4 现象:效率低,发射端发热严重

原因:调制深度太大,导致接收端在通信时消耗了太多功率。或者线圈匹配不好,谐振频率偏移导致无功功率大。

解决:先把REG_ASK_DEPTH降到10(1%),看效率是否提升。如果提升不明显,用LCR表重新量线圈的电感和品质因数,确保发射端和接收端的谐振频率都在100kHz附近。如果频率偏移超过5%,换线圈或者加谐振电容调整。

4.5 现象:RT1650启动不了,I2C读不到ID

原因:供电电压不够,或者I2C上拉电阻没接。RT1650的供电范围是3.3V到5V,如果低于3.3V,芯片可能不启动。I2C的上拉电阻一般是4.7k欧姆,如果没接或者阻值太大,通信会失败。

解决:先用万用表量RT1650的VDD引脚,确保在3.3V以上。然后量I2C的SDA和SCL引脚,看有没有上拉到VDD。如果没有,加两个4.7k欧姆的电阻。如果都有但还是读不到ID,检查I2C地址是不是设错了——RT1650的默认地址是0x3C,但有些版本可以通过引脚配置成0x3D。

5. 把控制误差包用出前馈效果:一个进阶技巧

前面讲的都是反馈控制——接收端测到电压偏差,然后发控制误差包让发射端调整。但反馈有个天生的问题:滞后。从负载突变到接收端测到偏差,再到发射端调整功率,中间至少隔了一个控制周期。如果负载变化很快,比如手机拍照时瞬间电流拉高,反馈来不及响应,电压就会掉一个坑。

一个实用的进阶技巧是加前馈。具体做法是:接收端在检测到负载电流突变的时候,不等电压偏差出现,直接根据电流变化量算一个前馈的控制误差值,叠加到反馈值上一起发给发射端。这样发射端在电压还没掉下来之前就开始加功率了。

实现上,可以在RT1650的固件里加一段逻辑:每1ms采样一次负载电流,如果电流变化超过50mA,就根据变化量算一个前馈项。前馈项的系数需要标定——一般用实验方法,给一个阶跃负载,看电压掉多少,然后反推系数。下面是一个简单的标定流程:

步骤操作记录
1负载从100mA跳到500mA记录电压最低点V_min
2负载从100mA跳到1A记录电压最低点V_min2
3计算前馈系数K = (V_target - V_min) / (500mA - 100mA)得到mV/mA
4把K写入REG_FF_GAIN寄存器完成标定

标定的时候要注意,前馈系数不能设太大,否则会过冲。一般先设理论值的70%,然后根据实际波形微调。另外,前馈只对负载突变有效,对缓慢变化的负载没用——缓慢变化还是靠反馈。

这个技巧我在几个动态负载场景里试过,电压跌落能从300mV降到100mV以内。但代价是固件复杂度上去了,而且前馈系数需要针对不同的负载特性重新标定。如果产品负载比较固定,这个投入是值得的;如果负载变化范围很大,可能还是老老实实把反馈周期缩短更省事。

最后说一个血泪教训:调试无线充电的时候,千万别只盯着接收端。发射端的解调电路和响应速度同样关键,有时候接收端调了半天没效果,换一个发射端模组问题就没了。我一般会先确认发射端能正确解调ASK,再调接收端的参数。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询