基于Realtek RTL8752CGF第三代智能充电仓弹窗功能的无线耳机充电座仓设计方案

一、前言
近年来随着智能无线耳机的普及,伴随无线耳机用的智能充电座需求也越来越大且愈发智能化趋势,通常无线耳机追求外形美观体积小巧而不得不采用超小型锂电池,其容量较小,必须不定期进行充电以随时随地满足人们出行时的通话及音频需求。因此智能充电座仓成为每个无线耳机用户的必配,而iPhone第三代的智能无线充电座的先进应用功能已经逐步深入每个用户的喜爱。基于此应用目的,全球消费电子第一大厂台湾Realtek芯片商强势推出新一代“基于RTL8752CGF第三代智能充电座仓弹窗功能”方案,已经成为业内的不二首选方案。


二、基于RTL8752CGF芯片的充电座仓方案介绍
2.1 理解产品工作过程
首先,我们将仓中的两只蓝牙耳机都拿出来,将盖板盖上,用充电线连接充电器进行充电,大概两个小时。 充电充电完毕后,就可以将两个蓝牙耳机放进充电仓,充电仓经过一个小时的充电,两个蓝牙耳机的电量就差不多满了。 将手机蓝牙打开,如果之前有配对就不需要再配对了,后续打开充电仓就能在手机上看到弹窗充电提示了,非常人性化的设计,这也是目前主流产品的市场新亮点。
1、共有4种工作模式,工作模式及工作状态转换顺序如下:100%亮→50%亮→25%亮→爆闪;
2、在高亮工作模式时,温度超过70℃,会自动调节亮度,防止工作时温升过高,烫伤使用者;
3、AirPods的充电盒里的耳机没有开关机模式,打开会自动开机,放进充电仓内关闭盖子就会自动关闭,这种设计的好处是你可以随意拿一只来听,另外一只在充电仓内是关闭状态的。当耳机充电时,充电口侧的指示灯会呈现红灯常亮状态,充满电后,指示灯则会变为蓝灯常亮,充电时长约2小时。

2.1.1 RTL8752CGF芯片的介绍

特征
一般说明
? 支持蓝牙 4.2 核心规范
? 额外的 Adv 频道
? 集成 MCU 来执行蓝牙协议栈
? 支持多级低能量状态
? 支持 LE L2CAP Connection Oriented Channel Support
? 支持 LE 低关税定向广告
? 支持 LE 数据长度扩展功能
? 支持固件的 OTA(空中下载)编程机制
升级
? 支持 GAP、ATT/GATT、SMP、L2CAP
? GAP Central、Peripheral、Observer 和广播员角色
平台
? ARM Cortex-M4 最大频率 20MHz
? 总共 160KB SRAM
? 16KB 4 路串行闪存控制器(一位和四位模式)
缓存
? 支持 AES128/192/256 加密/解密引擎
? 内嵌 2Mbit 闪存
蓝牙收发器
? 发射功率:0/4dBm 可调
? 接收灵敏度:-97dBm BLE
? 快速 AGC 控制以提高接收动态范围
? 支持蓝牙低功耗 PHY
外围接口
? 灵活的 GPIO
? 硬件按键扫描和四解码器
? 嵌入式 IR 收发器
? 实时计数器 (RTC)
? SPI 主/从 x 2;计时器 x 8; I2C x 2;脉宽调制 x 8;串口 x 2
? 400ksps,12 位,8 通道 AUXADC
? 内部 32K RCOSC 以保持 BLE 链接
? 带有 5 段均衡器的嵌入式 PGA 和音频 ADC
应用
? 电视遥控器
? LE HID
? 信标
? 家庭自动化
? 钥匙扣
? 腕带
? 可穿戴设备
? 玩具

2.1.2 其他芯片的介绍
本方案采用了友商南京酷珀(COPO) CP2021  2.5W Qi接收SoC,其产品特性如下:
CP2021是一种用于无线电源接入的单芯片、先进、灵活的二次侧设备。可提供高达2.5W的便携式应用。它具有高集成度、高效率、低功耗消费。CP2021集成了一个低电阻同步整流器(交流到直流)、低电压降调节器(LDO)。数字控制,的电压电流回路,提高效率,减少功耗。它还集成了符合WPC v1.2.4标准的数字控制器,可以计算移动设备接收到的电量,然后控制器将此信息传递给允许发送器确定磁场中是否存在异物的发送器。

