Блоки состояний

Пользовательские блоки дополняющие набор стандартных блоков
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
lfgjikjjyj
Лейтенант
Сообщения: 421
Зарегистрирован: 27 мар 2025, 12:13
Имя: Коля
Поблагодарили: 172 раза

Блоки состояний

Сообщение lfgjikjjyj »

тест 7,5,2

2026-09-17_170737.png

Генератор_(Code_-_Professional).ubi
+симитричный
+несимитричный
+одновибратор
+импульсный

потестил разные думаю пусть тоже будет для разнообразия

Результаты тестов:
в качестве нагрузки пин 13
в общем и тут всего 5 генераторов но просадить код штатными средствами ....
да притом ещё и ощибка с переполнением у него
да и манера у всех вызывать милис как бесплатный товар - вызов которого требует кучу тактов
2026-09-17_171906.png
2026-09-17_171023.png
2026-09-17_171032.png
2026-09-17_171050.png
2026-09-17_171104.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lfgjikjjyj
Лейтенант
Сообщения: 421
Зарегистрирован: 27 мар 2025, 12:13
Имя: Коля
Поблагодарили: 172 раза

Re: Блоки состояний

Сообщение lfgjikjjyj »

ДОБАВЛЕНО:

Блоки_состояний_(Code_-_Professional).ubi

на версии 7,5,2
+таймер на удержание
+задержка на отключение


Результаты тестов:
Таймер на удержание ставим 1 сек.
У нас есть три состояния таймера: ожидание, режим отсчета, удержание.
Через генератор 2 сек / 1 сек подаём 1 сек паузы — это ожидание, 2 сек распределятся как 1 сек на отсчёт, 1 сек на удержание.
Итого 3 сек = по секунде поровну на каждый режим.
Делаем прогон, три повторения, и среднеарифметическое на 9 сек.
И получаем, что, как уже упоминал, что "групповуха" на флпроговском блоке генератора задыхается, так и тут то же самое на 5 блоках таймеров.
2026-09-19_175040.png
2026-09-19_175050.png

Задержка на отключение ставим 1 сек.
То же самое, только генератор на 2 сек / 2 сек: 1 сек ожидание, 2 сек отсчёт, 1 сек удержание.
3 прогона на среднеарифметическое — 12 сек.
Тут поначалу поинтереснее было посоревноваться, но «групповуха» по стандарту FLProg опять загнобила ему результат.
Разрабы, конечно, скажут: «Проц слабоват», но да и ладно, в принципе, и так понятно...
2026-09-19_175757.png
2026-09-19_175805.png

Как одиночный блок можно и штатный использовать, но, когда их несколько, не рекомендую.

2026-09-19_174559.png
2026-09-19_174617.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
DerAlex
Лейтенант
Сообщения: 510
Зарегистрирован: 06 сен 2015, 08:39
Откуда: Новосибирск
Благодарил (а): 5 раз
Поблагодарили: 23 раза

Re: Блоки состояний

Сообщение DerAlex »

Генерация несколько меандров сразу с разными частотами в АрдуиноДля генерации нескольких меандров (прямоугольных сигналов) с разными частотами на Arduino одновременно стандартная функция tone() не подойдет, так как она может работать только с одним пином в один момент времени.Лучший способ решить эту задачу — использовать аппаратные таймеры или библиотеку, которая ими управляет. Это позволяет генерировать стабильные частоты в фоновом режиме, не нагружая основной цикл void loop().Ниже представлены два основных способа: простой (с помощью библиотеки) и продвинутый (напрямую через регистры для максимальной точности).Способ 1. Использование библиотеки Tone library (Простой)Существует сторонняя библиотека Tone (автор Brett Hagman), которая расширяет возможности Arduino и позволяет запускать меандры на нескольких пинах сразу.Установите библиотеку через Менеджер библиотек в Arduino IDE (ищите Tone от Brett Hagman).
Используйте следующий код:cpp#include <Tone.h>

// Создаем объекты для каждого генератора
Tone timer1;
Tone timer2;

const int pin1 = 11; // Первый пин для меандра
const int pin2 = 12; // Второй пин для меандра

void setup() {
// Привязываем объекты к конкретным пинам
timer1.begin(pin1);
timer2.begin(pin2);

// Запускаем генерацию: (пин, частота в Гц)
timer1.play(440); // Нота Ля (440 Гц)
timer2.play(1000); // Сигнал 1 кГц
}

void loop() {
// void loop остается абсолютно свободным для вашей логики
}
Важно: Количество одновременно генерируемых частот ограничено количеством аппаратных таймеров платы. Для Arduino Uno/Nano (на чипе ATmega328P) можно запустить максимум 2 или 3 сигнала одновременно, так как таймер 0 обычно занят функциями delay() и millis().Способ 2. Настройка таймеров через регистры (Для профессионалов)Если вам нужна максимальная точность, высокая частота (до сотен килогерц) и отсутствие просадок, нужно настроить аппаратные таймеры напрямую в режиме CTC (Clear Timer on Compare).Ниже пример для Arduino Uno / Nano (ATmega328P), который одновременно генерирует две разные независимые частоты на D9 (Таймер 1) и D3 (Таймер 2):cppvoid setup() {
// Настраиваем пины D9 и D3 на выход
pinMode(9, OUTPUT);
pinMode(3, OUTPUT);

// --- НАСТРОЙКА ТАЙМЕРА 1 (Пин D9) ---
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// Включаем режим CTC (сброс при совпадении)
TCCR1B |= (1 << WGM12);
// Переключаем пин OC1A (D9) при каждом совпадении
TCCR1A |= (1 << COM1A0);
// Устанавливаем предделитель (Prescaler) = 64
TCCR1B |= (1 << CS11) | (1 << CS10);
// Задаем значение совпадения (OCR1A) для частоты 500 Гц
// Формула: OCR1A = (F_CPU / (2 * Prescaler * F_out)) - 1
// OCR1A = (16000000 / (2 * 64 * 500)) - 1 = 249
OCR1A = 249;


// --- НАСТРОЙКА ТАЙМЕРА 2 (Пин D3) ---
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
// Включаем режим CTC
TCCR2A |= (1 << WGM21);
// Переключаем пин OC2B (D3) при совпадении
TCCR2A |= (1 << COM2B0);
// Устанавливаем предделитель = 64
TCCR2B |= (1 << CS22);
// Задаем значение для частоты 1000 Гц (1 кГц)
// OCR2B = (16000000 / (2 * 64 * 1000)) - 1 = 124
OCR2B = 124;
}

void loop() {
// Цикл пуст, сигналы генерируются аппаратно внутри микросхемы
}
аврора
Ответить

Вернуться в «Триггеры, таймеры, счетчики, детекторы сигнала»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя