Обсуждаем контроллеры компании Atmel.
Ответить

софтстарт

Вт май 24, 2022 20:08:47

В связи со слабоумием прошу на коммерческой основе решить проблему с написанием кода для Tiny13
Суть проблемы:

1. При подаче питания на устройство на всех выходах устанавливается 0;
2. Включение. При кратковременной подаче на один из входов 1 (кнопка)
- подает на один из входов/выходов 1;
- через 30 сек появляется 1 на втором выходе;
- через 30 сек. Появляется 1 на третьем выходе;
при этом 1 первом и втором выходах не снимаются
3. Выключение. При кратковременной подаче на первый вход 1 (кнопка):
- на третьем выходе 1 сменяется на 0;
- через 30 сек появляется 0 на втором выходе;
- через 30 сек появляется 0 на первом выходе.
4. Если процесс включения не закончился и была нажата кнопка - начинается процесс выключения (обратный порядок из места когда нажата кнопка)

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

Re: софтстарт

Вт май 24, 2022 20:14:44

*Пошёл закупаться попкорном*

Re: софтстарт

Вт май 24, 2022 20:21:43

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

Добавлено after 2 minutes 17 seconds:
даже название темы было похожим... чтото типа софтстарт для лампового усилителя...

Re: софтстарт

Ср май 25, 2022 11:39:07

У практически всех МК при подаче питания на выводах устанавливается или 1 или Z-состояние.
Для получения начального 0 придется схемотехникой побаловаться - минимум инверторы на транзисторах добавить.
8)

Re: софтстарт

Ср май 25, 2022 14:27:25

Цену вопроса обсуждаем в личке.

Нечего тут обсуждать… такой алгоритм не стоит и выеденного яйца. :) Наверное Вы делаете усилители на продажу и потому готовы оплатить за данный алгоритм? Если так, то тогда потратьте ту сумму которую Вы готовы были заплатить, на тех кто в этом более нуждается (соседям, или кому ещё...). Ну а алгоритм работы по вашему описанию вот Вам в виде прошивки за спасибо:
Tiny13.hex
(819 байт) Скачиваний: 71

Схема:
Схема.png
(15.71 KiB) Скачиваний: 64

МК тактируется на заводских установках (1,2 МГц).
Алгоритм такой: При подаче питания на МК, на выходах 1, 2, 3 присутствует лог 0. При первом нажатии на кнопку устанавливается флаг включения и на выходе 1 появляется лог 1. Затем через 30 сек. проверяется флаг отключения. Если флаг отключения сброшен то включается выход 2 и тд. Если флаг отключения был поднят (была повторно нажата кнопка) во время отсчёта 30 сек., то выход 1 будет выключен. И далее по такому же принципу реализован последующий алгоритм. То есть в любой момент времени можно повторно нажать на кнопку и ход алгоритма переключится на противоположный. Включение сменится на выключение и наоборот. Чтобы визуально видеть какой режим (включение или отключение) отрабатывает, к выводу РВ3 (2) можно подключить светодиод через резистор катодом на общую шину. Светодиод светится – режим включения, погашен – режим отключения. Светодиод на схеме не указан.
Последний раз редактировалось VNS Ср май 25, 2022 17:18:22, всего редактировалось 1 раз.

Re: софтстарт

Ср май 25, 2022 14:32:40

Проблема решена. Тему можно закрыть.

Re: софтстарт

Ср май 25, 2022 18:17:40

У практически всех МК при подаче питания на выводах устанавливается или 1 или Z-состояние.

Вы ошиблись. При подаче питания все входы/выходы принимают только Z состояние, то есть переключены на режим входа. :)
Для получения начального 0 придется схемотехникой побаловаться - минимум инверторы на транзисторах добавить.
8)

И здесь ошиблись... :) всего навсего нужно вначале алгоритма перевести необходимые выводы в режим выхода и тогда на этих выводах будет лог 0.

Добавлено after 3 hours 32 minutes 24 seconds:
В данной прошивке светодиод указывающий на режимы… работает иначе. В режиме отключения он не тухнет, а мигает, а вот когда режим завершится полностью, тогда он гаснет.
Tiny13_LED.hex
(909 байт) Скачиваний: 58