2.2 系统开发
2.2.1、硬件设计
目前TWS蓝牙耳机方案带弹窗方案有很多,其中杰理,中科蓝汛,诺达等厂家TWS弹窗功能的方案基本上都是采用了通过蓝牙耳机对手机进行通讯的方式来进行弹窗功能实现,造成弹窗慢,延时,甚至是无法弹出等一些问题。对于这种情况Realtek推出了通过在Realtek专用的RWS充电仓上增加一个BLE芯片对手机进行数据传输来实现弹窗显示功能的方案。这种方案优点距离远,同时弹窗时间速度快。工作稳定。匹配度兼容性也高。耳机入仓检测无延时,同时支持QI无线充电功能。
由于TWS耳机方案的多样化,因此对充电舱的要求也越来越严格,为了满足无线充电的要求,Realtek推出一款基于自有特色的RWS耳机充电舱解决方案,该方案结合南京酷珀(COPO) CP2021无线充电方案,采用RTL8752CFG为主芯片、钰泰ETA1061为耳机充电管理IC。其充电仓电路主要由以下构成:BLE芯片、5VDC-DC 、LDO3V、lightning解码、 CP2021无线充电及少量电容电阻等少量器件. 使得该充电舱的方案具有安全保护,防止过充、过压、过流、短路,此外特别设计的NTC检测电路,满足对锂电池的温度保护要求。

2.2.2、软件设计
Realtek RTL8752CFG 嵌入式软件采用业内主流的开发IDE平台Keil,其OS 为Free rtos,嵌入式软件整体架构由以下几大部分组成:
2.2.2.1. Platform:
2.2.2.2. IO Driver:
2.2.2.3. Upper Stack:
2.2.2.4. APP
A) OTA
B) Slient OTA

下图显示的是充电仓的整体嵌入式软件架构:

3


三、电池的物理特性及充电算法
3.1  了解电池技术规格
以下用于开发者了解描述电池单元、模块和电池组技术的规格说明。
• 标称电压 (V) – 电池的报告或参考电压,有时也是被认为是电池的“正常”电压。
• 截止电压——允许的最小电压。一般就是这个电压定义电池的“空”状态。
• 容量或标称容量(Ah 对于特定的 C 率)——库仑容量,当电池放电到一定程度时可用的总安培小时从 100% 充电状态到截止的放电电流(指定为 C 率)电压。容量的计算方法是将放电电流(安培)乘以放电时间(以小时为单位)并随着 C-rate 的增加而减少。
• 能量或标称能量(Wh(对于特定的 C 率))——“能量容量”电池,当电池放电到一定程度时可用的总瓦时从 100% 充电状态到截止的放电电流(指定为 C 率)电压。能量的计算方法是将放电功率(以瓦特为单位)乘以放电时间(小时)。与容量一样,能量随着 C-rate 的增加而减少。
• 循环寿命(特定 DOD 的数量)– 放电-充电循环次数电池在无法满足特定性能标准之前可以体验。循环寿命是估计特定的充电和放电条件。实际使用寿命电池受循环速率和深度以及其他条件的影响,例如温度和湿度。 DOD 越高,循环寿命越低。
•能量 比 (Wh/kg) – 每单位质量的标称电池能量,有时称为重量能量密度。比能量是一种特性电池化学和包装。
• 功率 比 (W/kg) – 每单位质量的最大可用功率。功率比是电池化学和包装的特征。它决定了电池的重量实现给定的性能目标所必需的。
• 能量密度 (Wh/L) – 每单位体积的标称电池能量,有时称为体积能量密度。
• 功率密度(W/L) – 每单位体积的最大可用功率。功率密度是电池化学和包装的特征。它决定了电池的大小实现给定的性能目标所需。
• 最大连续放电电流 – 最大电流电池可以连续放电。这个限制通常由电池定义制造商为了防止过度放电会损坏电池或减少其容量。
• 最大 30 秒放电脉冲电流 – 最大电流电池可以放电长达 30 秒的脉冲。这个限制通常定义为电池制造商,以防止过度放电会损坏电池或降低其容量。
• 充电电压 – 电池充满电时的充电电压容量。充电方案通常包括恒流充电,直到电池电压达到充电电压,然后恒压充电,允许充电电流逐渐减小,直到非常小。
• 浮充电压 – 电池充电至 100 后保持的电压SOC 百分比以通过补偿电池的自放电来保持该容量。
• (推荐)充电电流 – 电池初始时的理想电流过渡前在恒定充电方案下充电(至大约 70% SOC)进入恒压充电。
• (Maximum) Internal Resistance – 电池内阻,一般不同用于充电和放电。

