>

带负载指示的USB一拖三充电器

2015-01-17 by Stavros

现在平板/手机之类一般都用USB充电了. 晚上睡觉前, 经常得两三个设备一起充电, 插座都不够用了. 如果能在一个充电器上做出几个USB口同时给它们充电, 岂不是很方便?

不过这么一来, 供电就比较成问题了. 现在的设备一般都需要1A以上的充电电流, 有的需要2A. 3个2A一起充就得6A, 4个就得8A. 前面如果用12V降压到5V, 80%效率的话, 5V 6A需要提供12V 3.2A, 5V 8A需要提供12V 4.2A. 能提供这么大电流的12V适配器倒是有, 但是不太便携了. 所以还是折衷一下, 输出4A电流, 这样前面用12V 2A的适配器, 勉强够用. 这样就不能同时充3个2A的设备了, 免得一不小心就冒烟. 安全起见, 最好是再加个负载指示, 随时知道输出多大电流.

电路如图, 从12V降压到5V, 用了AOSMD的AOZ1014. 这颗SOIC8的小芯片能提供最大5A的输出电流, 不过感觉不怎么踏实, 4A保险些. 输出电压用8.2k和1.5k电阻设定为0.8V * (8.2+1.5)/1.5 = 5.17V, 比标准的5V高出3.5%, 还算安全. 在输出端和USB充电口之间再串联0.025欧的电阻用作电流取样. 当输出1A时, 这个电阻上的压降为25mV, 4A时为100mV.

用LM358的其中一个运放接成差分放大器, 把取样电阻上的电压放大20倍左右. 另一只运放提供约0.73V的参考电压, 因为LM358按单电源方式工作时, 最低输出电压不能到0V, 至少要0.6V左右, 所以这里把它的输出电压"抬"高一些.

单片机供电用了XC6206, 结果一通电, 马上冒烟了... 原来XC6206的供电电压最高只能是5V. 没办法, 先凑和一下, 把单片机的VCC改接到输出的5V上. 下次这里还是得换成AMS1117之类.

单片机用的是ATMEGA48. 用ADC6来读取LM358的输出电压. 负载指示用的是10位LED光条, 用MEGA48的PD0~PD7再加上PB0, PB1, 够了. 每格表示约0.4A电流, 10格一共4A. 程序很简单, 主要部分:

while(1) {
    u16 data, p;
    float volt, curr;
    u8 i;
    data = get_adc();
    volt = data/256.0*5.0;
    curr = volt*2.01-1.63;

    i = curr / 0.4;
    if(i>10)
        i=10;
    p = 0x3ff >> (10-i);
    PORTD = p & 0xff;
    PORTB = p >> 8;

    _delay_ms(500);
}

来两张效果图:

输出电流约1.6A时, 亮4格:

输出电流约2.8A时, 亮7格: