esp32怎么连接电池 esp32电池供电方案_无线充电

简 介: 在第十六届智能车竞赛中节能信标组是一个比较有特点的组别。它需要通过接受无线电能来完成对智能车的电能提供。对于使用LCC充电补充方案测试过程中,使用ESP32对于来自于HALL传感器得到的电流信号进行测检测。由于ESP32中的AD转换存在一个顶死区,所以通过标定后,才能够完成对于LCC充电过程的正确评估与测量。

关键词ESP32节能信标智能车竞赛测量

 

01 节能信标组


1.收割电能方法

  在 如何高效获取无线充电电能-无线节能组 中对于三种 节能信标组 中的电能收割方案进行测试:

  • 使用全波整流给法拉电容充电
  • 使用倍压整流给法拉电容充电
  • 使用LCC补偿网络+全波整流给法拉电容充电

  实验中对于充电电压、电流的测量,综合反映各种方法对于 节能型表无线充电模块 的性能进行测量。

  本文也将对于不同线圈(大线圈、小线圈)的电能收割方式进行对比。

2.ESP32信号采集

EPS32 模块具有思路ADC输入通道,分别位于Pin32,Pin33,PIn34,PIn35。可以通过编程对于外部采集信号进行等间距采集。这比使用实验台上的万用表可以提供时间间隔更加精确、采集速率更高的信号采集。

  在 如何高效获取无线充电电能-无线节能组 中,由于没有对ESP32采集进行标定(包括时间和电流、电压),所以所获得的数据只能定性的分析,无法定量来对接收电路、发送电路的性能进行计算。

  下面将会对ESP32采集方案进行标定之后在进行测试。

 

02 ESP32采集标定


  ESP32de ADC通道,在缺省的情况下,将输入0 ~ 1V之间的电压信号转换成 0 ~ 0xfff(12bits)信号,由于模块噪声,建议在标定和采集的时候对于采集到的电压信号采用平均平滑进行低通滤波。

sum([adc1.read() for _ in range(AVERAGE_NUM)])//AVERAGE_NUM

  注意:对于ESP32的ADC存在一个输入的截止区。这个问题可以单独进行标定。

  下图的显示了ESP32对于外部电压测量存在的截止特性。

esp32怎么连接电池 esp32电池供电方案_时间延迟_02


▲ 输入电压与读出数值

1.电压标定

(1)输入电路


分压电阻:

R1=20.02kΩ

R2=1.000kΩ


esp32怎么连接电池 esp32电池供电方案_2d_03

(2)测量结果
  • 输入电压:9.003V;分压后的电压为:0.440V(理论值为:0.429V)
  • 读出数值:1500
  • 分压常量:k=166.61

  注意:标定后的电压分压常量k与理论计算值相差17.1%。这个误差主要来自于ESP32的ADC转换常量,如果读出的1500,对应的ADC应该是:0.3663V,但实际上为0.440。为什么会有这样的差异?,原因不得而知。

※ 问题解释 根据前面对于ESP32输入存在的截止区,可以看到ADC并不是与外部的输入电压呈现严格的线性关系。因此,前面对应的问题。

2.电流标定

  使用电流钳将电流转换成电压信号。

  • 输入电流:5A
  • 采集读数:1928
  • 电流常量:esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_04

  由于ESP32 ADC输入存在着截止特性,因此对于输入电流特性严格来讲,应该需要两个标定参数,比率与截距。

3.时间标定

  根据 MicroPython中ESP32快速参考 对于 Delay&Timing 的介绍,使用一下time模块来测量时间延迟:

import time

time.sleep(1)           # sleep for 1 second
time.sleep_ms(500)      # sleep for 500 milliseconds
time.sleep_us(10)       # sleep for 10 microseconds
start = time.ticks_ms() # get millisecond counter
delta = time.ticks_diff(time.ticks_ms(), start) # compute time differenc

esp32怎么连接电池 esp32电池供电方案_2d_05


▲ 测量法拉电容充电电流与电容电压

 

03 充电过程测试


1.LCC补偿充电

  如下是LCC充电方案充电电流与电容电压曲线。

esp32怎么连接电池 esp32电池供电方案_2d_06


▲ LCC充电方案充电电流与电容电压

2.全桥整流充电

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_07


▲ 全桥整流充电电流与电容端口电压

3.倍压整流充电

esp32怎么连接电池 esp32电池供电方案_时间延迟_08


▲ 倍压整流充电电流与电容端口电压

  通过前面的对比,可以看到使用LCC补偿之后,对于60F(五个串联,最终形成的电容为12F)充电速度最快。

 

04 是否可以再快一些?


  在前面的测试中,可以看到并没有达到发射模块所允许的最大功率。可否能够进一步提高充电速度呢?

1.改进的方案