3.2、锂电充电核心算法
本方案采用简洁高效的CC/CV充电算法来实现对充电仓内锂电池的充电管理。
3.2.1. 恒流-恒压(CC/CV充电算法)
在所有充电算法中,恒流恒压(CC/CV)充电算法较好开发并广泛应用于锂离子电池充电因为它简单且易于实现。下面简单介绍CC/CV 充电算法实现的步骤,一个常数电流被施加到电池充电,直到电池电压上升到预设的最大充电电压 (Vpre−set ),然后充电电压保持恒定在 Vpre-set 和相应地,充电电流呈指数下降。当充电电流达到时,充电过程停止预设的小电流。图 2 显示了充电曲线CC/CV。

fig2


当 CC/CV 用于开发充电器时锂离子电池,必须采取一些保护措施以保护电池。图 3 显示了该程序的流程图

fig3

3.2.2 基于 CC/CV 的充电器充电过程包括安全和保护检查。它表明,CC/CV 的充电过程包括三个步骤:
第一、电池初始条件,如温度和开路电路电压(OCV),检查它们是否在正常范围。如果 OCV 小于预设的截止电压 (Vcutoff),电池采用涓流充电 (TC) 模式充电电流(例如 0.1C)直到电池电压上升到截止电压,其中 0.1C 代表充电电流,C代表电池的标称容量。
第二、一次电池电压超过 Vcutoff ,CC 模式开始充电电池。充电电流的选择参考锂离子电池的规格,其范围可以是从 0.5C 到 3.2C。
第三、当电池电压充电到 Vpre−set(例如 4.2V),充电过程切换到CV模式,电池以恒压充电4.2V,充电电流相应减小。这期间由最低充电终止电流 ( Imin < 0.1C ) 或最大充电时间( 预设 t t max ≤ − ) 达到。基于 CC 模式下的充电电流,总充电时间从 1 小时到 2.5 小时不等。一般来说,CC模式充电电流越小,充电电流越大充电效率和更长的充电时间和电池寿命。通常需要三个传感器来测量电池电压、电流和表面温度。CC/CV充电算法实施起来非常简单且成本低廉不一定需要微控制器,因此也有很多其他方案选择,当然有了强大的RTL8752CGF主控芯片,用户可以拥有非常自由度的Idea 并确保在激烈竞争中胜出。

四、充电弹仓协议
我们开发了专用的充电弹仓协议(根据省电及安卓/苹果平台差异的考量,用户可选择40ms/20ms的不同时间间隔),其协议大致包括以下的内容,具体的协议可以联系我们相关的业务及技术人员。
4.1 20-40ms/bit波形定义及发送
4.2 20-40ms 命令发送序列要求(耳机DLPS)
4.3 20-40msms USB 命令(本地充电盒专用)
4.4 耳机出入盒条件

五、开发安卓弹窗应用程序

Android弹窗页面通常有以下三种实现方式:
1.AlertDialog设置自定义view
2.自定义Dialog控件
3.PopupWindow