Re: софтстарт

Чт май 26, 2022 08:11:10

Кроме АВРок есть и другие МК (та же mcs51 к примеру), так что не будьте столь категоричны.
:wink:
Относительно момента перехода к нулевому статусу даже для АВРок:
сначала интервал предзапуска (задержка POR), затем несколько операций - хоть и мизерное время, но таки имеется.
Так что ежли важен "абсолютный нулевой интервал" придется таки поморочиться.
Альтернатива активным каскадам - подтягивающие к gnd резисторы.
8)

Re: софтстарт

Чт май 26, 2022 09:28:36

очень страный алгоритм....на мягкий пуск не похоже...

Re: софтстарт

Чт май 26, 2022 14:26:19

Ну, как-то так...

Спойлер
Код:
//==================
#include "proc_device.h"
//==================

//==================
// 1. При подаче питания на устройство на всех выходах устанавливается 0;
// 2. Включение. При кратковременной подаче на один из входов 1 (кнопка)
// - подает на один из входов/выходов 1;
// - через 30 сек появляется 1 на втором выходе;
// - через 30 сек. Появляется 1 на третьем выходе;
// при этом 1 первом и втором выходах не снимаются
// 3. Выключение. При кратковременной подаче на первый вход 1 (кнопка):
// - на третьем выходе 1 сменяется на 0;
// - через 30 сек появляется 0 на втором выходе;
// - через 30 сек появляется 0 на первом выходе.
// 4. Если процесс включения не закончился и была нажата кнопка - начинается процесс выключения (обратный порядок из места когда нажата кнопка)
//==================

//==================
void proc_device (void)
{
   static u08 _proc_device;

   switch (_proc_device)
   {
      case PROC_DEVICE_INIT:
         io_init ();

         _proc_device = PROC_DEVICE_WAIT_ON; // Установка состояния-режима ожидания включения
         break;

      case PROC_DEVICE_WAIT_ON: // Режим ожидания включения
         if (Get_Event (EV_ID_KEY_PRESSED)) // Если есть событие нажатия кнопки
         {
            set_proc_soft_start_on (); // то установка состояния-режима включения
            _proc_device = PROC_DEVICE_ON; // Установка состояния-режима включения
         }
         break;

      case PROC_DEVICE_ON: // Режим включения
         if (Get_Event (EV_ID_KEY_PRESSED)) // Если есть событие нажатия кнопки
         {
            set_proc_soft_start_off (); // то установка режима выключения
            _proc_device = PROC_DEVICE_OFF; // Установка состояния-режима выключения
         }
         break;

      case PROC_DEVICE_OFF: // Режим выключения
         if (Get_Event (EV_ID_START_SOFT_OFF_FINISH)) // Если есть событие завершения режима выключения
         {
            _proc_device = PROC_DEVICE_WAIT_ON; // то установка состояния-режима ожидания включения
         }
         break;

      default:
         break;
   }

   proc_soft_start ();
   proc_led_1 ();
}
//==================

//==================
void io_init (void)
{
   set_bit (OUT_1_DDR, OUT_1); // Пин OUT_1 - выход
   set_bit (OUT_1_DDR, OUT_2); // Пин OUT_2 - выход
   set_bit (OUT_1_DDR, OUT_3); // Пин OUT_3 - выход

   set_bit (LED_1_DDR, LED_1);
}
//==================

