打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

原理图
QC2.0 3.0 4.0 是出现在我们手机配件行业的高频词,然鹅在与客户灵魂交流后,发现其实许多客户对他们的概念及区别并不十分了解。今天,小龙就来系统的给大家梳理一下这个知识点:

首先给大家解释一下概念:

QC,即Quick Charge,是美国高通公司专为配备Qualcomm骁龙处理器的终端而研发的快速充电技术。截至目前,Qualcomm已经发布了四代快速充电技术,分别为Quick Charge 1.0,Quick Charge 2.0,Quick Charge 3.0和Quick Charge 4.0。

以下图表为大家列出三个版本的快充所能支持的电压,最大电流及最大功率:
在这里插入图片描述
概念有些生涩,下面小龙用最简短通俗的语言来解释一下三者之间的区别:

QC2.0:

支持5/9/12V固定电压,最高达24W(12V/2A),最大支持电流2A

QC3.0:

支持3.6-12V波动电压,最高达36W (12V/3A), QC 3.0相较于2.0优势在于:

1)充电效率提升38%,充电速度提升27%,发热降低45%,大约35分钟将普通手机充电到80%。

2)QC 2.0 因为只能在3种固定电压中切换,切换幅度大,会导致手机电池发热。QC 3.0是波动电压,有智能自动调节电压的功能,保护手机电池,避免发热。电量到达90%,自动转化成涓流充电。

QC4.0:

支持3.6-20V波动电压,最高达100W (20V/5A) 相对于QC 3.0, 充电速度提升20%,效率提升30%, 加入了对PD(Type-C快充)的支持。15分钟充满50%。INOV智能调节输入电压。电量到达90%,自动转化成涓流充电, 有效保护手机电池。

USB Type-C是一种USB接口外形标准,拥有比Type-A及Type-B均小的体积,既可以应用于PC(主设备)又可以应用于外部设备(从设备,如手机)的接口类型 [1] 。
USB Type-C有4对TX/RX分线,2对USBD+/D-,一对SBU,2个CC,另外还有4个VBUS和4个地线 [2] 。
当地时间2022年6月7日,欧洲议会和欧洲理事会一致同意,将自2024年秋天起在欧盟境内统一使用Type-C接口用于移动设备充电。

Type-C还提供了2条CC线和2条SBU线。CC线主要用于Power Delivery 模块(下简称PD)的通讯,CC线首先是用来判断设备插入的方向:正插或反插,如果是正插,主机使用CC1来和设备通讯,反插使用CC2,可以看到CC使用的是单线协议。SBU线在DP功能开启时,化身为DP协议中的AUX_P/AUX_N差分线(它的极性是可以根据正反插方向修改的),负责传输设备的DPCD,EDID等关键信息

当然,如果接收端只需要DP信号,不需要USB 3.1信号,那DP可以利用全部4对TX/RX差分线做输出,从而实现最多4lanes的DP输出,提供高达32.4Gbps的总输出带宽(每条lane可以输出8.IGbps),轻松实现5Kx3K 60帧视频,甚至最高可达8K×4K 60帧视频(4:2:0数据),这种模式就是DPonly模式 [2] 。另外为了兼容USB2.0,Type-C还保留了USBD+/D-信号供USB 2.0设备使用,所以只需改用Type-C的接口,USB2.0甚至USB 1.0设备也可以支持正反面插入。值得一提的是,使用USBD+/D-跟上面的DP only 模式配合,可以实现DP+USB2.0模式。DP占用4对TX/RX差分线,USB仅使用D+/D- [2] 。通常情况下,USB2.0差分信号只会连接其中一边,因USB Type-C Plug无B6、B7。USB3.1只用到2对TX/RX差分线作为数据线,正插时连接TX1/RX1,反插时连接TX2/RX2,可以看到任意情况下,都会有2对差分线是没有被使用的,DP交替模式就是把DP信号加载到这2对“多余”的差分线上,从而实现USB 3.1+DP同时工作