我们选择较为容易实现的PopupWindow功能组件来实现,它是与AlertDialog在形式上类似的弹窗功能,都是为了在activity最上层显示一个弹窗.但是区别是PopupWindow可以自定义出现的位置,并且可以添加入自己需要的View或者导入自己写好的xml布局,在很多场景下都可以见到它。例如ActionBar/Toolbar的选项弹窗,一组选项的容器,或者列表等集合的窗口等等。为了解基本的流程,我们来一个最简单demo演示一下. 其开源Github地址:
CustomPopWindow
https://github.com/Gavin-ZYX/SmartPopupWindow
我们仅仅简单介绍创建的流程:
  • 用LayoutInflater获得xml布局View .或者直接在代码上new一个View
  • 实例化一个PopupWindow,将View在实例化作为参数传入
  • 配置PopupWindow参数
/**
*
* 自定义PopWindow类,封装了PopWindow的一些常用属性,用Builder模式支持链式调用
* Created by zhouwei on 16/11/28.
*/

public class CustomPopWindow {
private Context mContext;
private int mWidth;
private int mHeight;
private boolean mIsFocusable = true;
private boolean mIsOutside = true;
private int mResLayoutId = -1;
private View mContentView;
private PopupWindow mPopupWindow;
private int mAnimationStyle = -1;

private boolean mClippEnable = true;//default is true
private boolean mIgnoreCheekPress = false;
private int mInputMode = -1;
private PopupWindow.OnDismissListener mOnDismissListener;
private int mSoftInputMode = -1;
private boolean mTouchable = true;//default is ture
private View.OnTouchListener mOnTouchListener;
private CustomPopWindow(Context context){
mContext = context;
}

public int getWidth() {
return mWidth;
}

public int getHeight() {
return mHeight;
}

/**
*
* @param anchor
* @param xOff
* @param yOff
* @return
*/
public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff){
if(mPopupWindow!=null){
mPopupWindow.showAsDropDown(anchor,xOff,yOff);
}
return this;
}

public CustomPopWindow showAsDropDown(View anchor){
if(mPopupWindow!=null){
mPopupWindow.showAsDropDown(anchor);
}
return this;
}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff, int gravity){
if(mPopupWindow!=null){
mPopupWindow.showAsDropDown(anchor,xOff,yOff,gravity);
}
return this;
}


/**
* 相对于父控件的位置(通过设置Gravity.CENTER,下方Gravity.BOTTOM等 ),可以设置具体位置坐标
* @param parent
* @param gravity
* @param x the popup's x location offset
* @param y the popup's y location offset
* @return
*/
public CustomPopWindow showAtLocation(View parent, int gravity, int x, int y){
if(mPopupWindow!=null){
mPopupWindow.showAtLocation(parent,gravity,x,y);
}
return this;
}

/**
* 添加一些属性设置
* @param popupWindow
*/
private void apply(PopupWindow popupWindow){
popupWindow.setClippingEnabled(mClippEnable);
if(mIgnoreCheekPress){
popupWindow.setIgnoreCheekPress();
}
if(mInputMode!=-1){
popupWindow.setInputMethodMode(mInputMode);
}
if(mSoftInputMode!=-1){
popupWindow.setSoftInputMode(mSoftInputMode);
}
if(mOnDismissListener!=null){
popupWindow.setOnDismissListener(mOnDismissListener);
}
if(mOnTouchListener!=null){
popupWindow.setTouchInterceptor(mOnTouchListener);
}
popupWindow.setTouchable(mTouchable);



}

