搜索
bottom↓
回复: 124

刚制作的数控充电器

[复制链接]

出0入8汤圆

发表于 2009-8-7 16:41:58 | 显示全部楼层 |阅读模式
本人用M16设计制作了一款多功能数控充电器,具体性能参数如下:
1、        可充锂离子电池(恒压、恒流自动转换)用0.5cah的充电率充电,一般2.5小时内可充满。
2、        1-7节镍镉或镍氢电池,可标准和快速充电。
标准充电时以0.1cah充电率充电,采用限时限压方式截止充电。
快速充电以0.5cah充电率充电,采用限时、限压、和-V检测方式截止充电。
标准和快速充电完成自动转入涓流充电,涓流充电率为0.01cah。
3、        可检测充电电流、充电电压、放电电流、放电电压并通过LCD164A显示,当电池放电时还可同时显示电池容量。
4、        充电电路采用开关方式工作,功耗很小,1A充电电流开关管只有微热。
5、        设置双色发光二极管分别指示充、放电状态。
6、        六键设置充电器工作状态,功能如下:
S1键选择充电或放电
S2键选择锂电或镍、氢电池
S3键选择电池节数
S4键选择电池容量
S5键选择快速或标准充电方式
S6键选择启动工作程序。
这是本人的第一版充电器,所以有诸多不如意的地方,比如我的电路板排列不是很紧凑,按键排线在设计PCB时由于疏忽而出错,结果挑断了几条线并用了飞线,并且当初设想的是用五键选择工作状态,使用时发现不是很方便,需要六键,没有办法,只好在软件上使用复键了,还有就是充镍或氢电时-V检测不是很满意,经常出现检测失灵的问题,这些都会在我的第二版充电器中加以纠正。
下面是充电器图片:
(原文件名:DSC00125.JPG)

(原文件名:DSC00120.JPG)
下面是正在给镍电放电的图片:

(原文件名:DSC00116.JPG)
稍后整理好上传原理图、印刷版图和源程序

出0入0汤圆

发表于 2009-8-7 16:44:43 | 显示全部楼层
支持

出0入8汤圆

 楼主| 发表于 2009-8-7 16:54:18 | 显示全部楼层
下面是数控充电器原理图:
(原文件名:充电器原理图.GIF)

出0入8汤圆

 楼主| 发表于 2009-8-7 16:57:21 | 显示全部楼层
这是数控充电器印刷版图:
(原文件名:数控充电器印刷版图.GIF)

出0入8汤圆

 楼主| 发表于 2009-8-7 16:58:39 | 显示全部楼层
下面是源程序:
$regfile = "m16def.dat"
$crystal = 16000000
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portb.6 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portd.2 , Rs = Portd.3
Config Lcd = 16 * 4
Config Timer2 = Timer , Async = On , Prescale = 256
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Config Aci = Off
Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Shi As Long , Fen As Long , Miao As Long , X As String * 2 , Y As String * 2 , Z As String * 2       '定时变量声明
Dim W As Word , V_adc As Word , V_dc As Long , A_dc As Long , Uv1 As String * 5 , A_adc As Word , Uv As String * 5 , Ua As String * 5       'adc变量声明
Dim J As Long , J1 As Long , J2 As Long
Dim I As Word , A As Long
Dim M1 As String * 4 , M2 As String * 2 , M3 As String * 2
Dim C As Long , C1 As Long , C2 As Long , C3 As Long , C4 As Long , Ah As Long
Dim V_key As Word , S As Word , S1 As Word , S2 As Word , S3 As Word , S4 As Word , S5 As Word       '按键变量声明
On Ovf2 Zd
Enable Ovf2
Enable Interrupts
Start Timer1
Stop Timer2
Ddrb.3 = 1                                                  '蜂鸣器初始化
Ddrc.0 = 1                                                  '充电LED初始化
Ddrc.1 = 1                                                  '放电LED初始化
Portb.3 = 0
Ddrd.6 = 1
Portc.0 = 0
Portc.1 = 0
M1 = "STOP"
W = 0
J = 0
J1 = 0
J2 = 0
A_dc = 0
A_adc = 0
V_key = 0
V_adc = 0
V_dc = 0
S1 = 0
S2 = 0
S5 = 0
S = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "Cd and Fd please"
Locate 2 , 1
Lcd M1 ; " key S1_S5"
Locate 3 , 1
Lcd "S1 to Cd/Fd"
Sound Portb.3 , 100 , 1000

