切换到宽版
  • 13482阅读
  • 85回复

[电源]自制QC2.0诱骗器,STC15W104单片机版(开源) [复制链接]

上一主题 下一主题
离线wangyz1997
 

发帖
29
M币
7340
专家
17
粉丝
17
— 本帖被 發騷友 设置为精华,作者+3000M币+5专家(2018-10-22) —
实际上,安卓手机的快充头就是一个可以更改副边反馈比的可调压开关电源。快充协议的握手部分在副边部分,当快充头和手机握手成功时,副边的快充控制芯片就会调整反馈给原边的反馈比,使原边的开关电源占空比升高,进而提高副边的输出电压。那么,拥有一个快充头,对我们来说,就是拥有了一个可以调整输出电压的电源。我们需要做的,就是模拟手机与快充头进行握手,激活高电压快充协议。对于QC2.0来说,我们总共可以得到5V、9V、12V和20V四挡电压,但是一般的充电头都只支持前三档电压。对于QC3.0来说,我们可以获得3.6V-20V的可调电压,以0.2V为步进。一般的手机充电头能做到4V-12V的可调范围。这一次为了简单起见,我们先尝试制作QC2.0的快充诱骗器。


废话不多说,要激活快充协议,我们首先要知道快充协议握手的过程。好在,QC2.0的握手协议并不复杂,大致可以分为以下几个步骤:
1、QC快充头在默认情况下,充电器内部的mos管短接D-和D+并输出5V电压。这样,对于普通的手机或者不支持QC快充协议的手机,识别到此充电器是支持DCP(BC1.2)协议的充电头,对于安卓手机来说激活5V1.5A充电,iPhone激活5V1A充电。
2、设备端(也就是我们的诱骗器)在D+上输出0.6V电压,此时由于充电头内部mos管导通,D-上也会出现0.6V的电压。维持D+上的0.6V超过1.25秒以后,充电头内部mos断开,D-电压变为0V,此时可以向D-加载电压。
3、在检测到D-电压变为0V以后,设备即可确定充电头支持QC协议。此时设备端通过设置D+、D-的电压值,即可向充电头申请对应档位的电压。具体的对应值如下:
4、只需要将D+、D-两引脚均断开,即可关闭快充模式,快充头重新回到DCP模式,输出5V。

档位5V9V12V20V
D+电压0.6V3.3V 0.6V3.3V
D-电压0V0.6V0.6V3.3V


通过上面的操作,相信大家已经了解到了如何握手QC2.0协议了。接下来我们考虑一下,如何使用单片机去模拟这个握手过程。最大的问题就是如何产生这0.6V和3.3V电压。我们首先想到的是DAC。但是如此小的一个制作,我们根本不需要也没必要去使用昂贵的带DAC的单片机。那么,我们的思路就限定在了使用普通单片机的普通IO口上。3.3V电压比较容易产生,使用3.3V供电的单片机输出高电平即可,0.6V也可以通过电阻分压3.3V得到。于是乎,我就设计了一个这样的电路,电路中,D+PU、D+、D-PU、D-PD四个网络连接到了3.3V单片机的普通IO上。


乍一看可能有点懵逼,我们慢慢分析。根据上面的表格,我们若不考虑充电头给我们的反馈和20V电压档位,我们总共需要:

⊙D+输出0.6V(握手、5V档位与12V档位)
⊙D+输出3.3V(9V档位)
⊙D-输出0.6V(9V档位、12V档位)
⊙D-断开连接(握手与5V档位)

四种状态。因此,每一根数据线只需要完成两种电平状态的切换即可。因此,对应上面四个状态,我们总共也有四种输出模式:

⊙D+PU输出3.3V,D+高阻,在D+上即可得到0.6V电压D+PU高阻,
⊙D+输出3.3V,在D+上即可得到3.3V电压
⊙D-PU输出3.3V,D-PD输出0V(均为推挽输出),在D-上即可得到0.6V电压
⊙D-PU、D-PD均高阻,即可使D-断开连接

这样,我们就用4个IO口实现了握手和三个档位的切换。使用一个8脚STC单片机,即可完成这项工作,剩下两个IO口分别连接一个LED和一个按键。设计中使用HT7533,这是一款最高支持24V输入的高压LDO,对于这种只有十几ma的小单片机来说绰绰有余。注意单片机一定要选STC15W104而不能选STC15F104E,因为后者不能工作在3.3V下。

