▌01 无线电能传输
1.背景介绍
在 第十六届全国大学生智能车竞赛 中包括了一组无线节能组。通过无线信标发送的高频(150kHz,遵循 无线充电(电力传输)设备无线电管理暂行规定 )磁场获得最大 不超过50W 的充电功率,为车模上的 超级法拉电容 充电。
由于充电功率最高限制,因此车模所使用的电量越小,所需充电时间越少,进而节省了比赛时间。
▲ 新版无线信标功率发送板
相比于 往届无线节能组 的充电方案,今年节能信标组在无线电磁波频率、 输出功率上限 ,还是在 恒功率控制方案 等方面都与之前无线节能组比赛系统有所不同,所以在高效电能接收方面也会与以前电能接收不同。
2.往届无线电能接收方案
在以前智能车竞赛无线节能组电能接收方面,主要方式有两大类:
- 恒功率接收方案。这个方案在 如何把大象装进冰箱 中进行量描述。很多参赛队伍在此基础上进行了改进。
- 简单直接充电方案,也称傻充方案。这个方案可以参见 如何制作640k无线接收器 公众号推文中的诗篇介绍。
由于往届无线充电功率较小,虽然电能发送模块限制为30W,但是实际电路接收到的功率也只有十几瓦,因此无论是恒功率接收、还是建议接收方案都不会对电路有特殊的要求。
▲ 往届小巧的无线节能车模
但是随着充电功率的增加,在无线电能接收方案、电路制作、器件选择等方面都需要进一步的优化,以保证充电电路的高效、可靠。
3.电能发送与接收线圈
无线电能传送是通过发送与接收线圈完成的。根据 无线节能信标核心板V4-测试-2021-4-3 对于无线信标测试结果来看,无线发送线圈的基本参数如下:
-
线圈的基本参数:
-
电感(uH):30.58
电阻(Ω):0.108
重量(g):88.2
尺寸:内径:17.5cm;外径:20.8cm
匝数:9匝
▲ 无线发送线圈与检测接收线圈
作为节能信标组的车模, 竞赛规则 允许自制车模。为了达到节能的目的,车模往往制作的非常轻便。这样也就使得接收线圈越小越好。比如下面的这个接收线圈直径之后10厘米左右,重量47克(一两左右)。相比直接使用与发送线圈一样的线圈作为无线电能接收线圈,它就比较好安装。
-
线圈的基本参数:
-
电感(uH):13.79
电阻(Ω):0.068
重量(g):47
尺寸:内径:7.1cm;外径10.9cm
匝数:10匝
▲ 测量线圈的重量
使用小线圈接收电能所到来的问题螨去除它与发送线圈之间的互感量较小。比如通过测量大线圈与小线圈之间的串联电感的方式,可以得到当小线圈位于大线圈中心位置时,两个线圈之间的互感系数大约只有0.2左右。
-
互感测量参数:
-
同相串联电感:Ls= 52.57 uH
反向串联电感:Lr= 35.94 uH
互感M= 4.16 uH
互感系数:k=0.203
所以需要设计良好的外部补偿LC网络,来提高电能接收的功率和效率。
▌02 电能接收基本方案
1.测量接收线圈感应电压
(1)相同高度下接收电压
将接收线圈与发送线圈放在相同高度,中心重合。使用DM3068数字万用表的交流档测量接收线圈中的交变电压为: U s = 10.299 V U_s = 10.299V Us=10.299V。
直接测量发射线圈两端电压: U p = 75.05 V U_p = 75.05V Up=75.05V。
如果根据前面测量大线圈的电感 L p = 30.58 μ H L_p = 30.58\mu H Lp=30.58μH,两个线圈之间的互感: M 12 = 4.16 μ H M_{12} = 4.16\mu H M12=4.16μH。则可以计算接收线圈中的电压理论值为:
U s ∗ = M 12 L p ⋅ U p = 4.16 30.58 × 75.05 = 10.21 V U_{s*} = {{M_{12} } \over {L_p }} \cdot U_p = {{4.16} \over {30.58}} \times 75.05 = 10.21V Us∗=LpM12⋅Up=30.584.16×75.05=10.21V
可以看到这与直接测量的结果是相符的。
▲ 将接收线圈放置于发送线圈中心
(2)不同高度下的接受电压
下图是显示了接收线圈距离发射线圈在 0 ~ 80mm不同高度下的接受电压。
▲ 不同高度下感应交流电压
通过测量曲线可以看出,随着接收线圈高度增加,电压近似呈现线性下降。下降的比例大约是: -0.843V/cm。
▲ 机械滑轨带动接收线圈上下移动
2.谐振电容
由于在无线发送模块对线圈采用了 LCC网络补偿 ,可以保证发送线圈电流呈现恒流状态。所以在接收线圈中的感应电动势为恒定电压值。如果直接采用全波整流,或者倍压整流来将接收到的交流电压信号转换成直流信号,则需要给线圈串联上谐振电容,来抵消接收线圈的电感。
根据前面对接收小线圈的电感测量, L s = 13.79 μ H L_s = 13.79\mu H Ls=13.79μH,所以在无线频率 f 0 = 150 k H z f_0 = 150kHz f0=150kHz下,谐振电容容量为:
C s = 1 ( 2 π f 0 ) 2 ⋅ L s = 1 ( 2 π ⋅ 150 k ) 2 × 13.79 μ = 81.64 n F C_s = {1 \over {\left( {2\pi f_0 } \right)^2 \cdot Ls}} = {1 \over {\left( {2\pi \cdot 150k} \right)^2 \times 13.79\mu }} = 81.64nF Cs=(2πf0)2⋅Ls1=(2π⋅150k)2×13.79μ1=81.64nF
由于使用在高频高压下, 所以电容需要使用 C0G(NP0) 这类高频损耗小的电容。
3.全波整流与倍压整流
(1)肖特基二极管
由于是高频电压信号,因此使用肖特基二极管可以提高整流效率。在 两个大功率肖特基二极管的V-A特性 中对比了两个大功率整流肖特基二极管的V-I特性。可以看到标称为10A的肖特基二极管在通过3A电流时的到通电压降比5A的肖特基二极管小75mV。
▲ 大功率整流肖特基二极管
我手边5A规格的肖特基二极管比较多,所以下面的实验采用5A肖特基二极管搭建全波整流和倍压整流电路。
利用 粘贴铜箔简易实验电路制作 测试整流电路。如下图所示,包括全桥整流以及倍压整流电路。
▲ 使用粘贴铜箔制作的整流测试电路
(2)全波整流
a)空载电压
测量所得到的空载电压为: U o = 16.65 V U_o = 16.65V Uo=16.65V。
b)10Ω负载
在输出直流电压上施加10Ω的电阻负载。
▲ 施加10欧姆(三个30欧姆并联)负载
-
测量结果:
-
电源输入电流:0.5253A
负载电压:9.61V
传输效率:
-
输入功率:
P
i
n
=
24
×
0.5253
=
12.61
W
P_{in} = 24 \times 0.5253 = 12.61W
Pin=24×0.5253=12.61W
输出功率 P o u t = U l o a d 2 / R l o a d = 9.6 1 2 / 10 = 9.23 W P_{out} = U_{load}^2 /R_{load} = 9.61^2 /10 = 9.23W Pout=Uload2/Rload=9.612/10=9.23W
整体传输效率: η = P l o a d / P i n = 9.23 / 12.61 = 73.2 % \eta = P_{load} /P_{in} = 9.23/12.61 = 73.2\% η=Pload/Pin=9.23/12.61=73.2%
c)电子负载
利用 基于ZIGBEE通信的功率电子负载 来测试在不同负载电流下输出电压的大小。可以看到在输出电流在0.25A ~ 1.5A 之间,输出电压呈现较为恒定的情况。在电流大于1.5A,出现了电压激增,同时能够听到负载出现轻微的蜂鸣声音,表示此事,负载在振荡。为什么会出现这种情况,现在不清楚。
▲ 不同输出电流输出电压
根据采集到的输出电压电流,在与供电DH1766输出电流计算出的电源功率相比,可以计算出在不通电流下系统无线电能传输效率。如下图所示:
由图可以看到,数据的确出现了问题,也就是传输出效率出现大于100%!。因此在此过程中,应该是输出电压测试出现了问题。
▲ 在不同的输出电流情况下功率传输效率
前面的数据是使用FLUKE45测试电压。下面使用DM3068测量输出电压,在重新测试一次。
▲ 在不同输出电流下测量输出电压
▲ 在不同输出电流下功率传输效率
(3)倍压整流
a)空载电压
测量空载下输出电压: U 0 = 29.29 V U_0 = 29.29V U0=29.29V。
b)10欧姆负载
-
测量结果:
-
电源输入电流:1.69A
负载电压:16.8V
传输效率:
-
输入功率:
P
i
n
=
24
×
1.69
=
40.56
W
P_{in} = 24 \times 1.69 = 40.56W
Pin=24×1.69=40.56W
输出功率 P o u t = U l o a d 2 / R l o a d = 16. 8 2 / 10 = 28.224 W P_{out} = U_{load}^2 /R_{load} = 16.8^2 /10 = 28.224W Pout=Uload2/Rload=16.82/10=28.224W
整体传输效率: η = P l o a d / P i n = 28.224 / 40.56 = 69.6 % \eta = P_{load} /P_{in} = 28.224/40.56 = 69.6\% η=Pload/Pin=28.224/40.56=69.6%
c)电子负载
▲ 不同的输出电流下对应的输出电压
▲ 不同的输出电流下对应的功率传输效率
▌03 使用LCC网络补偿
由于未来电能是往储能法拉电容充电,它的端口电压是从0V开始逐步增高。如果按照前面全波整流,倍压整流对应的恒压输出,则会造成电流波动大。下面通过LCC补偿电流来使得充电电流达到恒定。
1.LCC参数补偿
采用在 无线充电系统在输出部分采用LCC拓扑结构综述研究 中给出的双边LCC补偿结构,来提高接收效率。
▲ Double-Sided LCC compensation Topology
(1)设计条件
-
假设设计输出电流 I 0 = 3 A I_0 = 3A I0=3A。
-
选择输入电压 U 0 = 10 V U_0 = 10V U0=10V。
-
接收线圈电感: L 0 = 13.79 μ H L_0 = 13.79\mu H L0=13.79μH。
-
工作频率: f 0 = 150 k H z f_0 = 150kHz f0=150kHz
(2)LCC参数计算
-
LCC 基本电抗 X 0 = U 0 I 0 = 3.333 Ω X_0 = {{U_0 } \over {I_0 }} = 3.333\Omega X0=I0U0=3.333Ω。
-
输出电感: L s = X 0 2 π f 0 = 3.333 2 π × 150 k H z = 3.54 μ H L_s = {{X_0 } \over {2\pi f_0 }} = {{3.333} \over {2\pi \times 150kHz}} = 3.54\mu H Ls=2πf0X0=2π×150kHz3.333=3.54μH
-
并联电容: C p = 1 2 π f 0 X 0 = 1 2 π × 150 k H z × 3.333 = 318.3 n F C_p = {1 \over {2\pi f_0 X_0 }} = {1 \over {2\pi \times 150kHz \times 3.333}} = 318.3nF Cp=2πf0X01=2π×150kHz×3.3331=318.3nF
-
串联电容: C s = 1 ( 2 π f 0 ) 2 ( L 0 − L s ) = 1 ( 2 π × 150 k H z ) 2 ( 13.79 − 3.54 ) μ H = 109.8 n F C_s = {1 \over {\left( {2\pi f_0 } \right)^2 \left( {L_0 - L_s } \right)}} = {1 \over {\left( {2\pi \times 150kHz} \right)^2 \left( {13.79 - 3.54} \right)\mu H}} = 109.8nF Cs=(2πf0)2(L0−Ls)1=(2π×150kHz)2(13.79−3.54)μH1=109.8nF
2.LCC器件制作
电感采用在 节能无线信标灯的几点补充测实验 所使用的 T106-2磁环,使用200股的Litz线绕制15匝,电感为 3.478 μ H 3.478\mu H 3.478μH。
电容使用 0.22 μ F 0.22\mu F 0.22μF电容经过串并而形成。
▲ LCC补偿网络器件
使用粘贴铜箔制作测试电路,将上面的LCC补偿网络搭建起来,最后使用全波整流电路输出接收直流电能。
3.测试LCC网络
将10欧姆功率电阻连接在整流桥输出网络。将接收线圈放置在发射线圈中间。
▲ 使用粘贴铜箔制作测试电路
-
测试结果:
-
电源输出电流:2.41A
负载电压:19V
计算结果:
-
输入功率:
P
i
n
=
24
×
2.41
=
57.84
W
P_{in} = 24 \times 2.41 = 57.84W
Pin=24×2.41=57.84W
输出功率: P o u t = 1 9 2 / 10 = 36.1 W P_{out} = 19^2 /10 = 36.1W Pout=192/10=36.1W
功率传输效率: η = P o u t / P i n = 36.1 / 57.84 = 62.4 % \eta = P_{out} /P_{in} = 36.1/57.84 = 62.4\% η=Pout/Pin=36.1/57.84=62.4%
从测试结果来看,输出电流只有1.9A左右,并没有达到所需要3A。这其中的原因有待进一步讨论。
传输效率比起前面直接使用全波整流降低了。
4.线圈的位置
将小线圈放置在大线圈不同的位置,输出的功率不同。前的实验中,如果将小线圈放置在大线圈的正中央,开始输出的电压只有16V左右。如下将小线圈放置在大线圈的边缘,则输出的电压就会大大提高。
▲ 将接收线圈靠近大线圈的边缘,输出功率增加
-
测试结果:
-
电源输出电流:2.93A
负载电压:21.18V
计算结果:
-
输入功率:
P
i
n
=
24
×
2.93
=
70.32
W
P_{in} = 24 \times 2.93 = 70.32W
Pin=24×2.93=70.32W
输出功率: P o u t = 21.1 8 2 / 10 = 44.86 W P_{out} = 21.18^2 /10 = 44.86W Pout=21.182/10=44.86W
功率传输效率: η = P o u t / P i n = 44.86 / 70.32 = 63.8 % \eta = P_{out} /P_{in} = 44.86/70.32 = 63.8\% η=Pout/Pin=44.86/70.32=63.8%
▌04 对法拉电容充电
1.使用LCC补偿网络
利用第三部分的LCC补偿网络,后接桥整流电路,将直流输出接法拉电容。使用电流钳测量充电电流。
▲ 充电电流与电容两端电压
使用电流钳获得的充电电流3.5A。
对于15F电容,充电到12V,只用了15秒钟。可以计算出充电的平均功率:
下面是对60F电容进行充电,采样时间放低了一半。
▲ 电容充电电流与端口电压
2.不使用LCC补偿网络
直接将接收线圈连接整流桥,对于法拉电容进行充电。
下图采集数据的时间方便5倍时间。可以看到充电电流非常小。随着电容电压增加,充电电流逐步下降。
▲ 充电电流与电容两端电压
▲ 充电电流与电容两端电压
下面是针对60F的电容进行充电的过程,采样速度降低了一半。
▲ 电容充电电流与端口电压
▌实验总结
前面可以看到在新的无线节能组中,使用充电或者LCC补偿充电方式都可以完成对于电能的接收与存储。它们各自有各自的特点。
■ 相关文献链接:
- 第十六届全国大学智能汽车竞赛竞速比赛规则
- 无线充电(电力传输)设备无线电管理暂行规定
- 无线节能信标调试说明-2021-3-3
- 超级法拉电容
- 第十三届智能车竞赛节能组无线充电系统说明
- 节能无线信标Ver0:功率测试
- 无线信标功能调试-2021-3-9-输出功率恒定限制
- 如何把大象装进冰箱
- 如何制作640k无线接收器
- 无线节能信标核心板V4-测试-2021-4-3
- 使用LCC网络补偿设计无线功率系统
- C0G(NP0) 电容的耐压测试
- 两个大功率肖特基二极管的V-A特性
- 粘贴铜箔简易实验电路制作
- 基于ZIGBEE通信的功率电子负载
- 无线充电系统在输出部分采用LCC拓扑结构综述研究
- 节能无线信标灯的几点补充测实验
▌附件
1.步进电机驱动程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LSCM8.PY -- by Dr. ZhuoQing 2020-01-14
#
# Note:
#============================================================
from head import *
import serial
#------------------------------------------------------------
cmdportdef = 'COM2'
cmdport = serial.Serial(cmdportdef, baudrate=115200, timeout=0.1)
cmdport.setDTR(False)
#cmdport.setRTS(False)
printf("Open %s for LSCM8."%cmdportdef)
#------------------------------------------------------------
COMMAND_FRAME_HEAD = 0x56
COMMAND_FRAME_TAIL = 0x65
COMMAND_STATUS_WAIT = 0x0
COMMAND_STATUS_COMMAND = 0x1
COMMAND_STATUS_LENGTH = 0x2
COMMAND_STATUS_DATA = 0x3
COMMAND_STATUS_CHECK = 0x4
COMMAND_STATUS_TAIL = 0x5
#------------------------------------------------------------
COMMAND_HELLO_ECHO = 0x20
COMMAND_BEEP_ON = 0x21
COMMAND_BEEP_OFF = 0x22
COMMAND_DIR_ON = 0x23
COMMAND_DIR_OFF = 0x24
COMMAND_REL_ON = 0x25
COMMAND_REL_OFF = 0x26
COMMAND_PUL_SET = 0x27
COMMAND_PUL_STOP = 0x28
COMMAND_GOTO_HEAD = 0x29
COMMAND_GOTO_TAIL = 0x2A
COMMAND_GET_STATE = 0x2B
COMMAND_GET_PULSEOUT = 0x2C
COMMAND_CLEAR_PULSEOUT = 0x2D
#------------------------------------------------------------
def lscm8cmd(cmd, cmddata):
checksum = cmd + len(cmddata)
for cd in cmddata:
checksum = checksum + cd
checksum = (checksum & 0xff) ^ 0xff
cmdstr = b'' + byte(COMMAND_FRAME_HEAD) + byte(cmd) + byte(len(cmddata)) +\
cmddata + byte(checksum) + byte(COMMAND_FRAME_TAIL)
# printf(cmdstr)
cmdport.write(cmdstr)
def lscm8hello():
lscm8cmd(COMMAND_HELLO_ECHO, b'')
def lscm8beepon():
lscm8cmd(COMMAND_BEEP_ON, b'')
def lscm8beepoff():
lscm8cmd(COMMAND_BEEP_OFF, b'')
#------------------------------------------------------------
def lscm8relon(bits):
cmd = bits.to_bytes(1, byteorder='big')
lscm8cmd(COMMAND_REL_ON, cmd)
#------------------------------------------------------------
# bits:0:relay0, 1:relay1
def lscm8reloff(bits):
cmd = bits.to_bytes(1, byteorder='big')
lscm8cmd(COMMAND_REL_OFF, cmd)
def lscm8diron(bits):
cmd = bits.to_bytes(1, byteorder='big')
lscm8cmd(COMMAND_DIR_ON, cmd)
def lscm8diroff(bits):
cmd = bits.to_bytes(1, byteorder='big')
lscm8cmd(COMMAND_DIR_OFF, cmd)
#------------------------------------------------------------
def lscm8setpulse(bits, pulse):
cmd = bits.to_bytes(1, byteorder='big') +\
pulse.to_bytes(4, byteorder='big')
lscm8cmd(COMMAND_PUL_SET, cmd)
def lscm8stoppulse():
lscm8cmd(COMMAND_PUL_STOP, b'')
def lscm8gotohead():
lscm8cmd(COMMAND_GOTO_HEAD, b'')
def lscm8gototail():
lscm8cmd(COMMAND_GOTO_TAIL, b'')
def lscm8clearpulseout():
lscm8cmd(COMMAND_CLEAR_PULSEOUT, b'')
def lscm8mf(steps):
lscm8diron(3)
lscm8reloff(3)
lscm8setpulse(3, steps)
def lscm8mb(steps):
lscm8diroff(3)
lscm8reloff(3)
lscm8setpulse(3, steps)
#------------------------------------------------------------
if __name__ == "__main__":
time.sleep(.5)
# lscm8diron(3)
# lscm8reloff(3)
# lscm8gotohead()
# lscm8gototail()
# lscm8setpulse(3, 1000)
# lscm8diron(3)
# lscm8mb(1000)
lscm8mf(1900)
tspbeep(1500, 100)
printf('End of the command')
#------------------------------------------------------------
# END OF FILE : LSCM8.PY
#============================================================
2.测量不同高度下接收线圈电压
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-04-04
#
# Note:
#============================================================
from headm import *
import lscm8
from tsmodule.tsvisa import *
dm3068open()
vdim = []
for i in range(80):
lscm8.lscm8mb(1000)
time.sleep(1)
volt = dm3068vac()
printff(i, volt)
vdim.append(volt)
tspsave('measure', v=vdim)
lscm8.lscm8mf(80000)
plt.plot(vdim)
plt.xlabel("n")
plt.ylabel("voltage(v)")
plt.grid(True)
plt.tight_layout()
plt.show()
printf("\a")
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
3.采集不同输出电流下的整流输出电压
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2021-04-04
#
# Note:
#============================================================
from headm import *
from tsmodule.tshardware import *
from tsmodule.tsstm32 import *
from tsmodule.tsvisa import *
dm3068open()
setv = linspace(0, 2000, 50)
vdim = []
idim = []
busi = []
ivratio = 11.54
for v in setv:
zbcmd(b'clzigbee %d'%int(v))
time.sleep(2)
meter = meterval()
current = meter[3] * ivratio
voltage = dm3068vdc()
vdim.append(voltage)
idim.append(current)
busi.append(dh1766curr())
printff(v, voltage, current)
tspsave('cvmeas1', volt=vdim, curr=idim, busi = busi)
zbcmd(b'clzigbee 0')
plt.plot(idim, vdim)
plt.xlabel("Current(A)")
plt.ylabel("Voltage(V)")
plt.grid(True)
plt.tight_layout()
plt.show()
printf('\a')
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
4.采集充电电流与电容端口电压
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# PYTEST1.PY -- by Dr. ZhuoQing 2021-04-04
#
# Note:
#============================================================
from machine import ADC,Pin
from time import sleep_ms
adc1 = ADC(Pin(32))
adc2 = ADC(Pin(33))
adc1dim = []
adc2dim = []
SAMPLE_NUM = const(256)
SLEEP_TIME = const(100)
AVERAGE_NUM = const(128)
print("Begin to sample %d number."%SAMPLE_NUM)
for _ in range(SAMPLE_NUM):
adn = [adc1.read() for _ in range(AVERAGE_NUM)]
adc1dim.append(sum(adn) / AVERAGE_NUM)
adn = [adc2.read() for _ in range(AVERAGE_NUM)]
adc2dim.append(sum(adn) / AVERAGE_NUM)
print(len(adc1dim), len(adc2dim))
sleep_ms(SLEEP_TIME)
print(adc1dim)
print(adc2dim)
#------------------------------------------------------------
# END OF FILE : pytest1.PY
#============================================================
5.绘制充电电流与电容端口电压
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# PYDRAW.PY -- by Dr. ZhuoQing 2021-04-04
#
# Note:
#============================================================
from headm import *
def thonnycmd(cmd):
tspsendwindowkey('Thonny', 's', alt=1)
tspsendwindowkey('Thonny', '%s'%cmd)
tspsendwindowkey('Thonny', 's', alt=1)
tspsendwindowkey('Thonny', 'ac', control=1)
pastestr = clipboard.paste()
data1 = [float(s) for s in pastestr.split('[')[-2].split(']')[0].split(',')]
data2 = [float(s) for s in pastestr.split('[')[-1].split(']')[0].split(',')]
plt.plot(data1, label='Voltage')
plt.plot(data2, label='Current')
plt.xlabel("n")
plt.ylabel("Voltage")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : PYDRAW.PY
#============================================================