'*********主程序********
Do
Start Adc
V_key = Getadc(3)                                           '取按键值
If V_key < 950 And M1 = "STOP" Then                         '判断按键按下
   Waitms 30
   If V_key < 950 Then
      Incr S
      If S > 7 Then
         S = 1                                              '按键防抖
         Select Case V_key
         Case 0 To 40
            If S5 = 0 Then                                  's1按下(Cd/Fd)
               Incr S1
               If S1 > 2 Then S1 = 1
               If S1 = 1 Then
               M2 = "Cd"
               Elseif S1 = 2 Then
               M2 = "Fd"
               End If
               Locate 1 , 1
               Lcd M2 ; "_             "
               Locate 3 , 1
               Lcd "S2 to Li/NQ"
             Elseif S5 <> 0 Then
               If M2 = "Cd" And M3 = "Li" Then
                  Ddrd.5 = 1
                  Pwm1a = W
               Elseif M2 = "Cd" And M3 = "NQ" Then
                  Ddrd.5 = 1
                  Pwm1a = W
               Elseif M2 = "Fd" Then
                  Ddrd.5 = 0
                  Pwm1a = 0
                  Portd.6 = 1
               End If
                  M1 = "OPEN"
                  Start Timer2
                  Timer2 = 128
                  Locate 2 , 1
                  Lcd M1
             End If
         Case 350 To 370                                    's2 按下(Li/NQ)
            If S1 <> 0 Then
               Incr S2
               If S2 > 2 Then S2 = 1
               If S2 = 1 Then
                  M3 = "Li"
               Elseif S2 = 2 Then
                  M3 = "NQ"
               End If
               Locate 1 , 4
               Lcd M3 ; "_"
               Locate 3 , 1
               Lcd "S3 to BTn +   "
            End If
         Case 610 To 620                                    's3按下(电池节数选择)
            If S2 <> 0 Then
               Incr S3
               Incr J
               If J > 7 Then J = 1
               Select Case J
               Case 1
               If M3 = "Li" Then J1 = 300
               If M3 = "NQ" Then
                  J1 = 100
                  J2 = 145
               End If
               Case 2
                     J1 = 200
                     J2 = 290
                     Case 3
                     J1 = 300
                     J2 = 435
                     Case 4
                     J1 = 400
                     J2 = 580
                     Case 5
                     J1 = 500
                     J2 = 725
                     Case 6
                     J1 = 600
                     J2 = 870
                     Case 7
                     J1 = 700
                     J2 = 1015
                     End Select

                 Locate 1 , 7
                 Lcd J ; "n_"
                 Locate 3 , 1
                 Lcd "S4 to BTc +   "
            End If
         Case 740 To 750                                    's4按下(电池容量选择)
             If S3 <> 0 Then
                Incr S4
                C = C + 50
                If C > 1500 Then C = 50
                Locate 1 , 10
                Lcd C ; "mAh"
                Locate 3 , 1
                Lcd "S5 to Q/S      "
             End If
         Case 810 To 820                                    'S5按下(充/放电快慢转换)
               If S4 <> 0 Then
                  Incr S5
                  If S5 > 2 Then S5 = 1
                  If S5 = 1 Then
                     If M2 = "Cd" Then
                        A = C / 2
                        W = 120
                        Locate 4 , 1
                        Lcd "S1 to Quick " ; M2
                     Elseif M2 = "Fd" Then
                        Locate 4 , 1
                        Lcd "s1 to 300mA " ; M2
                     End If

                  Elseif S5 = 2 Then
                     If M2 = "Cd" Then
                        A = C / 10
                        W = 20
                        Locate 4 , 1
                        Lcd "S1 to SLow " ; M2 ; "   "
                     Elseif M2 = "Fd" Then
                        Locate 4 , 1
                        Lcd "S1 to 300mA " ; M2
                     End If
                 End If
               End If
           End Select
      End If
   End If
End If

If M1 = "OPEN" And M2 = "Fd" Then                           '放电检测
   Portc.0 = 1
   Waitms 100
   Portc.0 = 0
   Waitms 100
   For I = 1 To 30
   A_adc = Getadc(2)
   A_dc = A_dc + A_adc
   Next I
   A_dc = A_dc / 30
   V_dc = Getadc(0)
   A_dc = A_dc * 2560
   A_dc = A_dc / 1023
   Ua = Str(a_dc)
   Ua = Format(ua , "0.000")
   V_dc = V_dc * 2560
   V_dc = V_dc / 1023
   Uv = Str(v_dc)
   Uv = Format(uv , " 0.00")
   If V_dc < J1 Then
      Portd.6 = 0
      Portc.0 = 1
      Stop Timer2
      Gosub Bb
      Gosub Xi
      M1 = "STOP"
   End If


Elseif M1 = "OPEN" And M2 = "Cd" Then                       '充电检测
  Portc.1 = 1
  Waitms 100
  For I = 1 To 30
  A_adc = Getadc(1)
  A_dc = A_dc + A_adc
  Next I
  A_dc = A_dc / 30
  A_dc = A_dc * 2560
  A_dc = A_dc / 1023
  Ua = Str(a_dc)
  Ua = Format(ua , "0.000")
  Portc.1 = 0
  Waitms 100
  If M3 = "Li" And Shi < 3 Then                             '锂电检测
     If Fen > 5 And V_dc < 420 Then
        If A_dc < A And W < 1023 Then Incr W
     Elseif Shi > 3 Then
        W = 0
     End If
  Elseif M3 = "NQ" And Shi < 3 Then                         '镍、氢检测
     If Fen > 5 And V_dc < J2 Then
        If A_dc < A And W < 1023 Then Incr W
     Elseif V_dc > J2 Then
        W = C / 100
     End If
  Else
     Pwm1a = W
     Stop Timer2
     Gosub Bb
     Gosub Xi
     Portc.1 = 1
     M1 = "STOP"
  End If

End If
Loop
End

Zd:
Timer2 = 128                                                'T2装入初值
If Miao < 59 Then
   Miao = Miao + 1                                          '秒计时
Elseif Fen < 59 Then
   Miao = 0
   Fen = Fen + 1                                            '分计时
Elseif Shi < 23 Then
   Miao = 0
   Fen = 0
   Shi = Shi + 1                                            '小时计时
End If
   X = Str(shi)
   Y = Str(fen)
   Z = Str(miao)
   X = Format(x , "00")
   Y = Format(y , "00")
   Z = Format(z , "00")
   If M1 = "OPEN" And M2 = "Cd" Then
      Pwm1a = 0
      Waitms 10
      V_dc = Getadc(0)
      Pwm1a = W
      V_dc = V_dc * 2560
      V_dc = V_dc / 1023
      If M3 = "Li" Then
         If V_dc > 420 Then
            If W > 0 Then Decr W
         End If
      End If
      Uv = Str(v_dc)
      Uv = Format(uv , " 0.00")
   Elseif M1 = "OPEN" And M2 = "Fd" Then
      C1 = 300 * Shi
      C2 = 5 * Fen
      C3 = Miao / 12
      C4 = C1 + C2
     Ah = C4 + C3

   End If
   Gosub Xi
Return

Xi:
Locate 2 , 6
Lcd "Ti:" ; X ; ":" ; Y ; ":" ; Z                           '显示计时时间
Locate 4 , 1
Lcd "U:" ; Uv ; "V" ; "        "                            '显示电池端电压值
Locate 3 , 1                                                '电流显示
Lcd "I:" ; Ua ; "A"
If M2 = "Cd" Then
   Locate 3 , 9
   Lcd "       "
Elseif M2 = "NQ" Then
   Locate 3 , 10
   Lcd Ah ; "mAh"
End If
Return

Bb:                                                         '报警
For I = 1 To 6
Sound Portb.3 , 100 , 1000
Waitms 100
Next I
Return

出0入0汤圆

发表于 2009-8-7 17:00:58 | 显示全部楼层
镍氢电池的-v不太明显

出0入0汤圆

发表于 2009-8-7 17:01:45 | 显示全部楼层
貌似不能单独充、检测每一节电池,我想做个四通道单独的。

出0入8汤圆

 楼主| 发表于 2009-8-7 17:01:54 | 显示全部楼层
程序还有很多不完善的地方,比如充镍或氢电时采用-V检测不准确,我在程序中去掉了这部分,等我在第二版中会添加进去

出0入0汤圆

发表于 2009-8-7 17:22:37 | 显示全部楼层
不错,MARK一下。多谢共享。

出0入0汤圆

发表于 2009-8-7 17:26:32 | 显示全部楼层
好呀。。。。

出0入0汤圆

发表于 2009-8-7 17:54:01 | 显示全部楼层
前辈出的东西都是精品

出0入50汤圆

发表于 2009-8-7 20:51:49 | 显示全部楼层
镍氢电池把电流调大点就可以看到明显的-V了。一般至少0.3C以上,否则没法看到,再者现在好的镍氢电池充电都是用0V或温度来作为镍氢电池充满标准的。

出0入8汤圆

 楼主| 发表于 2009-8-7 20:58:40 | 显示全部楼层
我在第二版中将加入温度检测电路,希望大家踊跃拍砖,使我的第二版充电器电路趋于完善,谢谢了

出0入8汤圆

 楼主| 发表于 2009-8-7 21:39:55 | 显示全部楼层
顶的人不多啊,给点意见总可以吧

出0入0汤圆

发表于 2009-8-7 21:52:24 | 显示全部楼层
不错,关注中!

出0入0汤圆

发表于 2009-8-7 22:20:42 | 显示全部楼层
不错。
没看懂ICD怎么检测的。
建议最少2路,最好4路,方便将来转实用。
还有就是改为C比较好,毕竟好维护。

出0入0汤圆

发表于 2009-8-7 22:59:44 | 显示全部楼层
看看哦

出0入0汤圆

发表于 2009-8-7 23:06:45 | 显示全部楼层
不错,加油!

出0入0汤圆

发表于 2009-8-7 23:27:04 | 显示全部楼层
支持一下

出0入8汤圆

 楼主| 发表于 2009-8-8 08:22:40 | 显示全部楼层
回15楼,ICD检测的运放正输入端是接AOL的,就是R208(0.1)的上端。我也考虑用M16做充电器只做一路确实浪费,在第二版中我将实现两路,转C就比较困难了,试着学习了一下,还没有到写使用程序的阶段

出0入8汤圆

发表于 2009-8-8 09:11:24 | 显示全部楼层
不错的数控充电器,支持.

出0入0汤圆

发表于 2009-8-8 11:09:38 | 显示全部楼层
顶一个。

看楼主做的东西都挺不错的,整合起来搞点套件或者开发板之类的给偶等初哥学习一下呀,期待!

出0入0汤圆

发表于 2009-8-8 18:44:10 | 显示全部楼层
弄多几路独立充电吧!
看你的IO很多空的!
为了安全着想还要加上温度监控!

出0入8汤圆

 楼主| 发表于 2009-8-8 20:13:29 | 显示全部楼层
我是准备在第二版中加入温度检测装置的,但是使用过程中我发现脉冲状态下充电电流分别在0.5C-1C时电池温度基本都稍高于室温,我还试用1.2A的电流给两节700mah的镍氢电池充电时才有较高的温升,但是平心而论,我没有想设计1C充电率以上的充电器,但是多路一定是要的