电路设计完了,接下来就是程序了。程序无非就是对IO口的操作,操作IO口的部分代码如下:

  1. //配置IO口为推挽
  2. #define IO_PP_CONF(IO,PIN) do{\
  3.     IO##M0|=(1<<PIN);\
  4.     IO##M1&=~(1<<PIN);\
  5.     }while(0)\
  6. //配置IO口为高阻
  7. #define IO_HR_CONF(IO,PIN) do{\
  8.     IO##M0&=~(1<<PIN);\
  9.     IO##M1|=(1<<PIN);\
  10.     }while(0)\
  11. #define IO_OUT_HIGH(IO,PIN) IO|=(1<<PIN)
  12. #define IO_OUT_LOW(IO,PIN) IO&=~(1<<PIN)

  1. void USBDP_HIGH(void)//USBD+输出3.3V
  2. {
  3.   IO_OUT_HIGH(P3,USBDP);//USBDP先输出高
  4.   IO_PP_CONF(P3,USBDP);//推挽输出
  5.   IO_HR_CONF(P3,USBDP_PU);//USBDP_PU为高阻
  6. }
  7. void USBDP_LOW(void)//USBD+输出0.6V
  8. {
  9.   IO_HR_CONF(P3,USBDP);//USBDP为高阻
  10.   IO_OUT_HIGH(P3,USBDP_PU);
  11.   IO_PP_CONF(P3,USBDP_PU);//USBDP_PU推挽输出
  12. }
  13. void USBDM_LOW(void)//USBD-输出0.6V
  14. {
  15.   IO_OUT_HIGH(P3,USBDM_PU);
  16.   IO_OUT_LOW(P3,USBDM_PD);
  17.   IO_PP_CONF(P3,USBDM_PU);//USBDM_PU推挽输出
  18.   IO_PP_CONF(P3,USBDM_PD);//USBDM_PD推挽输出
  19. }
  20. void USBDM_DISCONN(void)//USBD-断开
  21. {
  22.   IO_HR_CONF(P3,USBDM_PD);//USBDM为高阻
  23.   IO_HR_CONF(P3,USBDM_PU);//USBDM_PU为高阻
  24. }


剩下的程序就不赘述了,就是一些很简单的小代码,有兴趣的可以到文末下载代码查看。程序实现的功能主要是,上电后默认输出上一次保存在EEPROM中的电压值,LED灯单闪为5V,双闪为9V,三闪为12V,短按按键可以切换档位,长按按键可以保存当前档位为默认值,下次上电自动读取此电压值。


下面上几张实物图:







开源程序与PCB工程下载:
程序与PCB严禁用于商业用途 转载请注明出处
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共36条打赏M币+386专家+3
hchen668 M币 +8 優秀文章,谢谢分享 前天 21:23
loyo8 M币 +8 优秀,出不出套料嘛! 11-07
kindzhon M币 +1 - 11-06
jiaoshi M币 +8 優秀文章 10-31
3369348 M币 +1 優秀文章 10-28
胡闹闹 M币 +15 学习了,附件能不能用网盘? 10-28
denglei 专家 +1 非常感谢分享 10-27
denglei M币 +20 非常感谢分享 10-27
杨小伟 M币 +13 原創內容 10-27
moontree M币 +9 謝謝分享 10-26

发帖
671
M币
3880
专家
11
粉丝
13
只看该作者 1楼 发表于: 10-22
不错不错,支持下
离线qrut

发帖
17787
M币
55729
专家
619
粉丝
10687
只看该作者 2楼 发表于: 10-22
电路简单易行,成本低廉不错~
离线yyglxc

发帖
4594
M币
1292
专家
1
粉丝
30
只看该作者 3楼 发表于: 10-22
谢谢分享经验!
离线kygggg

发帖
8178
M币
7412
专家
9
粉丝
45
只看该作者 4楼 发表于: 10-22
谢谢分享,既然如此,是不是可以用更简单的电路,比如拨码开关加几个电阻实现?
离线在路上795

发帖
2439
M币
1900
专家
0
粉丝
28
只看该作者 5楼 发表于: 10-22
学习了,楼主高手
离线fqxxqwy

发帖
7799
M币
9226
专家
30
粉丝
39
只看该作者 6楼 发表于: 10-22
最佩服的就是这种软硬件都通的牛叉
离线wangyz1997

发帖
29
M币
7340
专家
17
粉丝
17
只看该作者 7楼 发表于: 10-22
kygggg谢谢分享,既然如此,是不是可以用更简单的电路,比如拨码开关加几个电阻实现?
      
这个坛子里已经有其他人做过了,我只是用单片机来简化电路和操作而已
离线噗噗熊

发帖
176
M币
256
专家
1
粉丝
7
只看该作者 8楼 发表于: 10-22
这个诱骗器配合U表真是绝了,有套件出么
离线skylly

发帖
977
M币
4083
专家
3
粉丝
31
只看该作者 9楼 发表于: 10-22
3.0的又是怎么实现的呢?
如是我闻