ups 12v attiny
- Войдите на сайт для отправки комментариев
Вс, 22/06/2014 - 20:32
Тема на коте тыц.
Плата тут.
Все просто, зарядка - генератор тока, переключение на акк - реле, усложнять не хотел, будет время прикручу какую нибуть 34063 на заряд и ШИМ стаб на выход.
Накорябал примерно так:
// || пин attiny13: || чего: #define RELAY_PIN 1 // || PCINT1 (6-PB1) ...... || реле #define BAT_PIN 1 // || ADC1 (7-PB2) ...... || напряжение на аккумуляторе #define PWR_PIN 3 // || ADC3 (2-PB3) ...... || напряжение на входе #define CHARGE_PIN 4 // || PCINT4 (3-PB4) ...... || заряжатель #define INDICATOR_PIN 0 // || PCINT0 (5-PB0) ...... || светодио #define INTERVAL 300UL // время задержки перехода на внешнее питание static unsigned long PMillis = 0; // счетчик задержки static int BAT; // напряжение на аккумуляторе static int PWR; // напряжение на входе static byte BATSTATE = 0; // состояние аккумулятора 0 - при разрядке достиг минимума 10.80, 1 - можно разряжать static byte CHARGEST = 1; // 0 - нужно зарядить, 1 - full (по-умолчанию думаем что заряжен, и ждем 13.22) const int FULL_BATT = 675; // 14.22 const int LOW_BATT = 512; // 10.80 const int SUP_BATT = 629; // 13.22 напряжение включения добивки акк const int DONT_BATT = 530; // 11.20 не включаемся до этого напряжения на акк после разряда (ждем чтобы подзаридили) const int LOW_PWR = 690; // 14.20 на входе (зарядку включать бесполезно) const int OUT_PWR = 640; // 14.00 уровень напряжения на входе при котором переходим на аккумулятор void setup () { pinMode(INDICATOR_PIN, OUTPUT); // pinMode(RELAY_PIN, OUTPUT); // pinMode(BAT_PIN, INPUT); // pinMode(PWR_PIN, INPUT); // pinMode(CHARGE_PIN, OUTPUT); // } void loop () { BAT = analogRead (BAT_PIN); PWR = analogRead (PWR_PIN); if (BAT > DONT_BATT) BATSTATE = 1; // если на акк больше 11.00 - можем перейти на акк if (BAT < LOW_BATT ) BATSTATE = 0; // если на акк меньше 10.80 - акк разряжен if (BAT > FULL_BATT) CHARGEST = 1; // выкл зарядки if (BAT < SUP_BATT ) CHARGEST = 0; // вкл зарядки if (PWR < LOW_PWR) PMillis = millis(); // обнуление задержки if (PWR > LOW_PWR) { // переход на внешнее питание с задержкой INTERVAL if (millis() - PMillis > INTERVAL) { PMillis = millis(); digitalWrite (RELAY_PIN, LOW ); } } if (PWR < OUT_PWR and BATSTATE == 1) { // если на входе меньше 14 и аккумулятор не разряжен - работаем digitalWrite (RELAY_PIN, HIGH); digitalWrite (CHARGE_PIN, LOW); digitalWrite (INDICATOR_PIN,LOW); } if (PWR < OUT_PWR and BATSTATE == 0) { // на входе пусто и аккумулятор сдох !!! digitalWrite (RELAY_PIN, LOW ); } if (PWR > LOW_PWR and CHARGEST == 1) { // если можем заряжать но акк заряжен digitalWrite (CHARGE_PIN, LOW ); digitalWrite (INDICATOR_PIN,HIGH); } if (PWR > LOW_PWR and CHARGEST == 0) { // заряжаем digitalWrite (CHARGE_PIN, HIGH ); digitalWrite (INDICATOR_PIN,LOW); } }
Работает.
Может кто код посмотрит, с целью улучшения? (не кодер я).
Или просто мыли какие?
Попробую другую схему для зарядки аккумулятора. Кусок её выдернул отсюда.
VD2 и VD3 - смотря какой ток.
Попробовал, измерения - отлично. Step-down корявый, - перепробовал несколько индуктивностей, разную частоту, греется слишком сильно, хотя сам по себе step-down не такой уж и холодный, даже на нормальных контроллерах (по крайней мере из тех что пробовал). Ну ещё может что не учёл. Тот же пушпулл на 3525 на двух мосфетах при токах 3-5 ампер холодным у меня получается... а тут 600-800 мА и уже горячо.
Для теста накорябал такое:
Файлы тут.
Заменил зарядку на 34063, на столе собрал почти вот такую схему:
Управление с мк шим в напряжение, R9/C1 - фильтр. При включении на 7-ую ногу подается напряжение выключающее 34063. Ток регулируется подачей 0..5 на базу VT1 (0 - макс ток). Максимум для схемы 750-800 мА.
minamonra можете добавить польную схему с даработками на тини13