//==================
static u08 _proc_soft_start;
//----------
void set_proc_soft_start_on (void)
{
   _proc_soft_start = 1;
}
//----------
void set_proc_soft_start_off (void)
{
   _proc_soft_start = 4;
}
//----------
void proc_soft_start (void)
{
   static soft_timer ST_PROC_SOFT_START;

   switch (_proc_soft_start)
   {
      case 0: // Iddle
         break;

      case 1: // Режим включения
         out_1_on ();
         led_1_on ();
         set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_1);
         _proc_soft_start = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_SOFT_START))
         {
            out_2_on ();
            set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_2);
            _proc_soft_start = 3;
         }
         break;

      case 3:
         if (handle_soft_timer (ST_PROC_SOFT_START))
         {
            out_3_on ();
            _proc_soft_start = 0; // Iddle
         }
         break;

      case 4: // Режим выключения
         out_3_off ();
         set_proc_led_1_run ();
         set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_1);
         _proc_soft_start = 5;
         break;

      case 5:
         if (handle_soft_timer (ST_PROC_SOFT_START))
         {
            out_2_off ();
            set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_2);
            _proc_soft_start = 6;
         }
         break;

      case 6:
         if (handle_soft_timer (ST_PROC_SOFT_START))
         {
            out_1_off ();
            set_proc_led_1_off ();

            Set_Event (EV_ID_START_SOFT_OFF_FINISH, USER_EVENT);

            _proc_soft_start = 0; // Iddle
         }
         break;

      default:
         break;
   }
}
//==================

//==================
static u08 _proc_led_1;

static soft_timer ST_PROC_LED_1;

void set_proc_led_1_run (void)
{
   led_1_on (); // Так как в этом проекте урезанный таймер и нет немедленного исполненния, то включение светодиода.

   _proc_led_1 = 1;
}

void set_proc_led_1_off (void)
{
   led_1_off ();
   _proc_led_1 = 0;
}

void proc_led_1 (void)
{
   switch (_proc_led_1)
   {
      case 0:
         break; // Idle.

      case 1:
         set_soft_timer (ST_PROC_LED_1, LED_BLINK_TIME);

         _proc_led_1 = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_LED_1))
         {
            if (!check_bit(LED_1_PORT, LED_1))
               led_1_on ();
            else
               led_1_off ();

            set_soft_timer (ST_PROC_LED_1, LED_BLINK_TIME);
         }
         break;
   }
}
//==================

//==================
void led_1_on (void)
{
   __led_1_on ();
}

void led_1_off (void)
{
   __led_1_off ();
}

void led_1_switch (void)
{
   __led_1_switch ();
}
//==================

//==================
void out_1_on (void)
{
   __out_1_on ();
}

void out_2_on (void)
{
   __out_2_on ();
}

void out_3_on (void)
{
   __out_3_on ();
}
//----------
void out_1_off (void)
{
   __out_1_off ();
}

void out_2_off (void)
{
   __out_2_off ();
}

void out_3_off (void)
{
   __out_3_off ();
}
//==================



Upd.
Последний раз редактировалось Demiurg Пт май 27, 2022 07:49:17, всего редактировалось 2 раз(а).

Re: софтстарт

Чт май 26, 2022 16:10:52

Похоже таки в том девайсе собака зарыта...
Оамповые схемы выходят на рабочий режим после полного прогрева катодов...
А сей процесс зависит от качества лампы, ее времени работы(старения), внешней температуры и теплообмена с окружающей средой.
Все параметры могут изменяться во времени - посему простыми задержками софтстарт обеспечить сложновато.
Надо иметь объективный показатель готовности устройства к работе(и/или его составляющих).
Возможно какой-то вариант датчика тока служебных сеток или еще чего...
:roll:

Re: софтстарт

Чт май 26, 2022 16:28:11

Это распространенный проект. Повторяется. С вариациями
Суть софт старта в постепенном включении анодного напряжения.

Re: софтстарт

Чт май 26, 2022 16:29:38

Ну, как-то так...

Ужос!( Или это наш метод - из простого делать сложное? Про стиль я молчу... Хедер не нужен.

Re: софтстарт

Чт май 26, 2022 16:35:07

Хде ужос ужос нах?! Все нормально. Выдохни.
Ты забыл. Мой принцип конструктор

Re: софтстарт

Чт май 26, 2022 19:43:02

Изображение

Добавлено after 30 seconds:
конструктор :)))

Re: софтстарт

Пт май 27, 2022 07:54:02

Опрос кнопки. Выполнение главного алгоритма. Светодиод индикатор работы. Описание работы устройства в теме.

Критикуя, предлагай.

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

Re: софтстарт

Пн май 30, 2022 20:53:16

От нечего делать. :))
Вложения
SoftStart.7z
(15.21 KiB) Скачиваний: 60
Ответить