出0入0汤圆

发表于 2009-8-8 20:25:39 | 显示全部楼层
还可以,不过建议学习ATMEL的DEMO
由于ATMEGE的内阻比较高,运放是非必须的.

出0入0汤圆

发表于 2009-8-8 22:38:55 | 显示全部楼层
帮顶!
头像被屏蔽

出0入0汤圆

发表于 2009-8-8 22:56:28 | 显示全部楼层
Cool !

出0入8汤圆

 楼主| 发表于 2009-8-9 19:55:13 | 显示全部楼层
请问24楼运放是非必须的是什么意思?

出0入50汤圆

发表于 2009-8-9 20:18:27 | 显示全部楼层
电流1C以上,必须要电池支持才行,国产的很多电池是没法用的,我测试过,内阻最好的是GP,终于明白GP为什么那么贵了。其它的三洋及其OEM的牌子,在充电电流大了之后,发热超级严重,国产的次世代更是烫手,不敢试验了。充电中我还加了放电脉冲。用1A的电流充600maH的GP 7号电池一点不烫手,温温的而已,由于原先没有放电完全,大约充电30分钟后,出现拐点,为了看到拐点形状,特点多充了一段时间,当时记录了整个曲线,只是年代久源,找不到了。


镍氢电池充电器,如果电池好,是很容易做好的,难点在于现在的电池质量参差不齐,而且电池还有老化等问题存在,表面接触电阻,电池内阻,等等不确定因素,使得很多市售的日本品牌充电器也只能对自己配的电池能比较好地进行充电,你换个品牌的,嘿嘿,很可能就不行了。电池行业应该有标准的吧,不过我估计缺乏监管之后,就流于形式了。

出0入0汤圆

发表于 2009-8-9 21:05:41 | 显示全部楼层
顶一个!!

出0入0汤圆

发表于 2009-8-9 23:13:19 | 显示全部楼层
做的很漂亮

出0入0汤圆

发表于 2009-8-9 23:34:47 | 显示全部楼层
关注一下,不错

出0入0汤圆

发表于 2009-8-9 23:42:24 | 显示全部楼层
顶,记号

出0入0汤圆

发表于 2009-8-9 23:57:25 | 显示全部楼层
资料很全!谢谢!

出0入0汤圆

发表于 2009-8-10 00:22:35 | 显示全部楼层
很好的学习资料,非常感谢楼主的分享精神!

出0入8汤圆

 楼主| 发表于 2009-8-10 08:33:41 | 显示全部楼层
正如楼上一位朋友所说,要做一款适合多种电池的万能充电器是很困难的,我们只能做到准万能了,这个充电器在充锂电方面非常完美,我采用的是timer2的一秒定时中断,然后停充10ms并检测电池开路电压,如果大于4.2V,ocr1a寄存器数值减一,完成恒压到恒流的自动转换,当充电电流为零或时间大于3小时时自动切断充电电路,我经过大量充放电试验,0.5C充电率整个充电过程为2小时左右,充满后的电池端电压为4.22V,几分钟后电压稳定于4.2V,我的手机是飞利浦X800,待机时间比较长,一般可以20天左右,我在更换电池时测量端电压仍为4.2V。
但是在充镍电方面,如果采用标准充电的话性能很好,但是快速充电由于-v检测始终没有做到100%的准确,所以只能使用最高截止电压加计时的方式检测,这让我很不满意,目前仍在调整程序,希望在第二版中能有所突破。
氢电方面-V不是很明显,所以应该采用安全高效的温度控制方式检测电池是否充满,这我也会在第二版中添加。
目前充电器不完善的地方还有放电器,细心的朋友可能已经看到我在原理图中设置了JP1,提供放电控制的两种方案,一是I/O口直接提供,二是pwm1b的脉宽调制,试验中发现采用pwm1b的脉宽调制方式控制放电,在电压和电流检测时数字始终跳跃变化,我采用了多种软、硬件滤波方式和电路结构还是不能解决这个问题,只好又改为I/O控制了,但是仍然不死心,还是保留了JP1,希望找到突破口,因为采用脉宽调制的方式确实有很多让人心动的优点。
综上所述,我的第二版充电器大致成型,4路独立充电结构,锂电恒压恒流转换,镍电标准充电和快速充电两种方式,快速充电-v、温度、定时、最高电压检测,氢电快速充电温度控制加计时和最高电压检测,恒流放电。

出0入8汤圆

 楼主| 发表于 2009-8-10 10:46:52 | 显示全部楼层
还有,我建议阿莫进一些可混装5号、7号电池的直插优质电池坐,因为我相信阿莫元件的品质

出0入0汤圆

发表于 2009-8-10 11:09:21 | 显示全部楼层
记号先。
得空再慢慢学习!

出0入0汤圆

发表于 2009-8-10 16:47:46 | 显示全部楼层
谢谢LZ啦,收了,我刚刚用美信MAX713做了可充1-16节镍氢的充电器。

出0入0汤圆

发表于 2009-8-10 22:22:02 | 显示全部楼层
太佩服您了,不过如果能做成10节左右的充电就好了,至少能做8节也可以,因为8节成组使用的场合较多!