为了数据交换的需要,T电子设备都提供了USB接口,无论是PC、平板点还是手机甚至显示设备。几乎无一例外都有USB接口。然而,由于技术标准的限制,使得USB插头具有“方向性”,插入时如果方向不对,要么插不进,要么插坏接口或接头。在这种情况之下,苹果为它的设备设计了Lightning [4] 接口,由于两个方向都可以插入,用户不必再担心插错问题。除了苹果设备外,其实T业界也出台了一个类似的接口标准:USB Type-C [4]
USB Type-C的风潮最早是由苹果所领起的,新macBook的问世将 USB Type-c。这个强大的技术带入到我们视野当中。 USB Type-C,是一个接口规范,它由Type-C插头和Type-C插座组成。在各种移动设备和PC中,Type-C成为发展前景最广的数据接口。随着Tpe-C技术的逐渐成熟,2017年各类新上市电子产品也陆续选择配置全Type-C接口 [4] 。
事实上,Type-C最直观的优势就是让你彻底摆脱插线的烦恼,其先天出色的正反可插接口设计,不会再出现错插或者失误之后导致的部件受损情况。更重要的是,Type-C接口有着强大的兼容性,因此成为能够连接PC、游戏主机、智能手机、存储设备和拓展均等一切电子设备的标准化接口,并实现数据传输和供电的统一,例如将两台显示设备通过一条Type-C线紧密结合在一起使用 [4] 。
除此之外,Type-C还支持USB3.1标准。该标准供电最大100W,电压和电流都会提高;降低了编码耗,从3.0的20%降低为3%。换句话说,用户能够迅速地通过Type-C传输数据和视频,或者更快地充电。该标准还可以让用户用自己的手机为其他设备充电。而对于显示器来讲,使用Type-C进行数据传输的时候无需再另外使用一条电源线给显示器供电,解决了桌面线材凌乱的问题,即使相对高端的HDMI和DP接口也无法使用

/*************笔记****************
1、本QC方案采用PWM调节电压。
2、
3、
4、
5、
***********************************/
/* -----------------------------------------宏定义-----------------------------------------*/
#define Voltage_06_PWM 18 //0.6V的占空比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/
xdata uint8_t  QC_Mode_Choice = 0;       //0--不使用QC协议  1--QC2.0   2--QC3.0
xdata uint8_t  QC20_Voltage_Choice = 0;  //0--默认5V        1--9V      2--12V     3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void)
{
    if (QC_Mode_Choice == 1) //QC2.0
    {
        switch (QC20_Voltage_Choice)
        {
            case 0: //D+ -->0  D- -->0    ==>5V  或者 握手重置
                USBDP_PWM(0);
                USBDM_PWM(0);
                break;
            case 1://D+ -->3.3  D- -->0.6 ==>9V
                USBDP_PWM(100);
                USBDM_PWM(Voltage_06_PWM);
                break;
            case 2://D+ -->0.6  D- -->0.6 ==>12V
                USBDP_PWM(Voltage_06_PWM);
                USBDM_PWM(Voltage_06_PWM);
                break;
            case 3://D+ -->3.3  D- -->3.3 ==>20V  如果不支持则无变化
                USBDP_PWM(100);
                USBDM_PWM(100);
                break;
            default:
                break;
        }
    }
    else if (QC_Mode_Choice == 2)//QC3.0
    {
        //D+ -->0.6  D- -->3.3 ==>进入QC3.0模式或者连续模式 (充电头如果不支持那么)
        USBDP_PWM(Voltage_06_PWM);
        USBDM_PWM(100);
    }
}

void QC30_Add_Voltage(void)
{
    if (QC_Mode_Choice == 2)
    {
        //D+ -->3.3  -->100ms -->D+ -->0.6   ==>QC3.0模式 增加电压
        USBDP_PWM(100);
        os_wait(K_IVL, 100, 0);//500ms
        USBDP_PWM(Voltage_06_PWM);
    }

}

void QC30_Reduce_Voltage(void)
{
    if (QC_Mode_Choice == 2)
    {
        //D- -->0.6  -->100ms -->D- -->3.3   ==>QC3.0模式 减少电压
        USBDM_PWM(100);
        os_wait(K_IVL, 100, 0);//500ms
        USBDM_PWM(Voltage_06_PWM);
    }
}

#ifndef _QC3_0_H
#define _QC3_0_H
/* -----------------------------------------宏定义-----------------------------------------*/
#define Config_USBDP_CH  4
//              <0=> PWM0  <1=> PWM1   <2=> PWM2   <3=> PWM3   <4=> PWM4    <5=> PWM5
#define Config_USBDM_CH  4
//              <0=> PWM0  <1=> PWM1   <2=> PWM2   <3=> PWM3   <4=> PWM4    <5=> PWM5

#define USBDP_PWM(Num) PWM_InputData(Config_USBDP_CH, (((Config_PWM_Cycle+1)/100)*Num));  //Num代表百分比
#define USBDM_PWM(Num) PWM_InputData(Config_USBDM_CH, (((Config_PWM_Cycle+1)/100)*Num));  //Num代表百分比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/
extern xdata uint8_t  QC_Mode_Choice;       //0--不使用QC协议  1--QC2.0   2--QC3.0
extern xdata uint8_t  QC20_Voltage_Choice;  //0--默认5V        1--9V      2--12V     3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void);
void QC30_Add_Voltage(void);
void QC30_Reduce_Voltage(void);
#endif

