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

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

  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
  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
  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
    parovoZZ нравится это.
  14. An4ous

    An4ous Нерд

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

    KindMan Гуру

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

    An4ous Нерд

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

    parovoZZ Гуру

    плохо

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

    Ariadna-on-Line Гуру

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

    An4ous Нерд

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

    An4ous Нерд

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