圣龙扬特-AVR电子

标题: 移动电源烧包改造 [打印本页]

作者: sunany    时间: 2013-5-3 23:01
标题: 移动电源烧包改造
本帖最后由 sunany 于 2013-5-3 23:01 编辑

    五一在家里闲暇之余,想起了我前段时间买的一个移动电源,据说是香港的专利设计,转换效率极低,给手机充电外壳可以煮鸡蛋,同时三个LED还不时的闪烁,整体充电效率估计都不到60%。心想要不就是山寨要不就是二货设计。

     心痒痒,决定把升压和充电部分更改。      

    当然,这个移动电源好处就是外形设计比较漂亮,两节18650的电芯可以拆下来、USB充电口,这样连带我18650的手电外出方便至极。

    先上PP:

[attach]630[/attach][attach]632[/attach][attach]632[/attach][attach]633[/attach][attach]634[/attach]
   

    从图片可以看出,虽然主控板看上去极为复杂,但仔细分析无非就充电部分MCU+MOS,升压部分用了垃圾的电路(从使用的电感可见),电量显示板则用单片机的I/O口点灯实现。

4月30号下午开工(测绘原板外形及设计电路图):
    首先针对高性能的升压效率,升压用凌特尔LTC1700+MOSFET来实现,升压效率可达95%以上(实测90%)。
    第二,充电及电量显示方案有三:
    方案一:用ATmega8单片机+MOSFET设计充电,同时用单片机的I/O口配合单片机内部的10位ADC进行电量显示。
    方案二:用max1879+MOSFET设计充电,同时用LM3914N+LED硬件进行电量显示。
    方案三:用max1879+MOSFET设计充电,用Atiny13  MCU的五个I/O口配合内部ADC做电量显示。
    对比上述三种方案,从成本考虑方案一为最优选择,从难易度考虑方案二为最简,方案三则具备上述两个方案的优点。同时因为高老师上次送我tiny系列MCU的高压串行编程器,可以对tiny13的rst引脚进行编程,所以确定按方案三进行设计。

    用Altium进行电路及电路板设计:
[attach]635[/attach][attach]636[/attach][attach]637[/attach]
   

    充电电路及LED显示电路PCB板设计,按原有电路板外形测绘,因单面板无法完成布局,只能整成双面板,画图示要考虑DIY的难易程度,同时考验我制板手艺的时刻到了

[attach]638[/attach][attach]639[/attach][attach]640[/attach][attach]641[/attach]

    5月1号上午(DIY电路板):
    首先将已设计完成的PCB电路板打印:

[attach]642[/attach]

    硒鼓好,打印的笨清晰

    第二步:用家里的电运斗将打印的正面板转印到双面板的其中一面,完成正面转印后钻下四个定位孔,同时在打印的反面板上打四个相应的定位孔,将纸上四个孔和板上四个孔对应后粘好固定(其实体现DIY双面板水平就在对孔这一道工序)。固定完成用电运斗转印第二面。
    第三步:腐蚀电路板,将上步已转印完成的双面板放入FECL3液,加上热水腐蚀,整个腐蚀过程大概要30分钟。

[attach]643[/attach][attach]644[/attach][attach]645[/attach]
   

    第四步:焊接,双面板过孔采用导线穿孔形式实现,注意走大电流处要多打几个孔。焊完后整体电路板:

[attach]646[/attach][attach]647[/attach]
   
   
51号中午:
    忙了一上午,累了
,陪娃娃玩会就睡着了,醒来是大概三点。
    开始改LED电显示的程序。原来的移动电源只带3LED,所以我那5LED有点浪费了,但又觉的每33%显示档有点太对不起我的MCU,所以突发奇想还是整成5个档位显示电亮,每个灯长亮、闪烁及熄灭分成三态,最后面一个灯闪烁时频率加大,表示电显已经危险(正好高老师送我的高压编程器没搞定,RST脚不用也不影响)。

搞定,贴上原代码:
//ICC-AVR application builder :
// Target : T13
// Crystal: 4.8000Mhz
//AuthorSunany
//Date:2013-5-1

#include <iot13v.h>
#include <macros.h>

unsigned int  ADC_data=0;
unsigned char flag_low_bat=0;

void port_init(void)
{
   DDRB  = 0b00111011;
   PORTB = 0b00111011;
}

void timer0_init(void)
{
   TCCR0B = 0x00;     //stop
   TCNT0 = 0xB4;     //set count
   TCCR0A = 0x00;
   TCCR0B = 0x03;    //start timer
}

//ADC initialize
void adc_init(void)
{
   ADCSRA = 0x00;  //disable adc
   ADMUX = (1<<REFS0);      //采用内部REF
   ACSR=(1<<ACD);           //关闭模拟比较器
   ADCSRB = 0x00;
   ADCSRA = 0b11100011;
   ADMUX |= 0x01;          //启用ADC1
}

unsigned int ADC_Convert(void)
{
   unsigned int temp1,temp2;
   temp1= (unsigned int)ADCL;
   temp2= (unsigned int)ADCH;
   temp2= (temp2<<8) +temp1;
   return(temp2);
}