出0入50汤圆

发表于 2009-8-10 22:42:00 | 显示全部楼层
电池多节串连的 充满判断是很麻烦的,镍镉电池还好,镍氢电池本身负电压就不明显,如果多节串联,有些电池电压还在上升,就会把出现负电压的电池的负电压给掩盖掉,大大增加误判概率了。温度斜率控制比较好。

出0入8汤圆

 楼主| 发表于 2009-8-12 10:16:47 | 显示全部楼层
我设计充最高七节是因为我的万用表使用的是超霸镍氢层叠电池,常需要充电,至于其他类型的电池组目前很少用到,其实楼上很多朋友都表达了串充的不足之处,而我们在日常生活中其实也真的很少用到镍氢或镍镉的电池组,常需要充电的大多是手机锂电和一些数码产品中用的镍氢电池,所以设计制作多组独立的单节充电器还是很实用的。

出0入0汤圆

发表于 2009-9-5 16:45:47 | 显示全部楼层
现在用BASIC写程序的越来越少了,好的作品就更是凤毛麟角。
读了你的程序,发现几个问题:
1、键盘防抖语句好像有些问题,由于你采用的是ADC键盘,可以在程序的适当位置加一条判断语句,检测ADC的返回值是否大于940,以此来判断按键释放,效果应该更好一些。
2、显示子程序如下:
Xi:
Locate 2 , 6
Lcd "Ti:" ; X ; ":" ; Y ; ":" ; Z                           '显示计时时间
Locate 4 , 1
Lcd "U:" ; Uv ; "V" ; "        "                            '显示电池端电压值
Locate 3 , 1                                                '电流显示
Lcd "I:" ; Ua ; "A"
If M2 = "Cd" Then
   Locate 3 , 9
   Lcd "       "
Elseif M2 = "NQ" Then
   Locate 3 , 10
   Lcd Ah ; "mAh"
End If
Return
下面的两个条件判断语句起什么作用?能运行吗?

出0入8汤圆

 楼主| 发表于 2009-9-5 17:51:41 | 显示全部楼层
程序已经更新如下:
$regfile = "m16def.dat"
$crystal = 16000000
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portb.6 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portd.2 , Rs = Portd.3
Config Lcd = 16 * 4
Config Timer2 = Timer , Async = On , Prescale = 256
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Config Aci = Off
Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Shi As Long , Fen As Long , Miao As Long , X As String * 2 , Y As String * 2 , Z As String * 2       '定时变量声明
Dim W As Word , V_adc As Word , V_dc As Long , A_dc As Long , Uv1 As String * 5 , A_adc As Word , Uv As String * 5 , Ua As String * 5       'adc变量声明
Dim J As Long , J1 As Long , J2 As Long
Dim I As Word , A As Long
Dim M1 As String * 4 , M2 As String * 2 , M3 As String * 2
Dim C As Long , C1 As Long , C2 As Long , C3 As Long , C4 As Long , Ah As String * 4
Dim V_key As Word , S As Word , S1 As Word , S2 As Word , S3 As Word , S4 As Word , S5 As Word       '按键变量声明
On Ovf2 Zd
Enable Ovf2
Enable Interrupts
Start Timer1
Stop Timer2
Timer2 = 0
Ddrb.3 = 1                                                  '蜂鸣器初始化
Ddrc.0 = 1                                                  '充电LED初始化
Ddrc.1 = 1                                                  '放电LED初始化
Portb.3 = 0
Ddrd.6 = 1
Portc.0 = 0
Portc.1 = 0
M1 = "STOP"
W = 0
J = 0
J1 = 0
J2 = 0
A_dc = 0
A_adc = 0
V_key = 0
V_adc = 0
V_dc = 0
S1 = 0
S2 = 0
S3 = 0
S4 = 0
S5 = 0
S = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "Cd and Fd please"
Locate 2 , 1
Lcd M1 ; " key S1_S5"
Locate 3 , 1
Lcd "S1 to Cd/Fd"
Sound Portb.3 , 100 , 1000

