基於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