Контактная сварка батареек на atmega328p (arduino nano)

Тема в разделе "Глядите, что я сделал", создана пользователем An4ous, 24 апр 2025 в 20:25.

  1. An4ous

    An4ous Нерд

    Может для кого-то будет актуально, и захотите повторить
    Контактная сварка для Li-ion аккумуляторов и не только на базе трансформатора от микроволновки, аппарат получился довольно хороший, ленту не жжет, не перегревает
    Аппарат варит в 2х режимах: одиночный импульс и двойной.
    При включении подгружается сохранённое время из Eeprom

    В одиночном режиме на индикаторе горит только время, поворотом энкодера меняется время импульса в мс, одиночным нажатием на кнопку энкодера попадаем в меню настройки одиночного импульса (левый сегмент мигает) выставляем время, подтверждаем повторным нажатием на кнопку с сохранением в память для последующей загрузки сохранённых значений.

    При двойном нажатии на энкодер попадаем в режим сварки двойным импульсом в левом сегменте горит доп. индикация информирующая о том что мы в режиме сварки двойным импульсом. как и первом варианте можем настроит базовое время одиночным нажатием на энкодер, а так же выставить время паузы между импульсами, для этого нужно в режиме двойного импульса зажав кнопку энкодера и поворачивать его влево\право. выставленное время сохранится автоматически при отпускании энкодера

    [​IMG] [​IMG]

    [​IMG] [​IMG]

    [​IMG] [​IMG]

    [​IMG] [​IMG]
     
  2. An4ous

    An4ous Нерд

    Код (C++):
    #include "GyverTM1637.h"    // Библиотека для дисплея TM1637 от AlexGyver
    #include "GyverEncoder.h"   // Библиотека для энкодера от AlexGyver

    // --- Пины ---
    #define ENC_SW_PIN 6        // Пин кнопки энкодера
    #define ENC_CLK_PIN 5       // Пин CLK энкодера
    #define ENC_DT_PIN 4        // Пин DT энкодера
    #define DISP_CLK_PIN 3      // Пин CLK дисплея
    #define DISP_DIO_PIN 2      // Пин DIO дисплея
    #define PEDAL_PIN 10        // Пин педали (вход)
    #define FIRE_PIN 7          // Пин реле сварки (выход)

    // --- Константы ---
    // Адреса в EEPROM
    #define EEPROM_ADDR_PULSE     0   // Адрес для основного времени импульса (2 байта)
    #define EEPROM_ADDR_DBL_PULSE 2   // Адрес для времени двойного импульса (2 байта)
    #define EEPROM_ADDR_PAUSE     4   // Адрес для паузы между импульсами (2 байта)
    #define EEPROM_ADDR_MODE      6   // Адрес для режима двойного импульса (1 байт)
    #define EEPROM_ADDR_CHECK     7   // Адрес для "магического числа" проверки EEPROM (1 байт)
    #define EEPROM_MAGIC_BYTE     0xA7 // "Магическое число" (можно изменить для сброса настроек при прошивке)

    // Параметры импульсов и паузы
    #define PULSE_MIN 15        // Минимальная длительность импульса (мс)
    #define PULSE_MAX 800       // Максимальная длительность импульса (мс)
    #define PULSE_DEFAULT 60    // Длительность импульса по умолчанию (мс)
    #define PULSE_STEP 5        // Шаг изменения длительности импульса

    #define DBL_PULSE_MIN 15    // Мин. длительность двойного импульса (мс)
    #define DBL_PULSE_MAX 800   // Макс. длительность двойного импульса (мс)
    #define DBL_PULSE_DEFAULT 60 // Длительность двойного импульса по умолчанию (мс)
    #define DBL_PULSE_STEP 5    // Шаг изменения двойного импульса

    #define PAUSE_MIN 10        // Минимальная пауза между импульсами (мс)
    #define PAUSE_MAX 500       // Максимальная пауза между импульсами (мс)
    #define PAUSE_DEFAULT 50    // Пауза по умолчанию (мс)
    #define PAUSE_STEP 5        // Шаг изменения паузы

    #define WELD_DELAY 1000     // Задержка после сварки перед готовностью к следующей (мс)
    #define DYNAMIC_INDICATOR_INTERVAL 500 // Интервал смены динамического индикатора в меню настройки (мс)

    // --- Индикаторы на первом сегменте ---
    #define IND_NONE           0x00 // Нет индикатора (пусто)
    #define IND_DOUBLE         0x49 // Индикатор двойного импульса (II)
    #define IND_SET_PAUSE_P    0x73 // Индикатор настройки паузы ('P')
    #define IND_DYN_1          0x24 // Динамический индикатор 1  для меню настройки времени
    #define IND_DYN_2          0x12 // Динамический индикатор 2  для меню настройки времени

    // --- Состояния конечного автомата ---
    enum State {
        STATE_MAIN,                // Основной режим (сварка, выбор режима, предв. настройка)
        STATE_SET_SINGLE_PULSE,    // Режим настройки времени одиночного импульса
        STATE_SET_DOUBLE_PULSE     // Режим настройки времени двойного импульса
    };

    // --- Объекты классов ---
    GyverTM1637 disp(DISP_CLK_PIN, DISP_DIO_PIN); // Объект дисплея
    Encoder enc1(ENC_CLK_PIN, ENC_DT_PIN, ENC_SW_PIN); // Объект энкодера

    // --- Глобальные переменные ---
    State currentState = STATE_MAIN; // Текущее состояние автомата
    int pulseDuration;               // Основное время импульса (для одиночного режима и как база для двойного)
    int doublePulseDuration;         // Время импульса в двойном режиме
    int pauseDuration;               // Пауза между двойными импульсами
    bool doublePulseMode = false;    // Режим двойного импульса (true - вкл, false - выкл)

    unsigned long weldEndTime = 0;          // Время окончания последней сварки (для задержки)
    unsigned long lastDynamicIndChange = 0; // Время последней смены динамического индикатора
    byte currentDynamicIndicator = IND_DYN_1; // Текущий динамический индикатор (u/r)

    // Флаг, что значение МЕНЯЛОСЬ ВНУТРИ МЕНЮ НАСТРОЙКИ (SET_*)
    // или во время настройки паузы - используется для решения, сохранять ли при выходе/отпускании
    bool settingsChanged = false;
    // Флаг, что активна настройка паузы (кнопка удерживается + был поворот)
    bool adjustingPause = false;

    // --- Функции ---

    // Загрузка настроек из EEPROM
    void loadSettings() {
        Serial.println("Проверка EEPROM...");
        if (EEPROM.read(EEPROM_ADDR_CHECK) == EEPROM_MAGIC_BYTE) {
            Serial.println("Магический байт совпал. Загрузка настроек...");
            EEPROM.get(EEPROM_ADDR_PULSE, pulseDuration);
            EEPROM.get(EEPROM_ADDR_DBL_PULSE, doublePulseDuration);
            EEPROM.get(EEPROM_ADDR_PAUSE, pauseDuration);
            doublePulseMode = EEPROM.read(EEPROM_ADDR_MODE);
            // Проверка на допустимость загруженных значений
            pulseDuration = constrain(pulseDuration, PULSE_MIN, PULSE_MAX);
            doublePulseDuration = constrain(doublePulseDuration, DBL_PULSE_MIN, DBL_PULSE_MAX);
            pauseDuration = constrain(pauseDuration, PAUSE_MIN, PAUSE_MAX);
            Serial.println("Настройки загружены из EEPROM.");
        } else {
            Serial.println("Магический байт не совпал или EEPROM пуст. Инициализация стандартными значениями...");
            pulseDuration = PULSE_DEFAULT;
            doublePulseDuration = DBL_PULSE_DEFAULT;
            pauseDuration = PAUSE_DEFAULT;
            doublePulseMode = false;
            // Сразу сохраняем стандартные значения и магическое число
            EEPROM.put(EEPROM_ADDR_PULSE, pulseDuration);
            EEPROM.put(EEPROM_ADDR_DBL_PULSE, doublePulseDuration);
            EEPROM.put(EEPROM_ADDR_PAUSE, pauseDuration);
            EEPROM.write(EEPROM_ADDR_MODE, doublePulseMode);
            EEPROM.write(EEPROM_ADDR_CHECK, EEPROM_MAGIC_BYTE); // Записываем магическое число
            Serial.println("EEPROM инициализирован стандартными значениями.");
        }
    }

    // Сохранение конкретной настройки
    void savePulseDuration() {
        EEPROM.put(EEPROM_ADDR_PULSE, pulseDuration);
        Serial.print("Сохранено время одиночного импульса: "); Serial.println(pulseDuration);
    }
    void saveDoublePulseDuration() {
        EEPROM.put(EEPROM_ADDR_DBL_PULSE, doublePulseDuration);
        Serial.print("Сохранено время двойного импульса: "); Serial.println(doublePulseDuration);
    }
    void savePauseDuration() {
        EEPROM.put(EEPROM_ADDR_PAUSE, pauseDuration);
        Serial.print("Сохранена пауза: "); Serial.println(pauseDuration);
    }
    void saveMode() {
        EEPROM.write(EEPROM_ADDR_MODE, doublePulseMode);
        Serial.print("Сохранен режим: "); Serial.println(doublePulseMode ? "Двойной" : "Одиночный");
    }


    // Обновление дисплея
    void updateDisplay() {
        int valueToShow = 0;      // Значение для отображения (время)
        byte indicator = IND_NONE; // Индикатор для первого сегмента

        // Настройка паузы имеет приоритет отображения
        if (adjustingPause) {
            valueToShow = pauseDuration;
            indicator = IND_SET_PAUSE_P; // Используем индикатор 'P' (0x73)
        } else {
            // Отображение в зависимости от основного состояния
            switch (currentState) {
                case STATE_MAIN:{ // Главный режим
                    if (doublePulseMode) { // Если активен двойной импульс
                        valueToShow = doublePulseDuration;
                        indicator = IND_DOUBLE; // Показываем 'II'
                    } else { // Если активен одиночный импульс
                        valueToShow = pulseDuration;
                        indicator = IND_NONE; // Первый сегмент пуст
                    }
                    break;
                }
                // В режимах настройки времени (одиночного или двойного)
                case STATE_SET_SINGLE_PULSE:{}
                case STATE_SET_DOUBLE_PULSE:{}
                    // Определяем, какое время показывать
                    if (currentState == STATE_SET_SINGLE_PULSE) {
                        valueToShow = pulseDuration;
                    } else {
                        valueToShow = doublePulseDuration;
                    }
                    // Логика динамического индикатора ('u'/'r')
                    if (millis() - lastDynamicIndChange >= DYNAMIC_INDICATOR_INTERVAL) {
                        lastDynamicIndChange = millis();
                        currentDynamicIndicator = (currentDynamicIndicator == IND_DYN_1) ? IND_DYN_2 : IND_DYN_1;
                    }
                    indicator = currentDynamicIndicator; // Показываем 'u' или 'r'
                    break;
            }
        }

        // Отправляем данные на дисплей
        disp.displayInt(valueToShow);     // Выводим числовое значение (выравнивание по правому краю)
        disp.displayByte(0, indicator);  // Выводим индикатор в первый (левый) сегмент
    }

    // Функция выполнения сварки
    void performWeld() {
        // Защита от слишком частых нажатий
        if (millis() < weldEndTime) {
            return; // Еще не прошла задержка после предыдущей сварки
        }

        if (!doublePulseMode) { // Режим одиночного импульса
            digitalWrite(FIRE_PIN, HIGH); // Включаем реле
            delay(pulseDuration);         // Ждем настроенное время
            digitalWrite(FIRE_PIN, LOW);  // Выключаем реле
            Serial.print("Сварка ОДИН.: "); Serial.println(pulseDuration);
        } else { // Режим двойного импульса
            // Первый импульс
            digitalWrite(FIRE_PIN, HIGH);
            delay(doublePulseDuration);
            digitalWrite(FIRE_PIN, LOW);
            // Пауза
            delay(pauseDuration);
            // Второй импульс
            digitalWrite(FIRE_PIN, HIGH);
            delay(doublePulseDuration);
            digitalWrite(FIRE_PIN, LOW);
            Serial.print("Сварка ДВОЙН.: "); Serial.print(doublePulseDuration);
            Serial.print(" / "); Serial.print(pauseDuration);
            Serial.print(" / "); Serial.println(doublePulseDuration);
        }
        // Устанавливаем время, до которого нельзя начать новую сварку
        weldEndTime = millis() + WELD_DELAY;
    }
     
  3. An4ous

    An4ous Нерд

    Код (C++):
    // --- НАСТРОЙКА (SETUP) ---
    void setup() {
        Serial.begin(9600); // Инициализация серийного порта для отладки
        Serial.println("Контроллер сварки ");
        // Настройка пинов
        pinMode(FIRE_PIN, OUTPUT);     // Пин реле как выход
        digitalWrite(FIRE_PIN, LOW);   // Убедиться, что реле выключено при старте
        pinMode(PEDAL_PIN, INPUT_PULLUP); // Пин педали как вход с подтяжкой к питанию

        // Настройка энкодера
        // *** ВАЖНО: Установите правильный тип для вашего энкодера! ***
        enc1.setType(TYPE1); //  TYPE1 или TYPE2
        enc1.setTickMode(MANUAL); // Используем ручной опрос tick()

        // Настройка дисплея
        disp.clear();             // Очистка дисплея
        disp.brightness(7);       // Максимальная яркость (0-7)

        // Загрузка настроек из EEPROM
        loadSettings();
        // Вывод загруженных настроек в порт для контроля
        Serial.print("Загружено: ОДИН.имп="); Serial.print(pulseDuration);
        Serial.print("мс, ДВОЙН.имп="); Serial.print(doublePulseDuration);
        Serial.print("мс, Пауза="); Serial.print(pauseDuration);
        Serial.print("мс, Режим="); Serial.println(doublePulseMode ? "Двойной" : "Одиночный");

        // Начальная установка
        currentState = STATE_MAIN; // Начинаем с главного состояния
        updateDisplay();           // Обновляем дисплей
    }
     
    Последнее редактирование: 24 апр 2025 в 20:57
  4. An4ous

    An4ous Нерд

    Код (C++):
    // --- ОСНОВНОЙ ЦИКЛ (LOOP) ---
    void loop() {
        enc1.tick(); // ОБЯЗАТЕЛЬНО: опрашиваем энкодер в начале цикла
        bool pedalPressed = (digitalRead(PEDAL_PIN) == HIGH); // Читаем состояние педали (LOW = нажата)

        // --- Обработка отпускания кнопки энкодера ---
        // Важно для сохранения настроек, особенно паузы
        if (adjustingPause && !enc1.isHold()) { // Если кнопка была отпущена...
            if (adjustingPause) { // ...и мы были в режиме настройки паузы...
                if (settingsChanged) { // ...и значение паузы действительно менялось...
                   savePauseDuration(); // ...то сохраняем паузу.
                }
                adjustingPause = false; // Выходим из режима настройки паузы
                settingsChanged = false; // Сбрасываем флаг изменений
                Serial.println("Отпускание после настройки паузы.");
            }
            // Другие действия при отпускании не требуются по новой логике
        }

        // --- Логика конечного автомата (обработка состояний) ---
        switch (currentState) {

            // --- ГЛАВНОЕ СОСТОЯНИЕ ---
            case STATE_MAIN:{
                // --- Обработка событий в основном состоянии ---

                // 1. Настройка паузы (Удержание + поворот) - ИСПОЛЬЗУЕМ isRightH() / isLeftH()
                bool adjustedPauseThisCycle = false; // Флаг, что пауза менялась в этом цикле
                    if (doublePulseMode) { // Настройка паузы доступна только в режиме двойного импульса
                    // Проверяем удержание с поворотом вправо
                    if (enc1.isRightH()) {
                        if (!adjustingPause) { // Если это первый поворот в этой сессии удержания
                            adjustingPause = true;  // Входим в режим настройки паузы
                            settingsChanged = false; // Сбрасываем флаг изменений в начале настройки
                            Serial.println("Начало настройки паузы (Удерж+Вправо)...");
                        }
                        pauseDuration += PAUSE_STEP; // Увеличиваем паузу
                        settingsChanged = true;      // Отмечаем, что значение изменилось
                        adjustedPauseThisCycle = true;// Отмечаем, что было действие настройки паузы
                        Serial.println("   Настройка паузы: Удерж+ВПРАВО"); // Отладка
                    }
                    // Проверяем удержание с поворотом влево
                    else if (enc1.isLeftH()) {
                         if (!adjustingPause) { // Если это первый поворот в этой сессии удержания
                            adjustingPause = true;  // Входим в режим настройки паузы
                            settingsChanged = false; // Сбрасываем флаг изменений в начале настройки
                            Serial.println("Начало настройки паузы (Удерж+Влево)...");
                        }
                        pauseDuration -= PAUSE_STEP; // Уменьшаем паузу
                        settingsChanged = true;      // Отмечаем, что значение изменилось
                        adjustedPauseThisCycle = true;// Отмечаем, что было действие настройки паузы
                        Serial.println("   Настройка паузы: Удерж+ВЛЕВО"); // Отладка
                    }

                    // Если было изменение паузы в этом цикле, применяем ограничение
                    if (adjustedPauseThisCycle) {
                        pauseDuration = constrain(pauseDuration, PAUSE_MIN, PAUSE_MAX);
                        Serial.print("   Пауза изменена: "); Serial.println(pauseDuration); // Отладка
                    }
                } // Конец if (doublePulseMode) для паузы


                // --- Остальные действия в STATE_MAIN выполняются, только если НЕ идет настройка паузы ---
                if (!adjustingPause) {

                    // 2. Обычный поворот энкодера (предварительная настройка без сохранения)
                    bool changed = false; // Локальный флаг изменения значения
                    if (doublePulseMode) { // Если режим двойной - меняем время двойного импульса
                        if (enc1.isRight()) { doublePulseDuration += DBL_PULSE_STEP; changed = true; }
                        else if (enc1.isLeft()) { doublePulseDuration -= DBL_PULSE_STEP; changed = true; }
                        if (changed) { doublePulseDuration = constrain(doublePulseDuration, DBL_PULSE_MIN, DBL_PULSE_MAX); }
                    } else { // Если режим одиночный - меняем время одиночного импульса
                         if (enc1.isRight()) { pulseDuration += PULSE_STEP; changed = true; }
                         else if (enc1.isLeft()) { pulseDuration -= PULSE_STEP; changed = true; }
                         if (changed) { pulseDuration = constrain(pulseDuration, PULSE_MIN, PULSE_MAX); }
                    }
                    // Флаг settingsChanged здесь НЕ СТАВИМ, т.к. сохранение через меню

                    // 3. Обработка кликов энкодера
                    if (enc1.isSingle()) { // Одиночный клик
                        settingsChanged = false; // Сбрасываем флаг изменений перед входом в меню
                        lastDynamicIndChange = millis(); // Сброс таймера для мигающего индикатора
                        currentDynamicIndicator = IND_DYN_1; // Начать с первого символа мигалки

                        if (doublePulseMode) { // Если сейчас двойной режим...
                            Serial.println("Вход в НАСТР.ДВОЙН.ИМП.");
                            currentState = STATE_SET_DOUBLE_PULSE; // ...переходим в меню настройки двойного
                        } else { // Если сейчас одиночный режим...
                            Serial.println("Вход в НАСТР.ОДИН.ИМП.");
                            currentState = STATE_SET_SINGLE_PULSE; // ...переходим в меню настройки одиночного
                        }
                    } else if (enc1.isDouble()) { // Двойной клик
                        doublePulseMode = !doublePulseMode; // Переключаем режим
                        Serial.print("Переключен режим: "); Serial.println(doublePulseMode ? "Двойной" : "Одиночный");
                        if (doublePulseMode) { // Если только что включили двойной режим...
                            // ...копируем время из одиночного как стартовое для двойного
                            doublePulseDuration = pulseDuration;
                            Serial.print("Установлено время двойн. имп. из одиночного: "); Serial.println(doublePulseDuration);
                        }
                        saveMode(); // Сразу сохраняем новый режим
                    }

                    // 4. Обработка нажатия педали
                    if (pedalPressed) {
                       performWeld(); // Выполняем сварку
                    }

                } // Конец if (!adjustingPause) - блока действий, когда пауза НЕ настраивается

                break; // Конец STATE_MAIN
            }

    /////   // --- СОСТОЯНИЕ НАСТРОЙКИ ОДИНОЧНОГО ИМПУЛЬСА ---
            case STATE_SET_SINGLE_PULSE:{
                 if (enc1.isSingle()) { // Одиночный клик - выход
                     Serial.println("Выход из НАСТР.ОДИН.ИМП.");
                     if (settingsChanged) { // Если значение менялось в этом меню...
                         savePulseDuration(); // ...сохраняем его
                     }
                     currentState = STATE_MAIN; // Возвращаемся в главный режим
                     settingsChanged = false; // Сбрасываем флаг
                 }
                 // Поворот энкодера меняет значение и ставит флаг
                 else if (enc1.isRight()) {
                     pulseDuration += PULSE_STEP;
                     pulseDuration = constrain(pulseDuration, PULSE_MIN, PULSE_MAX);
                     settingsChanged = true;
                     Serial.print("Настройка ОДИН.имп.: "); Serial.println(pulseDuration);
                 } else if (enc1.isLeft()) {
                     pulseDuration -= PULSE_STEP;
                     pulseDuration = constrain(pulseDuration, PULSE_MIN, PULSE_MAX);
                     settingsChanged = true;
                     Serial.print("Настройка ОДИН.имп.: "); Serial.println(pulseDuration);
                 }
                 // Остальные события (двойной клик, удержание, педаль) игнорируем
                 break; // Конец STATE_SET_SINGLE_PULSE

            }
            // --- СОСТОЯНИЕ НАСТРОЙКИ ДВОЙНОГО ИМПУЛЬСА ---
            case STATE_SET_DOUBLE_PULSE:{
                 if (enc1.isSingle()) { // Одиночный клик - выход
                     Serial.println("Выход из НАСТР.ДВОЙН.ИМП.");
                     if (settingsChanged) { // Если значение менялось в этом меню...
                         saveDoublePulseDuration(); // ...сохраняем его
                     }
                     currentState = STATE_MAIN; // Возвращаемся в главный режим (он останется в режиме Двойного импульса)
                     settingsChanged = false; // Сбрасываем флаг
                 }
                 // Поворот энкодера меняет значение и ставит флаг
                 else if (enc1.isRight()) {
                     doublePulseDuration += DBL_PULSE_STEP;
                     doublePulseDuration = constrain(doublePulseDuration, DBL_PULSE_MIN, DBL_PULSE_MAX);
                     settingsChanged = true;
                     Serial.print("Настройка ДВОЙН.имп.: "); Serial.println(doublePulseDuration);
                 } else if (enc1.isLeft()) {
                     doublePulseDuration -= DBL_PULSE_STEP;
                     doublePulseDuration = constrain(doublePulseDuration, DBL_PULSE_MIN, DBL_PULSE_MAX);
                     settingsChanged = true;
                     Serial.print("Настройка ДВОЙН.имп.: "); Serial.println(doublePulseDuration);
                 }
                  // Остальные события (двойной клик, удержание, педаль) игнорируем
                 break; // Конец STATE_SET_DOUBLE_PULSE
            }
        } // Конец switch (currentState)

        // Обновляем дисплей в конце каждого цикла
        updateDisplay();

    } // Конец loop()
     
  5. parovoZZ

    parovoZZ Гуру

    Честно говоря, решения на конденсаторах мне больше нравятся, но все равно зачёт.
    Как устроена защита от пробития симистора?
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ммммдя. 3К-вольтный тр-р для игрушек это что-то.
    Поймал себя на мыслЕ, что не помню принимает ли Монитор порта Ардуино ИДЕ кириллицу ?
    Щас нет Ардуин вблизи - проверить нечем. Поэтому кириллица в коде скетча ТСа - как-то режет глаз...
     
    Последнее редактирование: 24 апр 2025 в 22:14
  7. Airbus

    Airbus Радиохулиган Модератор

    Принимает
     
  8. parovoZZ

    parovoZZ Гуру

    а чем это обеспечивается, если кратность открытия и паузы симистора в данной схеме - 10 мс? (половинка синусоиды).
     
    Ariadna-on-Line нравится это.
  9. An4ous

    An4ous Нерд

    Так выставите минимум 20 мс, и тонкую ленту будет варить. я честно в эти периоды не вникал. у меня лента 0,2 ~ 0,3мм импульса до 40 мс хватает за глаза, отрывается только с мясом
    схему приложил, брал схему китайской платы как основу, в схеме используется снаббер . у китайцев работает, значит и тут все будет работать)
     
  10. KindMan

    KindMan Гуру

    А силовая часть как устроена?
     
  11. An4ous

    An4ous Нерд

    Вы про трансформатор?
     
  12. An4ous

    An4ous Нерд

    Информации как собрать трансформатор для сварки аккумуляторов из трансформатора микроволновой печи полно на просторах интернета, к сожалению фотографий у меня нет, трансформатор был собран лет 7 назад. подойдет принципе любой трансформатор, вторичную обмотку( очень много витков ) спиливаем ножовкой и выбиваем с помощью любой выколотки ( например болта ) и молотка ( Важно не повредить первичку ). ищем добротный кабель ( можно сварочный ), который позволит намотать 3-4 витка на место вторички. концы кабеля опрессовываем наконечником и прикручиваем свою ручку. я использовал покупную ручку с подвижными электродами и встроенным микриком
    Точно уже не помню но на вторичке должно получится порядка 3-4 вольт, а сила тока может достигать 800-1000 ампер, это зависит от мощности трансформатор и количества витков вторички.
    [​IMG]
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Снаббер - подавитель импульсов напряжения. Его роль вспомогательная. Вопрос в том,что китайцам глубоко насрать как будет работать устройство после того как вы заплатили деньги. Сломается на сл. день - они только порадуются. И будут ждать следующей оплаты. А фишка в том, что вы можете так хорошо коротнуть сварочный выход - что тихо проплавится симистор и не отключится совсем. А через секунду-две загорится паяемый аккумулятор.
    Форум не для того чтоб обсуждать чем выбивать медь из транса и где его взять. А для того чтоб мозгами шевелить именно в электронике.
     
    Последнее редактирование: 25 апр 2025 в 18:46
    parovoZZ нравится это.
  14. An4ous

    An4ous Нерд

    Уважаемые фурмачане, мои познания в электронике по сравнению со знающими равны 0 из 10, я не принуждаю делать так, как сделал я. я лишь поделился своим проектом и управляющим кодом. схема у вас перед глазами, код тоже.
    Что с этим делать пусть каждый решает сам. повторяюсь , я поделился тем что сделал я! может кто возьмет за основу, и допилит.
    я не могу ответить на все вопросы особенно на которые не знаю ответов, если вы разбираетесь лучше, и ваши мозги в этом направлении работают лучше то наверное было бы лучше что то предложить а не показывать насколько вы умный.
    Всем добра:)
     
  15. KindMan

    KindMan Гуру

    Я про то, что если вы говорите - повторить ваш проект, то необходимо описать полный цикл, например, из чего делали вы сами. Я видел подобные проекты, как раз трансоф микроволновки. Хотел сворганить, но потом ушла необходимость варить аккумуляторы.
    Спасибо, за адекватную реакцию! Немного нудятины от меня:
    Мне кажется, вы его повторили, или адаптировали под себя. Поскольку не можете полностью объяснить как оно работает. Тут никаких вопросов, я сам любитель, просто описали бы соответственно.
     
  16. An4ous

    An4ous Нерд

    Повторил только трансформатор, первая версия была на ардуинке и модуле контактного релле с более примитивным кодом, релле часто выходили из строя и в один момент когда была необходимость собрать аккум для шурика релле меня подвело. тогда и решил что нужно сделать что то более стабильное.
    Силовую часть как писал выше взял с китайской платы управления. скетч писал с ботом на пополам ) накидал принципиальную схему, развел плату, отправил заказ в китай.
    На борту платы компактный AC-DC преобразователь 5в HLK-PM01 который питает всю низковольтную обвязку, в цепи преобразователя установлен предохранитель на 500мА, варистор 14K391, и катушка индуктивности, зачем она не спрашивайте, сам не знаю). собрал как того требовал производитель, хотя все будет работать и без нее. Семистор BTA41-600 открывается с помощью оптопары MOC3062 на которую подается управляющий сигнал от ардуинки.
    Силовую часть платы точно не смогу объяснить, т.к все просто скопировано
    Обьясняльщик из меня не очень хороший)
     
    KindMan нравится это.
  17. parovoZZ

    parovoZZ Гуру

    плохо

    вопрос в другом - прошёл сварочный импульс и симистор больше не закрылся. Дальнейшее развитие событий какое?
     
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Особой беды не должно случиться - он же сварочные клещи рукой зажимает. Может отпустить если надо - Но это, если они не приварятся так, что не разожмутся пока всё не поплавится. Вот тогда будет точно не весело.
    Чаще всего это решается небольшим усложнением - ставится обычное реле перед симистором. Сначала срабатывает реле, потом симистор. Отключается симистор, отключается реле. Реле намного надежней полупроводников - в ликвидации нечастого "нештата" - отключить, разорвать коротнувшую цепь, и тд. Конечно еще лучше ввести проверку исправности симистора сразу после включения реле. Понимаете, что вы должны в мозгах смоделировать сотню вероятных нештатных ситуаций. Для этого совершенно не надо никаких знаний электроники - обычный здравый смысл. А вы поперли уже плату в Китае заказывать. Вот именно на это и расчитывает форум, а не на копирование китайчатины.
     
    Последнее редактирование: 25 апр 2025 в 22:54
    An4ous нравится это.
  19. An4ous

    An4ous Нерд

    Все уже поняли что трансформатор продолжит жарить до тех пор пока что нибудь не пыхнет включая сам акб и его ближайших собратьев
    Уже ответил что в силовой части я не разбираюсь и честно говоря нет нужды. Может вы хотите предложить какое либо решение?
     
  20. An4ous

    An4ous Нерд

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