Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Автоматическое зарядное устройство для SLA аккумуляторов


Автоматическое зарядное устройство для SLA аккумуляторов

Сообщений 1 страница 30 из 76

1

Был у меня модуль от Ekits.ru EK-2006/12 (http://www.ekits.ru/index.php?ukey=prod … ductID=693). Заряжал аккумуляторы медленно но надежно. Но однажды нечаянно закоротили ему вход АЦП на 12 вольт. Стал он всегда показывать ноль и соответственно перестал отключать заряд. Прошивки на сайте нет, другие владельцы сказали, что она в чипе защищена (положа руку на сердце она мне и не нравилась, чуть что, сразу FUL и блокируется), поэтому я набросал свою, используя идею по подключению индикатора с этого сайта. В самой схеме добавил на неиспользуемую ножку контроллера пищалку.
Итак, новая прошивка умеет:
1. Показывать 1 минуту (время здесь и далее примерное, получается таймером на внутреннем RC генераторе, у меня дает ошибку около секунды в минуту) напряжение на выходе, не подключая источник зарядного тока. Полезно при настройке делителя, и вообще для визуальной оценки аккумулятора.
2. Анализировать напряжение на аккумуляторе и на основе анализа либо начинать заряд, либо проводить уточненный анализ на то, какой аккумулятор подключен (и подключен ли вообще).
3. Заряжать как 12 вольтовые, так и 6 вольтовые аккумуляторы, приблизительно подсчитывая время зарядки и индицируя напряжение и время заряда.
4. Автоматически отключать зарядный ток по достижению установленного уровня напряжения на батарее, подав при этом кратковременный сигнал и запомнив время, которое ушло на его достижение.
5. Если аккумулятор не отключили по окончанию заряда, устройство перейдет в режим контроля уровня напряжения, и как только он снизится ниже прогового начнется поззаряд укороченными импульсами с последующим переходом опять в режим контроля.

Фузы на внутренний RC 8 мегагерц, делитель на 8 отключен.

Код:
$regfile = "attiny26.dat"
$hwstack = 32
$swstack = 32
$framesize = 16
$crystal = 8000000



 DdrA = &B01111111                                          'направление линий порта A: 1 - на вывод
PortA = &B01110000

 DdrB = &B01111111
PortB = &B00000000


A Alias PortB.2                                             'Тут вписываем порты к которым подключены сегменты индикатора
B Alias PortB.0
C Alias PortB.4
D Alias PortB.6
E Alias PortB.5
F Alias PortB.1
G Alias PortB.3
Dp Alias PortA.6
Dig1 Alias PortA.0
Dig2 Alias PortA.1
Dig3 Alias PortA.2

UPR Alias PORTA.5
tFREQ Alias PORTA.4
BUZZ Alias PORTA.3

Dim I As Byte , X As Byte , Digs(3) As Byte , SegmLink As Byte , Dg as Byte
Dim U as Word , Ut as Word , Vis as Byte
Dim WordTmp As Word , Razr As Byte , Full As Byte

Dim Second As Byte , Minut As Byte , Hour As Byte , Delit as Byte , TickCnt As Byte       ' переменные для часов

Dim MinutCh As Byte , HourCh As Byte                        ' Время заряда до полного


Declare Sub GetU
Declare Sub DisplU
Declare Sub DisplTime(Byval Hr as Byte , Byval Mn as Byte)

Config Timer0 = Timer , Prescale = 64 : On Timer0 Timer0_int Nosave
Config Timer1 = Timer , Prescale = 1024 : On OVF1 Timer1_int Nosave

TIMSK = &B0000110                                           'Enable Timer0 + Timer1

Enable Interrupts

Start TIMER0
Start TIMER1

Config Adc = Single , Prescaler = Auto , Reference = Internal       'Refrenz: 2,25 V


 Digs(3) = 10 : Digs(2) = 1 : Digs(1) = 6                   ' Версия A1.6
 Razr = 2
 wait 5

' 1 минуту показываем напряжение. Для подстройки например.


Do
 GetU
 Waitms 500
 Call DisplU

Loop Until Hour = 0 and Minut = 1




StartTesting:
 GetU
 Razr = 0                                                   ' < 8 вольт. Либо очень разряжен, либо  его нет совсем, либо 6 вольтовый
 If U < 80 then
BegTst:
  Digs(3) = 24 : Digs(2) = 14 : Digs(1) = 23                ' Дисплей "t E S"
  Ut = U
  UPR = 0                                                   ' Включаю заряд
  Wait 1
  GetU
  if U > 160 then                                           ' Аккумулятор не подключен
   UPR = 1                                                  ' Выключаю заряд
   Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 24               'Дисплей  "b A t"
   Wait 10
   Goto BegTst
  end if
  For i = 1 to 30
   Razr = 1
   Waitms 500
   Razr = 0
   Waitms 500
  next i
  UPR = 1                                                   ' Отключить заряд
  For i = 1 to 3
   Razr = 4 - i
   Wait 2
  Next i
  Razr = 0
  GetU
  If U < Ut then                                            ' Не заряжается
   Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 13               ' Дисплей "b A d"
'   BUZZ = 1
'   Wait 1
'   BUZZ = 0
   Wait 10
   Goto BegTst
  end if
  If U > 45 and U < 80 then
   Ut = 72
   Goto Charge
  end if
 end if
 Ut = 146
Charge:                                                     ' Цикл зарядки
 GetU
 If U > Ut then
  if U > 160 then Goto BegTst
  if Ut = 146 then Ut = 130
  if Ut = 72 then Ut = 62
  Digs(3) = 15 : Digs(2) = 25 : Digs(1) = 20                ' Дисплей "F U L"
  Razr = 0
  If Full = 0 then
   HourCh = Hour : MinutCh = Minut
  end if
  Full = 1
  if HourCh = Hour AND MinutCh = Minut then
   Buzz = 1
   Waitms 300
   Buzz = 0
  end if
  Wait 1
  Call DisplTime(HourCh , MinutCh)
  Goto Charge
 end if

 If Ut < 130 then
  Digs(3) = 25 : Digs(2) = 33 : Digs(1) = 6                 ' Дисплей "u = 6"
  wait 5
 end if



 If Full = 1 Then                                           ' Был заряжен на полную
  Digs(3) = 24 : Digs(2) = 30 : Digs(1) = 36                ' Дисплей "t r c"
  Wait 30
  UPR = 0
  Wait 10
  UPR = 1                                                   'Выключаю заряд
  Goto Charge
 end if
 UPR = 0                                                    'Включаю заряд на примерно минуту
 Call DisplTime(Hour , Minut)                               ' Показываем 2 секунды часы ххh и две секунды минуты xx|
 Call DisplU                                                'Напряжение на батарее
 For i = 1 to 50                                            ' Мигает точкой 50 секунд
  Razr = 2
  Waitms 500
  Razr = 0
  Waitms 500
 Next i
 UPR = 1                                                    'Выключаю заряд
 Waitms 100                                                 ' Пауза, что бы мерить напряжение на батарее, а не выход зарядного
Goto Charge                                                 'конец основного цикла


Sub DisplTime(Hr , Mn )                                     '
  Razr = 0
  Digs(2) = Hr Mod 10
  Hr = Hr \ 10
  Digs(3) = Hr Mod 10
  Digs(1) = 34
  wait 2
  Digs(2) = Mn Mod 10
  Mn = Mn \ 10
  Digs(3) = Mn Mod 10
  Digs(1) = 35
  wait 2
end sub



Sub DisplU
 WordTmp = U
 Razr = 2
 for i = 1 to 3
  Digs(i) = WordTmp Mod 10
  WordTmp = WordTmp \ 10
 next i

end sub


Sub GetU
   Start Adc
   U = 0
   For i = 1 to 3
   Waitms 30
   U = U + Getadc(6)
   Next i
   Stop Adc
   U = U / 15
End Sub



Timer0_int:                                                 ' Обработка прерываний таймера0
$asm
    Push R31                                                'сохраним регистры
    PUSH R26
    Push R25
    Push R24
    Push R20
    Push R16
    Push R10
    Push R0
    In R31 , Sreg
    Push R31
$End asm
set Dig1 : Set Dig2 : Set Dig3
Stop Timer0
$asm
 Lds      R31 , {X}
 INC      R31
 CPI      R31, 4
 BRLO     Save
 LDI      R31,1
Save:
 Sts {X}, R31
$End asm

Dg = Digs(X)

if Dg > 128 then
 Dg = Dg - 128
 SegmLink = Lookup(Dg , Dta)
 SegmLink = SegmLink + 128
else
 SegmLink = Lookup(Dg , Dta)
end if

A = 0
$asm
 Lds      R31 , {SegmLink}
 SBRC     R31, 0
$End asm
A = 1
B = 0
$asm
 SBRC     R31, 1
$End asm
B = 1
C = 0
$asm
 SBRC     R31, 2
$End asm
C = 1
D = 0
$asm
 SBRC     R31, 3
$End asm
D = 1
E = 0
$asm
 SBRC     R31, 4
$End asm
E = 1
F = 0
$asm
 SBRC     R31, 5
$End asm
F = 1
G = 0
$asm
 SBRC     R31, 6
$End asm
G = 1
Dp = 0
$asm
 SBRC     R31, 7
$End asm
Dp = 1

if X = Razr then Dp = 1


Select Case X
 Case 1 : Reset Dig3
 Case 2 : Reset Dig2
 Case 3 : Reset Dig1
End Select
Start Timer0
End_IntTimer0:
$asm
    Pop R31
    OUT Sreg , R31
    POP R0
    POP R10
    POP R16
    POP R20
    POP R24
    POP R25
    POP R26
    Pop R31

 '   reti
$end asm

Return




Timer1_int:
$asm
    Push R31                                                'сохраним регистры
    Ldi R31 , &HB2                                          'переустановим счетчик
    Out Tcnt1 , R31
    In R31 , Sreg
    Push R31
    Push R24
    Push R25

    Lds R31 , {Delit}
    inc R31                                                 'Incr Delit
    Sts {Delit} , R31
    CPI R31, 100                                            'If Delit < 100 Then Goto INTT1_E
    brlo  Intt1_e
    CLR R31                                                 'Delit = 0
    Sts {Delit} , R31
'----- Ниже все вызывается 1 раз в секунду
 '   WDR
    Lds R31 , {Second}
    inc R31
    Sts {Second} , R31
    CPI R31, 60
    brlo  INTT1_E
    clr R31
    Sts {Second} , R31
'---- Ниже все вызывается 1 раз в минуту
    Lds R31 , {Minut}
    inc R31
    Sts {Minut} , R31
    CPI R31, 60
    brlo  INTT1_E
    clr R31
    Sts {Minut} , R31

'---- Ниже все вызывается 1 раз в  час
    Lds R31 , {Hour}
    inc R31
    Sts {Hour} , R31
    CPI R31, 99
    brlo  INTT1_E
    clr R31
    Sts {Hour} , R31
    STS {Full} , R31                                        ' После 99 часов считаем, что нужен полный цикл заряда


Intt1_e:
    POP R25
    POP R24
    Pop R31
    Out Sreg , R31                                          'восстановим регистры
    Pop R31
 '   reti
$end asm
Return


Dta:
'          0           1               2           3            4            5           6           7            8          9
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 , &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
'       A(10)        b(11)         C(12)       d(13)        E(14)       F(15)         G(16)        H(17)        i(18)        J(19)
Data &B01110111 , &B01111100 , &B00111001 , &B01011110 , &B01111001 , &B01110001 , &B01111101 , &B01110110 , &B00110000 , &B00011110
'       L(20)        o(21)         P(22)       S(23)        t(24)        U(25)       Grad(26)      -(27)        .(28)       Empty(29)
Data &B00111000 , &B01011100 , &B01110011 , &B01101101 , &B01111000 , &B00111110 , &B01100011 , &B01000000 , &B10000000 , &B00000000
'       r(30)        _(31)         u(32)       =(33)        h (34)     Минуты|(35)     c (36)
Data &B01010000 , &B00001000 , &B00011100 , &B01001000 , &B01110100 , &B00100000 , &B01011000

Отредактировано IgorL (2010-11-29 15:56:55)

+1

2

Мне тема очень интересна, так как есть несколько таких аккумов.
Если не затруднит, можно схему поподробней?
Заранее спасибо!

0

3

Схема по ссылке http://www.ekits.ru/index.php?ukey=prod … ductID=694

0

4

Спасибо!

0

5

Хорошо бы переделать на ATmega48

0

6

А что там переделывать? Порты переопределить, да тактовую частоту с кристаллом вписать. Для такой простенькой вещи "мега"  - гусарство. 
Делать же навороченный зарядник для SLA особого смысла не вижу. От быстрого заряда (большими токами) они мрут как мухи, тренировка заряд/разряд им мало помогает. Оптимально стабильным током с контролем по перезаряду. Для этого хватит и tiny13 если не заморачиваться с цифровой индикацией (ненужной в общем то подавляющему количеству юзеров), двухцветного диодика, мигающего в разных режимах хватит.

Отредактировано IgorL (2010-12-09 08:59:29)

0

7

Всем привет!
Собрал зарядку, работает, только шим сильно греется. Так должно быть?

0

8

Да, он на максмуме работает. Я приклеил сверху радиатор для чипов памяти.  По хорошему надо бы дополнительный транзистор ставить, но в родной схеме он не предусмотрен...

0

9

IgorL написал(а):

По хорошему надо бы дополнительный транзистор ставить

Я так полагаю полевой с катода D2?
Если можно, киньте схемку.

0

10

Схемок таких в интернете полно. Например такая
http://forum.easyelectronics.ru/download/file.php?id=1200&amp;sid=34cee759fed0e509cbea56cb4832fe57
что то картинка не вставляется.
http://forum.easyelectronics.ru/downloa … cb4832fe57

Отредактировано IgorL (2010-12-13 10:35:06)

0

11

Спасибо!

0

12

IgorL написал(а):

Схемок таких в интернете полно. Например такая

Что-то ни как не могу догнать, как присобачить транзистор. Может быть кто-то знает?

0

13

Спасибо!

Mrshilov написал(а):

Под полевой транзистор нужно схему слегка изменить, см. ссылка, зато греться уже не будет.

В том-то и дело, что я не могу понять: схемы надо соединять или надо переделать схему зарядника как на ссылки?

Mrshilov написал(а):

Хотя ток свича  м/с 1,5А - предел тока для него 0,75А. Так, что на 0,3А греться не должен. Смотри обвязку - дроссель, диоды...

Не у меня одного он греется.

0

14

Mrshilov написал(а):

Если собирать на бредборде - вполне. Импульсная схема очень чувствительна к длине/расположению проводников. Разведи плату, поставь хорошие кондеры с низким ESR и будет счастье.

Это будет, чуть позже. Сейчас хочется разобраться с этой платой.

max написал(а):
Mrshilov написал(а):

Под полевой транзистор нужно схему слегка изменить, см. ссылка, зато греться уже не будет.

В том-то и дело, что я не могу понять: схемы надо соединять или надо переделать схему зарядника как на ссылки?

И все таки: как надо сделать?
Заранее спасибо!

0

15

Mrshilov написал(а):

схема работает НЕ в ключевом режиме.

Если не трудно, можно схему. Я с этими микрами ни когда не работал.
Заранее спасибо!

0

16

Mrshilov написал(а):

Это издевательство какое-то

Я не издеваюсь, реально первый раз столкнулся с этой микрой.

Mrshilov написал(а):

Приведи фото макета и данные примененных деталей.

Есть готовая плата EK-2006/12Kit. R2 = 15кОм(был в комплекте), остальное как на фото.
Заранее спасибо!

0

17

Mrshilov написал(а):

Замерить ток заряда - если больше 0,35А - заменить R3.

На аккуме 7,2А мой прибор паказал 0,47А. Буду разбираться.
Спасибо!

0

18

Понял. Буду копать.

0

19

Примененная МС не совсем ШИМ. Кроме того, она работает просто как ограничитель зарядного тока. В этом режиме она греется гораздо больше. Кроме того дроссель имеет слишком маленькую индуктивность.
Нагрев параметрического стабилизатора и самого микроконтроллера значительно меньше с нижеприведенной версией. Там добавлена возможность "пропуска" тактов индикации, что увеличивает скважность импульсов и как следствие средний ток в цепи стабилизатор-микроконтроллер-индикатор

Код:
$regfile = "attiny26.dat"
$hwstack = 32
$swstack = 32
$framesize = 16
$crystal = 8000000

Const #100 = &B11111111
Const #87 = &B01111111
Const #75 = &B01110111
Const #62 = &B01101101
Const #50 = &B10101010
Const #38 = &B00110010
Const #25 = &B00100010
Const #15 = &B00000011
Const #8 = &B00000001


Const Rz1 = &B00000001:
Const Rz2 = &B00000010:
Const Rz3 = &B00000100:

 DdrA = &B01111111                                          'направление линий порта A: 1 - на вывод
PortA = &B01110000

 DdrB = &B01111111
PortB = &B00000000


A Alias PortB.2                                             'Тут вписываем порты к которым подключены сегменты индикатора
B Alias PortB.0
C Alias PortB.4
D Alias PortB.6
E Alias PortB.5
F Alias PortB.1
G Alias PortB.3
Dp Alias PortA.6
Dig1 Alias PortA.0
Dig2 Alias PortA.1
Dig3 Alias PortA.2

UPR Alias PORTA.5
tFREQ Alias PORTA.4
BUZZ Alias PORTA.3

Dim I As Byte , X As Byte , Digs(3) As Byte , SegmLink As Byte , Dg as Byte
Dim U as Word , Ut as Word
Dim Bright as Byte
Dim WordTmp As Word , DpRz As Byte , Razr As Byte , Full As Byte

Dim Second As Byte , Minut As Byte , Hour As Byte , Delit as Byte , TickCnt As Byte       ' переменные для часов

Dim MinutCh As Byte , HourCh As Byte                        ' Время заряда до полного


Declare Sub GetU
Declare Sub DisplU
Declare Sub DisplTime(Byval Hr as Byte , Byval Mn as Byte)

Config Timer0 = Timer , Prescale = 64 : On Timer0 Timer0_int Nosave
Config Timer1 = Timer , Prescale = 1024 : On OVF1 Timer1_int Nosave

TIMSK = &B0000110                                           'Enable Timer0 + Timer1

Enable Interrupts

Start TIMER0
Start TIMER1

Config Adc = Single , Prescaler = Auto , Reference = Internal       'Refrenz: 2,25 V


Bright = #100

 Digs(3) = 10 : Digs(2) = 1 : Digs(1) = 7                   ' Версия A1.7
 DpRz = 2



' 1 минуту показываем напряжение. Для подстройки например.
Bright = #25

Do
 GetU
 Waitms 500
 Call DisplU

Loop Until Hour = 0 and Minut = 1


StartTesting:
 GetU
 DpRz = 0                                                   ' < 8 вольт. Либо очень разряжен, либо  его нет совсем, либо 6 вольтовый
 If U < 80 then
BegTst:
  Digs(3) = 24 : Digs(2) = 14 : Digs(1) = 23                ' Дисплей "t E S"
  Ut = U
  UPR = 0                                                   ' Включаю заряд
  Wait 1
  GetU
  if U > 160 then                                           ' Аккумулятор не подключен
   UPR = 1                                                  ' Выключаю заряд
   Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 24               'Дисплей  "b A t"
   Wait 10
   Goto BegTst
  end if


  For i = 1 to 30
'   DpRz = 1
   Wait 1
   DpRz.1 = NOT DpRz.1
'   Waitms 500
  next i

  UPR = 1                                                   ' Отключить заряд
  For i = 3 to 1 step -1
   DpRz = i
   Wait 2
  Next i
  DpRz = 0
  GetU
  If U < Ut then                                            ' Не заряжается
   Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 13               ' Дисплей "b A d"
'   BUZZ = 1
'   Wait 1
'   BUZZ = 0
   Wait 10
   Goto BegTst
  end if
  If U > 45 and U < 80 then
   Ut = 72
   Goto Charge
  end if
 end if
 Ut = 146
Charge:                                                     ' Цикл зарядки
 GetU
 If U > Ut then
  if U > 160 then Goto BegTst
  if Ut = 146 then Ut = 130
  if Ut = 72 then Ut = 62
  Digs(3) = 15 : Digs(2) = 25 : Digs(1) = 20                ' Дисплей "F U L"
  DpRz = 0
  If Full = 0 then
   HourCh = Hour : MinutCh = Minut
  end if
  Full = 1
  if HourCh = Hour AND MinutCh = Minut then
   Buzz = 1
   Waitms 300
   Buzz = 0
  end if
  Wait 1
  Call DisplTime(HourCh , MinutCh)
  Goto Charge
 end if

 If Ut < 130 then
  Digs(3) = 25 : Digs(2) = 33 : Digs(1) = 6                 ' Дисплей "u = 6"
  wait 5
 end if



 If Full = 1 Then                                           ' Был заряжен на полную
  Digs(3) = 24 : Digs(2) = 30 : Digs(1) = 36                ' Дисплей "t r c"
  Wait 30
  UPR = 0
  Wait 10
  UPR = 1                                                   'Выключаю заряд
  Goto Charge
 end if
 UPR = 0                                                    'Включаю заряд на примерно минуту
 Call DisplTime(Hour , Minut)                               ' Показываем 2 секунды часы ххh и две секунды минуты xx|
 Call DisplU                                                'Напряжение на батарее
 For i = 1 to 50                                            ' Мигает точкой 50 секунд
  DpRz = 2
  Waitms 500
  DpRz = 0
  Waitms 500
 Next i
 UPR = 1                                                    'Выключаю заряд
 Wait 1                                                     ' Пауза, что бы мерить напряжение на батарее, а не выход зарядного
Goto Charge                                                 'конец основного цикла


Sub DisplTime(Hr , Mn )                                     '
  DpRz = 0
  Digs(2) = Hr Mod 10
  Hr = Hr \ 10
  Digs(3) = Hr Mod 10
  Digs(1) = 34
  wait 2
  Digs(2) = Mn Mod 10
  Mn = Mn \ 10
  Digs(3) = Mn Mod 10
  Digs(1) = 35
  wait 2
end sub



Sub DisplU
 WordTmp = U
 DpRz = 2
 for i = 1 to 3
  Digs(i) = WordTmp Mod 10
  WordTmp = WordTmp \ 10
 next i

end sub


Sub GetU
   Start Adc
   U = 0
   For i = 1 to 3
   Waitms 30
   U = U + Getadc(6)
   Next i
   Stop Adc
   U = U / 15
End Sub



Timer0_int:                                                 ' Обработка прерываний таймера0
$asm
    Push R31                                                'сохраним регистры
    PUSH R26
    Push R25
    Push R24
    Push R20
    Push R16
    Push R10
    Push R0
    In R31 , Sreg
    Push R31
$End asm
set Dig1 : Set Dig2 : Set Dig3
    Lds R31 , {Bright}                                      'Сдвимем биты в переменной по кольцу
    LSR R31
    BRCC  R_NUL
    ORI R31, 128
R_nul:
    Sts {Bright} , R31
    BRCS  ON_LCD
    RJMP End_IntTimer0
ON_LCD:

Stop Timer0
$asm
 Lds      R31 , {X}
 INC      R31
 CPI      R31, 4
 BRLO     Save
 LDI      R31,1
Save:
 Sts {X}, R31
$End asm

Dg = Digs(X)
'(
if Dg > 128 then
 Dg = Dg - 128
 SegmLink = Lookup(Dg , Dta)
 SegmLink = SegmLink + 128
else
 SegmLink = Lookup(Dg , Dta)
end if
')
SegmLink = Lookup(Dg , Dta)

A = 0
$asm
 Lds      R31 , {SegmLink}
 SBRC     R31, 0
$End asm
A = 1
B = 0
$asm
 SBRC     R31, 1
$End asm
B = 1
C = 0
$asm
 SBRC     R31, 2
$End asm
C = 1
D = 0
$asm
 SBRC     R31, 3
$End asm
D = 1
E = 0
$asm
 SBRC     R31, 4
$End asm
E = 1
F = 0
$asm
 SBRC     R31, 5
$End asm
F = 1
G = 0
$asm
 SBRC     R31, 6
$End asm
G = 1
Dp = 0
$asm
 SBRC     R31, 7
$End asm
Dp = 1

if DpRz = X then Dp = 1


Select Case X
 Case 1 : Reset Dig3
 Case 2 : Reset Dig2
 Case 3 : Reset Dig1
End Select


Start Timer0
End_IntTimer0:
$asm
    Pop R31
    OUT Sreg , R31
    POP R0
    POP R10
    POP R16
    POP R20
    POP R24
    POP R25
    POP R26
    Pop R31

 '   reti
$end asm

Return




Timer1_int:
$asm
    Push R31                                                'сохраним регистры
    Ldi R31 , &HB2                                          'переустановим счетчик
    Out Tcnt1 , R31
    In R31 , Sreg
    Push R31

    Lds R31 , {Delit}
    inc R31                                                 'Incr Delit
    Sts {Delit} , R31
    CPI R31, 100                                            'If Delit < 100 Then Goto INTT0_E
    brlo  EndTimer1_Int
    CLR R31                                                 'Delit = 0
    Sts {Delit} , R31
'----- Ниже все вызывается 1 раз в секунду
 '   WDR
    Lds R31 , {Second}
    inc R31
    Sts {Second} , R31
    CPI R31, 60
    brlo  EndTimer1_Int
    clr R31
    Sts {Second} , R31
'---- Ниже все вызывается 1 раз в минуту
    Lds R31 , {Minut}
    inc R31
    Sts {Minut} , R31
    CPI R31, 60
    brlo  EndTimer1_Int
    clr R31
    Sts {Minut} , R31

'---- Ниже все вызывается 1 раз в  час
    Lds R31 , {Hour}
    inc R31
    Sts {Hour} , R31
    CPI R31, 99
    brlo  EndTimer1_Int
    clr R31
    Sts {Hour} , R31
    STS {Full} , R31                                        ' После 99 часов считаем, что нужен полный цикл заряда


EndTimer1_Int:

    Pop R31
    Out Sreg , R31                                          'восстановим регистры
    Pop R31
 '   reti
$end asm
Return


Dta:
'          0           1               2           3            4            5           6           7            8          9
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 , &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
'       A(10)        b(11)         C(12)       d(13)        E(14)       F(15)         G(16)        H(17)        i(18)        J(19)
Data &B01110111 , &B01111100 , &B00111001 , &B01011110 , &B01111001 , &B01110001 , &B01111101 , &B01110110 , &B00110000 , &B00011110
'       L(20)        o(21)         P(22)       S(23)        t(24)        U(25)       Grad(26)      -(27)        .(28)       Empty(29)
Data &B00111000 , &B01011100 , &B01110011 , &B01101101 , &B01111000 , &B00111110 , &B01100011 , &B01000000 , &B10000000 , &B00000000
'       r(30)        _(31)         u(32)       =(33)        h (34)     Минуты|(35)     c (36)
Data &B01010000 , &B00001000 , &B00011100 , &B01001000 , &B01110100 , &B00100000 , &B01011000

Отредактировано IgorL (2011-01-22 09:22:15)

0

20

Посмотрите осциллографом на этот "ШИМ". Никакого изменения скважности (ШириныИмпульса) вы там не увидите, а будут пропуски импульсов. Кстати, на функциональной схеме, которую вы приводите, все честно нарисовано. К тому же выходной каскад биполярный, даже при максимальном открытии сопротивление ключа у нее далеко не нулевое.

Отредактировано IgorL (2011-01-22 17:19:39)

0

21

Вы вообще представляете как работают импульсные преобразователи? О каких "0,35 Ампер" речь? 350 миллиампер это средний ток.  Ток открытого транзистора будет гораздо больше, как минимум вдвое, реально где то около ампера в пике. С напряжение тоже не так уж и радостно. Даташит утверждает о  VCE(sat) при 800 ма в среднем 1 вольт, максимум 1,3волта. Аккуратно умножив получаем где то 1,3 ватта, что похоже на реальность.

Индикатор должен менять, но менять яркость не будет и не меняет. Индикация динамическая, глаз не успевает увидеть разницу. Кстати пробовал делать индикацию перебором не по разрядам, а по сегментам (что обычно и делаю). В этом случае на трехразрядном индикаторе получим в самом "плохом" случае одновременное свечение трех диодов вместо семи. Разницы практически никакой, но кода потребляет гораздо больше.
Схема конечно отстой полный. "Китайская". Но с родной прошивкой все еще хуже. Поэтому все же здесь я публикую прошивку, косяки схемы пусть будут на совести ее авторов.

Отредактировано IgorL (2011-01-22 21:09:28)

0

22

И все таки она вертится греется. Сферическими конями в вакууме перестал интересоваться лет десять назад.  Чего и всем желаю - теорию проверять практикой, ибо в даташите описано не все,  о редких и невыгодных моментах там скромно умалчивают. Греется у всех на ограничении тока.

0

23

Мужики! Какую схему мне надо использовать?

0

24

Mrshilov
Спасибо!

0

25

Все работает. Никаких "разнояркостей" нет. Кренка греется с последней прошивкой умеренно.  МС в этой схеме будет греться. Что бы не грелась, нужно добавлять полевик, как на той ссылке, что приводил.
Mrshilov, а вы закоротите выход в D-Linkе. Если блок питания выдает достаточный ток, сгорит сразу. Чего спорить? Спаяйте с ограничителем и  посмотрите. Все будет видно и (может быть вам?!) станет понятно.  Все подсказки я давал, напомню: ограничение, пропуски, частота, индуктивность, ток... слово "насыщение" что нибудь говорит?

0

26

Купил этот набор, сейчас соберу и попробую.
Просчеты в схемотехнике есть, при переполюсовке
АБ возможен выход МК и взрыв C5.
И ограничительные резисторы в цепи сегментов
не помешают.

0

27

Так и сделал.
А ещё запитал АЦП через LC цепочку + резисторы на сегменты,
защитил МК, RESET через 10К на +5В и 0.1 на GND.
Короче набор "Доделай Сам".

0

28

Понадобилось сделать зарядку для аккумулятора из фонарика.
Что там за аккумулятор, хз, написано только 800 ma/h, 4v.
Раньше не делал зарядные устройства, вот думаю, каким током его заряжать?

"Железо" почти собрал.
В качестве контроллера, использовал ATmega8. Использовал аппаратный ШИМ, который непосредственно управляет ключом на мосфете IRF4905 (по моему, он слишком "жирный" для тока примерно 80 ма., но что было). ШИМ работает и напряжение меняется и по моему, микруха, типа MC34063 явно лишняя - аппаратный ШИМ вполне справляется с управлением ключом на IRF4905.
Теперь осталось написать программу....

Не согласен с алгоритмом заряда, использованным IgorL
По моему, нужно контролировать не только напряжение на аккумуляторе, но и ток заряда, а иначе, если аккумулятор сильно разряжен, то через него, может проходить недопустимо большой ток!
Кроме того, желательно измерять напряжение на аккумуляторе, нагрузив его чем-то, скажем, генератором стабильного тока.

0

29

Пока нет чёткой схемы - собрано на макетной плате.

0

30

Всё здесь http://www.gaw.ru/html.cgi/txt/app/micr … AVR450.htm
Надо на Bascom перевести.

0


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Автоматическое зарядное устройство для SLA аккумуляторов