'*********主程序********
Do
Start Adc
V_key = Getadc(3)                                           '取按键值
If V_key < 950 And M1 = "STOP" Then                         '判断按键按下
   Waitms 30
   If V_key < 950 Then
      Incr S
      If S > 7 Then
         S = 1                                              '按键防抖
         Select Case V_key
         Case 0 To 40
            If S5 = 0 Then                                  's1按下(Cd/Fd)
               Incr S1
               If S1 > 2 Then S1 = 1
               If S1 = 1 Then
               M2 = "Cd"
               Elseif S1 = 2 Then
               M2 = "Fd"
               End If
               Locate 1 , 1
               Lcd M2 ; "_             "
               Locate 3 , 1
               Lcd "S2 to Li/Nq"
             Elseif S5 <> 0 Then
               V_adc = Getadc(0)
               If V_adc > 0 Then
                  If M2 = "Cd" Then
                     Ddrd.5 = 1
                     Pwm1a = W
                  Elseif M2 = "Fd" Then
                     Pwm1a = 0
                     Portd.6 = 1
                  End If
                  M1 = "OPEN"
                  Start Timer2
                  Timer2 = 128
                  Locate 2 , 1
                  Lcd M1
               Else
                 Sound Portb.3 , 100 , 1000
               End If
             End If
         Case 350 To 370                                    's2 按下(Li/NQ)
            If S1 <> 0 Then
               Incr S2
               If S2 > 2 Then S2 = 1
               If S2 = 1 Then
                  M3 = "Li"
               Elseif S2 = 2 Then
                  M3 = "Nq"
               End If
               Locate 1 , 4
               Lcd M3 ; "_"
               Locate 3 , 1
               Lcd "S3 to BTn +   "
            End If
         Case 610 To 620                                    's3按下(电池节数选择)
            If S2 <> 0 Then
               Incr S3
               Incr J
               If J > 7 Then J = 1
               Select Case J
               Case 1
                  If M3 = "Li" Then
                     J1 = 300
                     J2 = 420
                  Elseif M3 = "Nq" Then
                     J1 = 100
                     J2 = 145
                  End If
               Case 2
                     J1 = 200
                     J2 = 290
               Case 3
                     J1 = 300
                     J2 = 435
               Case 4
                     J1 = 400
                     J2 = 580
               Case 5
                     J1 = 500
                     J2 = 725
               Case 6
                     J1 = 600
                     J2 = 870
               Case 7
                     J1 = 700
                     J2 = 1015
               End Select
                   Locate 1 , 7
                   Lcd J ; "n_"
                   Locate 3 , 1
                   Lcd "S4 to BTc +   "
            End If
         Case 740 To 750                                    's4按下(电池容量选择)
             If S3 <> 0 Then
                Incr S4
                C = C + 50
                If C > 1500 Then C = 50
                Ah = Str(c)
                Ah = Format(ah , "    ")
                Locate 1 , 10
                Lcd Ah ; "mah"
                Locate 3 , 1
                Lcd "S5 to Quick/Slow"
             End If
         Case 810 To 820                                    'S5按下(充/放电快慢转换)
               If S4 <> 0 Then
                  Incr S5
                  If S5 > 2 Then S5 = 1
                  If S5 = 1 Then
                     If M2 = "Cd" Then
                        If M3 = "Li" Then W = 120
                        If M3 = "Nq" Then W = 50
                        A = C / 2
                        Locate 4 , 1
                        Lcd "S1 to Quick " ; M2
                     Elseif M2 = "Fd" Then
                        A = 300
                        Locate 4 , 1
                        Lcd "s1 to 300mah " ; M2
                     End If

                  Elseif S5 = 2 Then
                     If M2 = "Cd" Then
                        A = C / 10
                        W = 10
                        Locate 4 , 1
                        Lcd "S1 to SLow " ; M2 ; "  "
                     Elseif M2 = "Fd" Then
                        A = 300
                        Locate 4 , 1
                        Lcd "S1 to 300mah " ; M2 ; "  "
                     End If
                 End If
               End If
           End Select
      End If
   End If
End If

If M1 = "OPEN" And M2 = "Fd" Then                           '放电检测
   Portc.0 = 1
   Waitms 100
   Portc.0 = 0
   Waitms 100
   A_dc = Getadc(2)
   V_dc = Getadc(0)
   A_dc = A_dc * 2560
   A_dc = A_dc / 1023
   Ua = Str(a_dc)
   Ua = Format(ua , "0.000")
   V_dc = V_dc * 2560
   V_dc = V_dc / 1023
   Uv = Str(v_dc)
   Uv = Format(uv , " 0.00")
   If V_dc < J1 Then
      Portd.6 = 0
      Portc.0 = 1
      Gosub Bb
      Locate 2 , 1
      Lcd M1
   End If


Elseif M1 = "OPEN" And M2 = "Cd" Then                       '充电检测
        Portc.1 = 1
        Waitms 100
        For I = 1 To 30
        A_adc = Getadc(1)
        A_dc = A_dc + A_adc
        Next I
        A_dc = A_dc / 30
        A_dc = A_dc * 2560
        A_dc = A_dc / 1023
        Ua = Str(a_dc)
        Ua = Format(ua , "0.000")
        Portc.1 = 0
        Waitms 100
  If M3 = "Li" Then                                         '锂电检测
     If Shi < 3 Then
        If Fen > 2 And V_dc < 420 Then
           If A_dc < A And W < 1023 Then Incr W
        End If
     Else
        Pwm1a = 0
        Portc.1 = 1
        Gosub Bb
     End If
  Elseif M3 = "Nq" Then                                     '镍、氢检测
     If S5 = 1 Then                                         '快充时
        If Shi < 3 Then
           If Fen > 2 And V_dc < J2 Then
              If A_dc < A And W < 1023 Then Incr W
           Elseif V_dc > J2 Then
              Sound Portb.3 , 100 , 1000
              A = C / 100                                   '转涓流
              W = 5
           End If
        Else
        Pwm1a = 0
        Portc.1 = 1
        Gosub Bb
        End If
     Elseif S5 = 2 Then                                     '标准充电
        If Shi < 15 And V_dc < J2 Then
           If A_dc < A And W < 1023 Then Incr W
        Else
          Sound Portb.3 , 100 , 1000
          A = C / 100
          W = 5
        End If
     End If

  End If
End If
Loop
End

Zd:
Timer2 = 128                                                'T2装入初值
If Miao < 59 Then
   Miao = Miao + 1                                          '秒计时
