使用单片机模拟QC3.0,实现0.2V电压的微调

1. 前述

使用单片机模拟QC3.0协议,使充电头输出5V、9V、12V常用电压,并实现0.2V电压微调。

2. QC2.0/3.0 时序图

下面的QC2.0/3.0协议时序图来自某站UP主的视频,这是看到的最简单明了的时序图了,该UP出了一期视频讲解QC3.0相关内容,可以看看,也要点赞投币支持一下。

QC协议时序图

2.1. QC2.0

使用D+、D-来实现QC协议,正常情况充电器内部D+和D-导通,当给D+施加0.6V的电压,在1.35秒后充电器内部D+和D-断开,说明充电器支持QC协议,然后通过给D+、D-施加不同的电压,使充电器输出其他档位电压。QC协议也有ClassA和ClassB,ClassA最大输出12V,ClassB最大输出20V,所以并不是支持QC协议的充电器就能输出20V的,大概率最大输出12V。

D+ D- VBUS
0.6V 0V 5V
3.3V 0.6V 9V
3.3V 3.3V 20V
0.6V 0.6V 12V
0.6V 3.3V QC3.0

2.2. QC3.0

当D+上电压为0.6V,D-上电压为3.3V时,进入QC3.0模式。QC3.0模式下支持以0.2V电压进行递增或递减,这样就可以输出其他电压值。

D+ D- VBUS
0.6V 3.3V 输出不变
0.6V -> 3.3V 3.3V 增加 0.2V
0.6V 3.3V -> 0.6V 减少 0.2V
  • 当D+上电压为0.6V,D-上电压为3.3V时输出电压保持不变;
  • 当D+上电压从0.6V上升到3.3V时,输出电压增加0.2V;
  • 当D-上电压从3.3V下降到0.6V时,输出电压减少0.2V;
  • 这里有个简单的记法,D+,+号说明D+电压上升时,输出电压增加。同理D-,-号说明D-电压下降时,输出电压减少。

    3. 具体实现

    3.1. 硬件部分

    3.1.1 硬件测试平台

    使用ESP32C3-FN4芯片做为主控,platformio+Arduino平台开发,使用4个IO口输出所需电压。

    3.1.2 电阻调压网络

    在整个模拟QC协议的过程中,只需要0.6V和3.3V两种电压,最简单的方法就是使用电阻分压输出0.6V和3.3V,如下图。

    当DP+和DP-同时输出3.3V,DP电压为3.3V;

    当DP+输出3.3V,DP-输出0V时,DP电压为0.6V;

    这样使用控制单片机IO口便可以输出0.6V和3.3V电压。注意,这里电阻取值不是固定的,只要分压能输出0.6V就行。

    3.2. 软件部分

    3.2.1. 快充检测

    首先是在D+上施加0.6V电压,这时候D-上也是0.6V,如果1.35秒后D-上电压变成0,说明支持充电头QC协议。这里偷了个懒,没有检测D-电压,直接使用延时来实现。需要注意的是,在这个应该检测充电器是否支持快充模式的过程中,DP+和DP-的IO口要初始化为输出模式,而DN+和DN-要初始化为高阻态模式,即不作输入也不作输出,在延时过后重新初始化为输出模式。

    在某个帖子里看到,技术人员称,把IO口初始化为开漏模式,并且不设置上拉或下拉,那么此时IO口就是高阻态状态,所以首次初始化DN+和DN-时模式选择 OUTPUT_OPEN_DRAIN ,延时过后再初始化为 OUTPUT

    Arduino参考程序如下:

    // DP_U代表DP+	DP_D代表DP-
    // DN_U代表DN+	DN_D代表DN-
    pinMode(DP_U,OUTPUT);
    pinMode(DP_D,OUTPUT);
    pinMode(DN_U,OUTPUT_OPEN_DRAIN);
    pinMode(DN_D,OUTPUT_OPEN_DRAIN);
    
    digitalWrite(DP_U,1);	//0.6V
    digitalWrite(DP_D,0);
    
    delay(1350);
    
    pinMode(DN_U,OUTPUT);	
    pinMode(DN_D,OUTPUT);
    
    // 进入QC3.0模式
    digitalWrite(DN_U,1);	//0.3V
    digitalWrite(DN_D,1);
    

    D+先输出0.6V,1.35秒后D-输出3.3V,对照2.1节的表格可以看出此时进入QC3.0模式。

    3.2.2. 0.2V 调压

    进入QC3.0模式后调压就很简单,记得最后要保持D+电压为0.6V,D-电压为3.3V,参考程序如下:

    // 增加0.2V 	D+电压从0.6V上升到3.3V,输出增加0.2V,再下降到0.6V保持输出电压
    digitalWrite(DP_U,1);	//3.3V
    digitalWrite(DP_D,1);
    delay(1);
    digitalWrite(DP_U,1);	//0.6V
    digitalWrite(DP_D,0);
    
    
    // 减少0.2V 	D-电压从3.3V下降到0.6V,输出减少0.2V,再上升到3.3V保持输出电压
    digitalWrite(DN_U,1);	//0.6V
    digitalWrite(DN_D,0);
    delay(1);
    digitalWrite(DN_U,1);	//3.3V
    digitalWrite(DN_D,1);
    

    4. 实现效果

    这里用的是网上16块钱淘的东洋24W充电头,最大输出12V2A,支持QC2.0/3.0。控制板主控是ESP32C3,INA226测电压电流,1.14寸ips屏幕显示数据,效果见下图

    请添加图片描述

    sad

    sas

    默认5V输出,使用QC3.0实现6V和12V输出,但是正常应该输出12V却输出了11.9V,随着电压的增高实际值与理论值有点差距,感觉是充电器问题,但问题也不大。

    5. 结论

    使用QC协议输出其他电压值一定程度上还是蛮方便的,毕竟这充电器体积也不大,最大2A电流一般情况也够用。

    6. 题外语

    想想最开始为了摆脱DC005的大圆头和那拉跨的12V适配器,想着如何使用改成Typec接口,了解到PD协议,用CH224K做了PD诱骗器,使充电器输出12V,这样的话就可以用Typec接口了,画板子时体积可以更小。后来吧,我那专门买的支持PD协议的充电器头丢了,就剩线了,PD必须用双Typec的线,我的手机充电器没有双Typec的,后来用的少也没再买。

    最近又需要用了,感觉PD不是很方便吧,就研究了QC3.0,能实现0.2V调压比PD更好用,而且用单片机就能实现,还不需要双Typec口的线了,就又鼓捣了一下。

    不得不说,这百度上有关QC3.0的都是没什么吊用的,就BB一个支持0.2V调压,具体协议时序啥的也不说,纯纯牛马,都隔那混呢,后来在别的地方看到有人提到了QC3.0时增加电压的方式,简单搭了一下后实现0.2V电压增加了,把降低电压的方式给试出来了。后来无意间在某站看到QC3.0协议讲解,上面的时序图就是从那看到的,虽然那会已经调好了。

    到此就结束了,分享一下,希望可以帮到别人。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用单片机模拟QC3.0,实现0.2V电压的微调

    发表评论