unsigned int ADC_save(void) //ADC求平均
{
   unsigned char i;
   unsigned int add_data=0;
   for(i=0;i<60;i++)
    {
       add_data += ADC_Convert();
         delay_1ms();
    }
   add_data = add_data/60;
   return(add_data);
}

void LED_display(unsigned int ADC_temp)
{
   unsigned char i;
   if(ADC_temp<400)
    {
         flag_low_bat=1;
    }
   else
   {
      i=ADC_temp/5;
      switch(i)
      {
             case 0: PORTB=0b00111001; //PB1
                       flag_low_bat=0;
                       break;
           case 1: PORTB=0b00111001; //PB1
                     flag_low_bat=2;   //PB3
                       break;
             case 2: PORTB=0b00101001;//PB1,PB3
                       flag_low_bat=0;
                       break;
             case 3: PORTB=0b00101001;//PB1,PB3
                       flag_low_bat=3;  //PB4F
                       break;
             case 4: PORTB=0b00100001;//PB1,PB3,PB4
                     flag_low_bat=0;
                       break;
           defaultORTB=0b00100001;
                       flag_low_bat=0;
                       break;
         }
                  
    }
}

void init_devices(void)
{
   CLI();
   port_init();
   timer0_init();
   adc_init();
   MCUCR = (1<<SM0);  
   TIMSK0 = 0x02;     //timerinterrupt sources
   GIMSK = 0x00;
   SEI();
}

//*****************1ms中断入口函数******************//
#pragma interrupt_handler timer0_ovf_isr:4
void timer0_ovf_isr(void)
{
   static unsigned int cnt0;
   TCNT0 = 0xB4; //reload counter value
   cnt0++;
   if(cnt0==20)
    {
       cnt0=0;
         switch(flag_low_bat)
      {
            case 1ORTB^=0x02;
                   break;
            case 2ORTB^=0x10;
                     break;
            case 3ORTB^=0x08;
                     break;
            default:break;
       }
    }
}

//1ms delay function
void delay_1ms(void)      
{
   unsigned int i;
   for(i=1;i<180;i++)  
   ;  
}
         
void main(void)
{
   init_devices();
   delay_1ms();
   ADC_Convert();
   delay_1ms();
   while(1)
   {
      ADC_data=ADC_save();
      LED_display(ADC_data);
   }
}


    接下来就是装机了,LED显示这块测绘的相当准确,装进去正好,充电板那块因为选的贴片的USB口有点不一样,用刀子整了大半天才整好

[attach]648[/attach][attach]649[/attach]
   
    完成后的整机图,是不是和原来一样?

[attach]650[/attach]

    哦错了,有点不一样,我的充电在那个USB口上方加开了个孔,用来显示充电状态的LED
    整机搞定时间:201351日下午1730

作者: 箫天    时间: 2013-5-3 23:06
呀哈!sunany太强大了,加精!
作者: jerryyong    时间: 2013-5-3 23:26
吴哥太强大了
作者: Tliang    时间: 2013-5-4 09:04
路过帮顶
作者: DIYPCB    时间: 2013-5-4 21:46
友情帮顶,赞一个
作者: 箫天    时间: 2013-5-4 22:31
jerryyong 发表于 2013-5-3 23:26
吴哥太强大了

你是谁?你怎么知道的?
作者: oszp1688com    时间: 2013-5-5 20:54
你那块升压板是之前做好的吗??  怎么不上原理图学习下!
作者: oneway    时间: 2013-5-9 20:08
升压部分上传上来学习学习
作者: DIYPCB    时间: 2013-5-10 19:11
强人一个  必须的帮定
作者: sunany    时间: 2013-5-11 10:54
oneway 发表于 2013-5-9 20:08
升压部分上传上来学习学习

升压部份参见www.alldatasheet.com中的LTC1700嘛
作者: sunany    时间: 2013-5-11 10:59
oszp1688com 发表于 2013-5-5 20:54
你那块升压板是之前做好的吗??  怎么不上原理图学习下!

升压部份之前开的板子,呵呵
作者: sunany    时间: 2013-5-11 11:00
出差一个星期的实验,充满一次我的小米2手机充了三次还有两格的电量
作者: quanpengfei    时间: 2013-5-12 10:17
强大,不知道这个18650是多大容量的,怎样算充电时间呢?
作者: AVR-熊仔    时间: 2013-5-12 22:43
箫天 发表于 2013-5-4 22:31
你是谁?你怎么知道的?

他是联邦物流的,嘎嘎!
作者: DIYPCB    时间: 2013-5-16 17:17
还能再做一套出来有偿分享下不
作者: 铜河    时间: 2013-8-14 12:29
这个牛,怪不得老大一来就射精!
作者: lieyanshouhao    时间: 2013-9-24 16:56
厉害,期望以后达到这个水平,藐视一切高科技
作者: czh    时间: 2013-10-15 07:51
强大,佩服!




欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) Powered by Discuz! X2.5