private PopupWindow build(){

if(mContentView == null){
mContentView = LayoutInflater.from(mContext).inflate(mResLayoutId,null);
}

if(mWidth != 0 && mHeight!=0 ){
mPopupWindow = new PopupWindow(mContentView,mWidth,mHeight);
}else{
mPopupWindow = new PopupWindow(mContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
if(mAnimationStyle!=-1){
mPopupWindow.setAnimationStyle(mAnimationStyle);
}

apply(mPopupWindow);//设置一些属性

mPopupWindow.setFocusable(mIsFocusable);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mPopupWindow.setOutsideTouchable(mIsOutside);

if(mWidth == 0 || mHeight == 0){
mPopupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
//如果外面没有设置宽高的情况下,计算宽高并赋值
mWidth = mPopupWindow.getContentView().getMeasuredWidth();
mHeight = mPopupWindow.getContentView().getMeasuredHeight();
}

mPopupWindow.update();

return mPopupWindow;
}

/**
* 关闭popWindow
*/
public void dissmiss(){
if(mPopupWindow!=null){
mPopupWindow.dismiss();
}
}


public static class PopupWindowBuilder{
private CustomPopWindow mCustomPopWindow;

public PopupWindowBuilder(Context context){
mCustomPopWindow = new CustomPopWindow(context);
}
public PopupWindowBuilder size(int width,int height){
mCustomPopWindow.mWidth = width;
mCustomPopWindow.mHeight = height;
return this;
}


public PopupWindowBuilder setFocusable(boolean focusable){
mCustomPopWindow.mIsFocusable = focusable;
return this;
}



public PopupWindowBuilder setView(int resLayoutId){
mCustomPopWindow.mResLayoutId = resLayoutId;
mCustomPopWindow.mContentView = null;
return this;
}

public PopupWindowBuilder setView(View view){
mCustomPopWindow.mContentView = view;
mCustomPopWindow.mResLayoutId = -1;
return this;
}

public PopupWindowBuilder setOutsideTouchable(boolean outsideTouchable){
mCustomPopWindow.mIsOutside = outsideTouchable;
return this;
}

/**
* 设置弹窗动画
* @param animationStyle
* @return
*/
public PopupWindowBuilder setAnimationStyle(int animationStyle){
mCustomPopWindow.mAnimationStyle = animationStyle;
return this;
}


public PopupWindowBuilder setClippingEnable(boolean enable){
mCustomPopWindow.mClippEnable =enable;
return this;
}


public PopupWindowBuilder setIgnoreCheekPress(boolean ignoreCheekPress){
mCustomPopWindow.mIgnoreCheekPress = ignoreCheekPress;
return this;
}

public PopupWindowBuilder setInputMethodMode(int mode){
mCustomPopWindow.mInputMode = mode;
return this;
}

public PopupWindowBuilder setOnDissmissListener(PopupWindow.OnDismissListener onDissmissListener){
mCustomPopWindow.mOnDismissListener = onDissmissListener;
return this;
}


public PopupWindowBuilder setSoftInputMode(int softInputMode){
mCustomPopWindow.mSoftInputMode = softInputMode;
return this;
}


public PopupWindowBuilder setTouchable(boolean touchable){
mCustomPopWindow.mTouchable = touchable;
return this;
}

public PopupWindowBuilder setTouchIntercepter(View.OnTouchListener touchIntercepter){
mCustomPopWindow.mOnTouchListener = touchIntercepter;
return this;
}


public CustomPopWindow create(){
//构建PopWindow
mCustomPopWindow.build();
return mCustomPopWindow;
}

}

}?

六、未来发展
随着智能无线耳机的迅猛发展,未来无线充电的身影会越来越多的出现在人们的生活中,它不仅给人们带来越来越便捷的出行生活还增加了许多之前不曾有的乐趣,比如:未来的无线智能充电座仓可以增加AI语音功能,还可增加无线充电的功能(类似本方案具有无线充电功能的芯片组成),另外弹窗还可以更加的人性具体化及更多的个性化功能,在这里就不详细一一举例了。

►场景应用图

►产品实体图

►展示板照片

►方案方块图

►核心技术优势

1、先进高效且快速的充电算法(CC/CV充电算法) 2、Realtek专用的充电盒弹窗协议 3,开盖弹窗,智显电量 4,双向通信,ASK+FSK 5,智能检测有线充电输入

►方案规格

品名:RWS无线蓝牙耳机 三代(3代) 耳机电池容量:35毫安 底仓电池容量:300毫安 充电时间:约30分钟 通话时间:约2.5小时 播放时间:约3.5小时 充电盒尺寸:56mm*43mm*21mm 待机时长:约100小时 蓝牙版本:5.0(Realtek芯片) 蓝牙距离:20米 控制方式:开盖弹窗,智显电能和触摸式控制

技术文档

类型标题档案
硬件Schematics