Elseif Fen < 59 Then
   Miao = 0
   Fen = Fen + 1                                            '分计时
Elseif Shi < 23 Then
   Miao = 0
   Fen = 0
   Shi = Shi + 1                                            '小时计时
End If
   X = Str(shi)
   Y = Str(fen)
   Z = Str(miao)
   X = Format(x , "00")
   Y = Format(y , "00")
   Z = Format(z , "00")
   If M1 = "OPEN" And M2 = "Cd" Then
      Pwm1a = 0
      Waitms 10
      V_dc = Getadc(0)
      Pwm1a = W
      V_dc = V_dc * 2560
      V_dc = V_dc / 1023
      If M3 = "Li" Then
         If V_dc > 420 Then
            If W > 0 Then Decr W
         End If
      End If
      Uv = Str(v_dc)
      Uv = Format(uv , " 0.00")
      Locate 3 , 10
      Lcd "       "
   Elseif M1 = "OPEN" And M2 = "Fd" Then
      C1 = 300 * Shi
      C2 = 300 * Fen
      C2 = C2 / 60
      C3 = 300 * Miao
      C3 = C3 / 3600
      C4 = C1 + C2
      C4 = C4 + C3
      Ah = Str(c4)
      Ah = Format(ah , "    ")
      Locate 3 , 10
      Lcd Ah ; "mah"
   End If
   Gosub Xi
Return

Xi:
Locate 2 , 6
Lcd "Ti:" ; X ; ":" ; Y ; ":" ; Z                           '显示计时时间
Locate 4 , 1
Lcd "U:" ; Uv ; "V" ; "       "                             '显示电池端电压值
Locate 3 , 1                                                '电流显示
Lcd "I:" ; Ua ; "A" ; " "
Return

Bb:                                                         '报警
For I = 1 To 6
Sound Portb.3 , 100 , 1000
Waitms 100
Next I
Stop Timer2
Timer2 = 0
M1 = "STOP"
Gosub Xi
Return

出0入0汤圆

发表于 2009-9-5 18:53:53 | 显示全部楼层
建议加入容量检测,并且自动计算充电时间,在规定时间内把电池充满!
充满后显示当先每节电池的可用容量!

出0入0汤圆

发表于 2009-9-5 20:55:35 | 显示全部楼层
mark

出0入8汤圆

 楼主| 发表于 2009-9-6 10:34:27 | 显示全部楼层
回【44楼】 bbsniua 鹏:
电池容量检测一般是在放电状态下进行,因为放电时电池是始终恒定的300mA,根据放电时间计算电池容量比较准确,这在我的程序中有
就是下面这段:
      C1 = 300 * Shi
      C2 = 300 * Fen
      C2 = C2 / 60
      C3 = 300 * Miao
      C3 = C3 / 3600
      C4 = C1 + C2
      C4 = C4 + C3
      Ah = Str(c4)
      Ah = Format(ah , "    ")
      Locate 3 , 10
      Lcd Ah ; "mah"
为了减少充电时间,现在充电器大都设计成快速充电方式,检测充满后还要转入涓流充电,所以在不同阶段电池的充电电流是不同的,充电时计算电池容量比较困难

出0入0汤圆

发表于 2009-9-6 13:29:36 | 显示全部楼层
想做一个,可是不会画PCB,楼主可否共享一下,我也热转印玩一下,谢谢

出0入8汤圆

 楼主| 发表于 2009-9-6 14:42:58 | 显示全部楼层
回【47楼】 holged :
这个充电器还有很多不完善的地方,PCB也有一些BUG,正在努力改善,等第二版出了吧,到时会公布所有资料,包括热转印

出0入0汤圆

发表于 2009-9-7 22:40:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-3 11:12:14 | 显示全部楼层
学习中

出0入0汤圆

发表于 2010-3-4 10:26:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-16 00:14:28 | 显示全部楼层
太棒了。又一个充电器制作资料。

出0入0汤圆

发表于 2010-3-16 02:07:35 | 显示全部楼层
镍氢电池不是-V,镍镉才是,镍氢应该是水平曲线判断。

出0入0汤圆

发表于 2010-3-16 10:29:49 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2010-3-16 11:03:35 | 显示全部楼层
ddddddddddddd

出0入0汤圆

发表于 2010-3-16 17:07:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-16 18:26:17 | 显示全部楼层
啥时候上第二版,期待。。。。。

出0入85汤圆

发表于 2010-3-16 19:38:31 | 显示全部楼层
mark

出10入10汤圆

发表于 2010-3-16 21:51:48 | 显示全部楼层
怎么实现恒流和恒压的转换或检测.我原来的想法是恒流时通过检测电流的电阻上的电压(差分检测)来控制PWM脉宽,恒压时通过检测电池上的电压来控制PWM脉宽.

出0入8汤圆

 楼主| 发表于 2010-3-17 10:26:42 | 显示全部楼层
回【57楼】 gps422129的问题,最近比较忙,第二版的设计时断时续,完善的作品尚需要时日。

出0入8汤圆

 楼主| 发表于 2010-3-17 10:35:43 | 显示全部楼层