(1)使用10A肖特基二极管

  在前面的实验中,LCC补偿电路后期的电路中的整流肖特基二极管使用的在5A的二极管。将其改成10A的肖特基二极管。

(2)改进LCC网络参数

  LCC网络参数是在 如何高效获取无线充电电能-无线节能组 安装充电电流为3A来设计的。下面使用5A的标准来设计LCC参数。

【1.设计条件】

参数名称

数值

单位

输出电流esp32怎么连接电池 esp32电池供电方案_无线充电_09

5

A

输入电压esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_10

10

V

接收线圈电感esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_11

13.79

esp32怎么连接电池 esp32电池供电方案_时间延迟_12

工作频率esp32怎么连接电池 esp32电池供电方案_时间延迟_13

150

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_14

【2.设计参数】

参数名称

公式

数值

单位

LCC基本电抗

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_15

esp32怎么连接电池 esp32电池供电方案_2d_16

Ω

输出电感

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_17

esp32怎么连接电池 esp32电池供电方案_2d_18

esp32怎么连接电池 esp32电池供电方案_时间延迟_12

并联电容

esp32怎么连接电池 esp32电池供电方案_无线充电_20

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_21

nF

串联电容

esp32怎么连接电池 esp32电池供电方案_无线充电_22

esp32怎么连接电池 esp32电池供电方案_无线充电_23

nF

上述表格的计算,可以参照下面由参加智能车竞赛的学生自行开发的 LCC 计算器小程序 :


esp32怎么连接电池 esp32电池供电方案_时间延迟_24


▲ LCC计算小程序


2.制作LCC补偿网络

  使用粘贴铜箔制作实验电路板。使用200股Litz线在 T106-2 磁芯上绕制10匝制作电感。并联和串联电容通过使用多个电容进行并联组成。如下是实际期间的测量参数。

【3.实际LCC参数】

LCC参数

数值

单位

串联电感

esp32怎么连接电池 esp32电池供电方案_2d_25

esp32怎么连接电池 esp32电池供电方案_时间延迟_12

并联电容

esp32怎么连接电池 esp32电池供电方案_无线充电_27

nF

串联电容

esp32怎么连接电池 esp32电池供电方案_2d_28

nF

  将原来的肖特基二极管从5A改成10A,组成高频整流桥电路。将输出挂接在12F(12V,由5个60F/2.7V法拉电容串联而成)法拉电容上进行充电。

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_29


▲ LCC补偿电路

3.充电测试

  下面分别对于三种不同容量的法拉电容进行充电。法拉电容的耐压都是12V,均由五个内压为2.7V的法拉电容串联而成。电容的容量分别为12F,2.4F,36F。

1.法拉电容容量:12F

  下图显示了四点电流与法拉电容端口电压之间的关系。可以看到电容电压从0V上升到12V只使用了32秒钟。而在原来的充电方案中,这个充电过程则耗费了将近50秒中的时间。

  充电电流平均值在5A左右,与设计的参数基本一致。

esp32怎么连接电池 esp32电池供电方案_2d_30


▲ 充电电流与电容电压

esp32怎么连接电池 esp32电池供电方案_esp32怎么连接电池_31


▲ 12F 电容组

  下面是重新充电的过程。仔细观察充电过程,可以看到它分为两个阶段:

  • 第一个阶段是在电压没有超过10V的时候,电流基本上维持在5A左右;这部分的恒流是由LCC补偿电路做引起的。
  • 第二阶段是电容电压超过10V,电流随着电容的电压增加而逐步降低;这部分充电电流下降主要是由于无线发送模块输出功率限制而引起的。

esp32怎么连接电池 esp32电池供电方案_2d_32


▲ 充电电流与电容端口电压曲线

2.法拉电容容量2.4F

  下图显示了对于2.4F(由五个12F/2.7V的法拉电容串联而成)的法拉电容充电过程。将电压冲到12V使用10秒钟的时间。

esp32怎么连接电池 esp32电池供电方案_时间延迟_33


▲ 充电电流与电容端口电压曲线

![]( ==1680x)

3.法拉电容容量36F

  下图则显示使用了90秒左右的时间将36F(由5个180F/2.7V法拉电容串联而成)法拉电容冲到12V电压。

esp32怎么连接电池 esp32电池供电方案_无线充电_34


▲ 充电电流与电容端口电压曲线

esp32怎么连接电池 esp32电池供电方案_时间延迟_35


▲ 36F 电容组

4.对比直充方式

  如果不使用LCC补偿电路,直接将线圈串联谐振电容连接到整流桥上,对12F电容组进行充电。整流桥仍然使用10A的肖特基二极管。

  下面是采集到的充电电流与电容电压数据曲线。

esp32怎么连接电池 esp32电池供电方案_2d_36