/*********************************************
函数名:System_Configuration
功  能:内外设初始化
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void System_Configuration(void)
{
    uint8_t temp = 0;
    SystemReg.RunningState      = 1;
    SystemReg.RunningState_Flag = 0;
    Pwm_Configuration();               //   PWM初始化
    Exit_Configuration();              //   端口中断使能

    Adc_Configuration();               //   ADC初始化
    SystemInit.ADC = 1;
    Key_Configuration();               //   按键初始化
    SystemReg.First_Start = 0;
    LowPower_Tmr = 10;
    SystemReg.RunningState = 1;//关机
}

/*********************************************
函数名:StartRunTask
功  能:OS运行起始任务
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void StartRunTask() _task_ 0
{
    System_Configuration();      //   初始化系统
    os_create_task(1);  //创建任务1
    os_create_task(2);  //创建任务2
    QC_Voltage_Switch();//选择充电协议
    for (;;)
    {
        if (SystemInit.PWM == 0)
        {
            PWM_INIT();//初始化灯光
            SystemInit.PWM = 1;
        }
        if (SystemInit.QC_Handshake == 0)//QC协议握手
        {
            USBDP_PWM(Voltage_06_PWM);//D+ 0.6V
            USBDM_PWM(0);//D- 0V
            if (time < 250 && ++time > 7)
            {
                time = 0;
                QC_Voltage_Switch();//选择充电协议
                SystemInit.QC_Handshake = 1;
            }
        }
        os_wait(K_IVL, 200, 0);//500ms
    }
}


/*********************************************
函数名:StartKeyTask
功  能:按键扫描
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void StartKeyTask(void) _task_ 1
{
    uint8_t KEY_state = 0;
    uint16_t time = 0;
    uint8_t i = 0;
    os_wait(K_IVL, 30, 0);//0.01s==100ms
    for (;;)
    {
        KEY_state = Key_Scan(&Key1_Type, 1);
        switch (KEY_state)
        {
            case 1://短按
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice == 1)
                    {
                        if (QC20_Voltage_Choice < 3 && ++QC20_Voltage_Choice > 2) QC20_Voltage_Choice = 0;
                        if (QC20_Voltage_Choice >= 3)
                        {
                            QC20_Voltage_Choice = 0;
                        }
                        QC_Voltage_Switch();//选择充电电压
                    }
                    else if (QC_Mode_Choice == 2)
                    {
                        QC30_Add_Voltage();
                    }
                }
                break;
            case 2://长按
                break;
            case 3://双击
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
                    if (QC_Mode_Choice >= 3)
                    {
                        QC_Mode_Choice = 0;
                    }
                    QC_Voltage_Switch();//选择充电电压
                }
                break;
            default:
                break;
        }
        KEY_state = Key_Scan(&Key2_Type, 2);
        switch (KEY_state)
        {
            case 1://短按
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice == 1)
                    {
                        if (QC20_Voltage_Choice > 0)
                        {
                            --QC20_Voltage_Choice;
                        }
                        QC_Voltage_Switch();//选择充电电压
                    }
                    if (QC_Mode_Choice == 2)
                    {
                        QC30_Reduce_Voltage();
                    }
                }
                break;
            case 2://长按
                break;
            case 3://双击
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
                    if (QC_Mode_Choice >= 3)
                    {
                        QC_Mode_Choice = 0;
                    }
                    QC_Voltage_Switch();//选择充电电压
                }
                break;
            default:
                break;
        }
        os_wait(K_IVL, 10, 0);//0.01s==10ms
    }
}
/* -----------------------------------------结构体定义-------------------------------------*/
typedef struct
{
    uint8_t   RunningState      : 2; //0开机  1低功耗待机
    uint8_t   RunningState_Flag : 2; //0关闭效果   1开机/2关机效果
    uint8_t   First_Start       : 2; //初始化完成: 0--初始化完成 1--未初始化
    uint8_t   Mode              : 2; //0--  1--  2--

    uint8_t   Level             : 3; //
	  uint8_t                     : 3;

} SYSTEM_REG;

typedef struct
{
    uint8_t ADC              : 1; //0--未初始化  1--已经初始化  (外围模拟采集)
    uint8_t PWM              : 1; //0--未初始化  1--已经初始化  (外围模拟输出)
    uint8_t LED_And_LampEN   : 1; //0--未初始化  1--已经初始化  (LED指示灯及灯光使能脚)
    uint8_t                  : 5;
} SYSTEM_INIT;
/* -----------------------------------------全局变量定义-----------------------------------*/
extern SYSTEM_REG      SystemReg;
extern SYSTEM_INIT     SystemInit;
posted on 2020-04-10 14:24  xuejianqiang  阅读(37)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033