Тема на коте тыц.

Плата тут.
Все просто, зарядка - генератор тока, переключение на акк - реле, усложнять не хотел, будет время прикручу какую нибуть 34063 на заряд и ШИМ стаб на выход.
Накорябал примерно так:
02 | #define RELAY_PIN 1 // || PCINT1 (6-PB1) ...... || реле |
03 | #define BAT_PIN 1 // || ADC1 (7-PB2) ...... || напряжение на аккумуляторе |
04 | #define PWR_PIN 3 // || ADC3 (2-PB3) ...... || напряжение на входе |
05 | #define CHARGE_PIN 4 // || PCINT4 (3-PB4) ...... || заряжатель |
06 | #define INDICATOR_PIN 0 // || PCINT0 (5-PB0) ...... || светодио |
07 | #define INTERVAL 300UL // время задержки перехода на внешнее питание |
08 | static unsigned long PMillis = 0; |
11 | static byte BATSTATE = 0; |
12 | static byte CHARGEST = 1; |
13 | const int FULL_BATT = 675; |
14 | const int LOW_BATT = 512; |
15 | const int SUP_BATT = 629; |
16 | const int DONT_BATT = 530; |
17 | const int LOW_PWR = 690; |
18 | const int OUT_PWR = 640; |
21 | pinMode(INDICATOR_PIN, OUTPUT); |
22 | pinMode(RELAY_PIN, OUTPUT); |
23 | pinMode(BAT_PIN, INPUT); |
24 | pinMode(PWR_PIN, INPUT); |
25 | pinMode(CHARGE_PIN, OUTPUT); |
29 | BAT = analogRead (BAT_PIN); |
30 | PWR = analogRead (PWR_PIN); |
31 | if (BAT > DONT_BATT) BATSTATE = 1; |
32 | if (BAT < LOW_BATT ) BATSTATE = 0; |
33 | if (BAT > FULL_BATT) CHARGEST = 1; |
34 | if (BAT < SUP_BATT ) CHARGEST = 0; |
35 | if (PWR < LOW_PWR) PMillis = millis(); |
37 | if (millis() - PMillis > INTERVAL) { |
39 | digitalWrite (RELAY_PIN, LOW ); |
42 | if (PWR < OUT_PWR and BATSTATE == 1) { |
43 | digitalWrite (RELAY_PIN, HIGH); |
44 | digitalWrite (CHARGE_PIN, LOW); |
45 | digitalWrite (INDICATOR_PIN,LOW); |
47 | if (PWR < OUT_PWR and BATSTATE == 0) { |
48 | digitalWrite (RELAY_PIN, LOW ); |
50 | if (PWR > LOW_PWR and CHARGEST == 1) { |
51 | digitalWrite (CHARGE_PIN, LOW ); |
52 | digitalWrite (INDICATOR_PIN,HIGH); |
54 | if (PWR > LOW_PWR and CHARGEST == 0) { |
55 | digitalWrite (CHARGE_PIN, HIGH ); |
56 | digitalWrite (INDICATOR_PIN,LOW); |
Работает.
Может кто код посмотрит, с целью улучшения? (не кодер я).
Или просто мыли какие?
Попробую другую схему для зарядки аккумулятора. Кусок её выдернул отсюда.
VD2 и VD3 - смотря какой ток.
Попробовал, измерения - отлично. Step-down корявый, - перепробовал несколько индуктивностей, разную частоту, греется слишком сильно, хотя сам по себе step-down не такой уж и холодный, даже на нормальных контроллерах (по крайней мере из тех что пробовал). Ну ещё может что не учёл. Тот же пушпулл на 3525 на двух мосфетах при токах 3-5 ампер холодным у меня получается... а тут 600-800 мА и уже горячо.
Для теста накорябал такое:
01
#include <PWM.h>
02
#include "arduino.h"
03
#include <Wire.h>
04
#include <LiquidCrystal_I2C.h>
05
LiquidCrystal_I2C lcd(0x27,20,4);
06
// set the LCD address to 0x27 for a 16 chars and 2 line display
07
int
VBAT = 0;
08
int
IBAT = 0;
09
int
CURRENT = 65;
10
int
DUTY = 0;
11
int32_t frequency = 40000;
// desired frequency in Hertz
12
#define PWM_PIN 3 // the output pin for the pwm
13
#define INTERVAL 200UL //
14
static
unsigned
long
PMillis = 0;
//
15
void
setup
() {
16
pinMode(0, INPUT);
17
pinMode(1, INPUT);
18
lcd.init();
19
lcd.backlight();
20
InitTimersSafe();
21
bool
success = SetPinFrequencySafe(PWM_PIN, frequency);
22
//if the pin frequency was set successfully, turn pin 13 on
23
if
(success) {
24
pinMode(13, OUTPUT);
25
digitalWrite(13, HIGH);
26
}
27
}
28
void
loop
() {
29
VBAT = analogRead(0);
30
IBAT = analogRead(1);
31
if
(IBAT>CURRENT) DUTY--;
32
if
(IBAT<CURRENT) DUTY++;
33
pwmWrite(PWM_PIN, DUTY);
34
if
(millis() - PMillis > INTERVAL) {
35
PMillis = millis();
36
lcd.setCursor(0, 0);
37
lcd.print(
"V:"
);
38
if
(VBAT<1000) lcd.print(0);
if
(VBAT<100) lcd.print(0);
if
(VBAT<10) lcd.print(0);
39
lcd.print(VBAT);
40
lcd.setCursor(0, 1);
41
lcd.print(
"I:"
);
42
if
(IBAT<1000) lcd.print(0);
if
(IBAT<100) lcd.print(0);
if
(IBAT<10) lcd.print(0);
43
lcd.print(IBAT);
44
lcd.setCursor(0, 2);
45
}
46
}
Файлы тут.
Заменил зарядку на 34063, на столе собрал почти вот такую схему:
Управление с мк шим в напряжение, R9/C1 - фильтр. При включении на 7-ую ногу подается напряжение выключающее 34063. Ток регулируется подачей 0..5 на базу VT1 (0 - макс ток). Максимум для схемы 750-800 мА.
minamonra можете добавить польную схему с даработками на тини13