回【59楼】 yangyi的问题,恒流转恒压检测的过程是这样的,充电时每秒钟停止充电10ms检测电池开路端电压(差分检测,电路中由IC202C来完成),当电池端电压达到4.2V时,恒流充电改为恒压充电,同时继续检测电池端电压,大于4.2V就减小PWM脉宽,直到充电电流小于100ma停止充电

出0入0汤圆

发表于 2010-4-13 16:57:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-13 21:48:14 | 显示全部楼层
租个女友回家过年

出0入8汤圆

 楼主| 发表于 2010-4-29 09:08:33 | 显示全部楼层
最近开始试制这款充电器的改进版,正好前不久制作了一台频率计,就想测试一下pwm输出频率,我采用的是16M晶振,计算的频率应该是15khz,但是用频率计实测只有7.7khz左右,百思不得其解,虽然没有示波器无法看pwm的输出波形,但是我还是觉得应该是bascom语言设置pwm工作方式的语句让单片机没有工作在快速pwm模式下,于是在程序中加入下面一句代码:
TCCR1A=&H87        '比较匹配清零10位快速pwm模式
然后刷人程序实测频率竟然高达25khz,这是充电电流1A左右时的pwm频率,20ma涓流充电时高到40khz,频率提高了这么多真是没有想到的事,以前看到电路板上那个黑乎乎的庞然大物就来气,现在可以用小一些的磁芯了

出0入8汤圆

 楼主| 发表于 2010-4-29 09:44:35 | 显示全部楼层
更正一下我上面的数据,我觉得频率不应该是25khz,应该是30khz才对,所以检查了设备,发现我的频率计接地夹接触不良,重新焊接后再测的数据是大电流时pwm频率为30khz,小电流时是52khz

出0入0汤圆

发表于 2010-4-30 08:15:58 | 显示全部楼层
顶!

出0入0汤圆

发表于 2010-4-30 09:02:00 | 显示全部楼层
回复【43楼】jianjun42
-----------------------------------------------------------------------

这个是什么语言啊,看不太懂???

出0入0汤圆

发表于 2010-5-3 22:37:29 | 显示全部楼层
继续跟踪。。。。

出0入0汤圆

发表于 2010-5-3 23:50:00 | 显示全部楼层
做的不错!!顶!!

出0入0汤圆

发表于 2010-5-4 08:47:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-4 17:01:59 | 显示全部楼层
好呀。。。。

出0入0汤圆

发表于 2010-5-5 21:08:58 | 显示全部楼层
mark一下,有问题时再来请教!

出0入0汤圆

发表于 2010-5-10 22:40:49 | 显示全部楼层
LZ的第二版是不是快出来了

出0入0汤圆

发表于 2010-6-29 19:10:41 | 显示全部楼层
mark。
收集起来,备用。

出0入0汤圆

发表于 2010-7-6 17:52:38 | 显示全部楼层
good5

出0入0汤圆

发表于 2010-7-6 19:33:56 | 显示全部楼层
有空我要做个。

出0入0汤圆

发表于 2010-8-4 06:44:50 | 显示全部楼层
楼主:你这个数控的好不好改充蓄电池的啊?我想做个蓄电池的充电器。

出0入4汤圆

发表于 2010-8-4 08:45:41 | 显示全部楼层
想问一下 电路中的Ifd是用来干嘛的呢?也是用来检测电流的?

出0入8汤圆

 楼主| 发表于 2010-11-12 15:35:19 | 显示全部楼层
回楼上,ifd是检测放电电流的

出0入8汤圆

 楼主| 发表于 2010-11-12 15:46:29 | 显示全部楼层
回74楼的朋友,真是不好意思了,今年我们单位筹备电视台数字化,工程比较浩大,每天是起早贪黑的,数控充电器第二版的事早就撂下了,预计12月底可以开通,到时应该可以拾起来,不过还是要谢谢大家的关注

出0入0汤圆

发表于 2010-11-12 21:53:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-13 14:16:07 | 显示全部楼层
mark~谢谢分享

出0入0汤圆

发表于 2010-11-14 08:55:40 | 显示全部楼层
这个一定要MARK

出0入0汤圆

发表于 2010-11-14 14:45:20 | 显示全部楼层
值得留个记号

出0入0汤圆

发表于 2010-11-14 21:04:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-15 10:06:58 | 显示全部楼层
很不错!!

出0入0汤圆

发表于 2011-4-6 23:00:46 | 显示全部楼层
很不错,资料也很全

出0入0汤圆

发表于 2011-4-6 23:09:44 | 显示全部楼层
第二版咋样了?
充电部分倒无所谓。我想照楼主的电路做个4路电池容量放电测试器,期待第二版

出0入0汤圆

发表于 2011-7-12 11:09:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-12 11:55:59 | 显示全部楼层
mark dingqi

出0入0汤圆

发表于 2011-8-8 21:14:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-8 21:53:15 | 显示全部楼层
多谢共享。

出0入0汤圆

发表于 2011-8-8 22:00:26 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-17 12:54:44 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-17 13:47:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-17 15:17:57 | 显示全部楼层
备用!

出0入0汤圆

发表于 2011-8-17 16:26:03 | 显示全部楼层
程序 看不懂啊,只会C啊

出0入0汤圆

发表于 2011-8-17 16:43:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-17 17:24:35 | 显示全部楼层
很不错啊 值得学习!!标记
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 17:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表