▲ 充电电流与电容两端电压

  对比可以看到,充电过程与前面LCC补偿过程很相似,只是充电电流下降到3A左右。充电到12V大约需要50秒的时间。

 

▌实验结论


1.基本结论

  通过实验验证了使用使用LCC补偿电路获取更高充电功率的效果。

  整个充电过程分为两部分,第一部分是当电容电压小于10V时,充电电流呈现横流特性,主要是由LCC补偿电路的特性所引起的;

  第二部分是当电容电压超过10V,此时充电电流为5A,输出功率超过50W,此时无线发送模块开始限制输出功率,从而引起充电电流功率下降。

  使用LCC补偿电路完成电能充电适合恒定电压的电池充电。它可以保证充电电流比较稳定。但是对于法拉电容这类负载,由于它的端口电压是随电量的增加而上升,所以充电功率也是由0逐步增加到满载功率。因此平均下来,这种方案对于无线充电的功率利用只使用到了50% 。还有进一步提高的方案。

2.对比充电方式

  根据前面对于LCC补偿电路、全桥整流直充以及倍压整流直充的充电过程可以看到,使用LCC充电速度最快。但是需要对于该方式充电过压进行保护。

  使用全桥整流直充,也可以达到LCC补偿电路60%的充电速度。它不需要担心过压问题。因为当电容电压达到12V左右时,此时与线圈感应电压接近,充电会自动停止。

  使用倍压整流是充电速度最慢的方式。

3.接收线圈位置

  在前面实验过程中, 基本上保持接收线圈在发送线圈的边缘处,这样可以获得最大的感应电动势。

esp32怎么连接电池 esp32电池供电方案_2d_37


 

▌实验附件


1.测量ESP32输入ADC特性

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-04-05
#
# Note:
#============================================================

from headm import *
from tsmodule.tsvisa        import *

dp1308open(110)

dp1308p25v(5)

printf('\a')

def thonnycmd(cmd):
    tspsendwindowkey('Thonny', 's', alt=1, noreturn=1)
    tspsendwindowkey('Thonny', '%s\r'%cmd, noreturn=1)

def thonnyshs(cmd='', wait=0):
    tspsendwindowkey('Thonny', 's', alt=1)
    if len(cmd) > 0:
        tspsendwindowkey('Thonny', '%s\r'%cmd, noreturn=1)
    if wait > 0:
        time.sleep(wait)

    tspsendwindowkey('Thonny', 'ac', control=1, noreturn=1)
    return clipboard.paste()

setv = linspace(0, 12, 50)
ndim = []

for v in setv:
    dp1308p25v(v)
    time.sleep(1)
    str = [s for s in thonnyshs('1', 0.2).split('\r\n') if len(s) > 0]
    ndim.append(int(str[-1]))

plt.plot(setv, ndim, label='ESP32 ADC')
plt.xlabel("Voltage(V)")
plt.ylabel("ADC")
plt.grid(True)
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()

printf(str)

#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

2.ESP32测量电流与电压

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# THP2.PY                      -- by Dr. ZhuoQing 2021-04-05
#
# Note:
#============================================================

from head import *

from machine                import ADC,Pin
import time

#------------------------------------------------------------
SAMPLE_NUM      = const(256)
AVERAGE_NUM     = const(128)
TIME_SLEEP      = const(200)

vdim = []
idim = []
tdim = []

vk = 1/166.61
ik = 0.00259

adc1 = ADC(Pin(32))
adc2 = ADC(Pin(33))
#------------------------------------------------------------

start = time.ticks_ms()
for _ in range(SAMPLE_NUM):
    adn = sum([adc1.read() for _ in range(AVERAGE_NUM)]) // AVERAGE_NUM * vk
    vdim.append(adn)

    adn = sum([adc2.read() for _ in range(AVERAGE_NUM)]) // AVERAGE_NUM * ik
    idim.append(adn)

    tdim.append(time.ticks_diff(time.ticks_ms(), start))
    print(len(vdim))

    time.sleep_ms(TIME_SLEEP)

print(tdim)
print(vdim)
print(idim)

#------------------------------------------------------------
#        END OF FILE : THP2.PY
#============================================================

3.测量ADC通道

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# THP1.PY                      -- by Dr. ZhuoQing 2021-04-05
#
# Note:
#============================================================

from machine                import ADC,Pin
import time

adc1 = ADC(Pin(32))
adc2 = ADC(Pin(33))

AVERAGE_NUM = const(128)

while True:
    num = sum([adc1.read() for _ in range(AVERAGE_NUM)]) // AVERAGE_NUM

    print(num)

    time.sleep_ms(100)

    inps = input('')

    if inps == 'e':
        break

print("User break.")

#------------------------------------------------------------
#        END OF FILE : thp1.PY
#============================================================