Arduino переход через ноль

Arduino.ru

Переход переменной через 0

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Нужно сделать плавное заполнение ШИМ (как для светодиода)

Пишу примерно такой код:

В итоге переменная i после значение 255 становится 0, а после 0 при уменьшении становится 255 и диод плавно мигает. Как от этого избавиться?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

есть пример FADE называется

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да я видел, только он тоже меняет значение, а мне нужно, чтобы кнопку нажал, плавно стартануло и на нужном уровне(другая переменная) осталось, пока я ее держу. Потом после отпускания плавно погасло :)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

приклей ему кнопку — иначе будет жаловаться, что работает без остановки.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Завтра на работе попробую. Делей никак нельзя. Она паразитирует радиомодуль

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

приклей ему кнопку — иначе будет жаловаться, что работает без остановки.

Та неохота было ещё кнопки писать.

Делей никак нельзя. Она паразитирует радиомодуль

Убрать не проблема, millis() же есть.

P.S. Налажал я что-то. В строке 07 надо так: if (brightness1 brightness1 = brightness1 + fadeAmount;

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Итак, рабочего цикла все-равно не получается :(

Вот код. Если убрать плавное торможение, то все работает, но вот последний блок все портит. Что не так?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Проблема оказалась в другом. Код исправил. Все стартует и останавливается, но вот значение spd прыгает с 252-255, соответственно есть перебои в выполнении условий и как результат, резкие скачки мотора. Как заложить предел?

Источник

Arduino.ru

Включение реле при переходе через ноль

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

а ничо, что время срабатывания реле больше сетевого периода? мошт, в сторону симистора смотреть?

хотя, пока внятного описания задачи не будет — смотреть никуда не надо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Нет,индуктивная нагрузка. Тиристоры и оптопары с нулем не хочу ставить. Есть гора неплохих реле, время срабатывания около 10 мс. Есть прибор для снятий характеристик реле,то есть время реально могу узнать. Это сетевой стабилизатор.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

То есть снабберы и варисторы запрещены ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

какое значение вы вкладываете в «переход через» ноль ?

1.

что значит «пропустив период или два»,в вашем понимании,два периода между «чем» и «чем» ?

с какой погрешностью детектировать ? милли-секунды? микро ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

craper, 10мС слишком много. Есть более быстрые реле, мне до 1мС встречались . Компаратором ловить Falling, и на отметке

10 вольт включать реле. Как раз к моменту пока пройдёт через ноль и снова станет расти контакт установится.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

«Помогите установить на скуттер двигатель от трактора Беларусь! От дедушки осталсчя.»

Для быстрого переключения при переходе через ноль используются симисторы с соотв. драйвером («моська» — от MOC306x и т.п.). Все. Точка. Остальное — глупость.

Применение реле должно быть технически обосновано (пример — работа в условиях ЭМИ, для военных). «Не понимаю симистор, реле — бесплатно полный шкаф» и пр. — НЕ ЯВЛЯЮТСЯ техническим обоснованием.

Цена симистора и моськи настолько низка, что экономность и стесненное финансовое положение — тоже не являются обоснованием.

Очень высокие токи, 50А и более, потребуют работ по теплоотводу, это тоже может быть техническим обоснованием применения реле, но спорным, тут смотреть надо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Так ему, небось, надо по току через 0, а не по напряжению.

А так, по идее, должно быть: 6.28*tреле/Т. Если коммутируется

220 (амплитуда 310), 50 Гц, то похоже на правду.

Но вообще, это все попахивает авантюрой.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А я повторю, не поленюсь

пока внятного описания задачи не будет — смотреть никуда не надо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Так ему, небось, надо по току через 0, а не по напряжению.

Во, блин! Никогда об этом не думал. По току разумно делать, чтобы контакты реле не подгорали, да? Или там ещё тонкости есть?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да много чего — те же импульсные помехи. Раз через индуктивность не течет ток, то и неприятных последствий — никаких. А если нагрузка индуктивная, фазы тока и напряжения не совпадают.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Идея то правильная, только ж не на реле делать. Чтоб размыкать при нулевом токе его детектить нужно, и быренько отключать. Детектировать 0 напряжения ничем не поможет, фаза тока от нагрузки зависит, а значить меняется. И знание времени срабатывания реле вобще ничем не поможет. «Моськи» тут действительно в самый раз. Правдв я чет туго представляю сетевой стабилизатор который целыми периодами оперирует, разве что переключатся между обмотками тр-ра.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вот здесь это реализовано на железном уровне. Доберусь до домашнего компа,выложу скетч. Там ничего военного нет,по аналог реад сравнение,и включение требуемого реле,если попадает в диапазон.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Делал я такую вещь. Уже лет 10 работает. Всё как Дима сказал. Ждем переход через 0. Включаем реле на активную нагрузку. Смотрим осцилографом когда замыкаются контакты реле. Неплохо статистику набрать — раз 10 щелкнуть. Добавляем задержку между переходом через 0 и командой на пуск реле что бы в сумме получилась величина кратная 10мс. Проверяем, что контакты реле закорачиваются при переходе через 0. Для отключения делаем ту же процедуру, но к задержке добавляем ещё задержку между током и напряжением для рабочей нагрузки, чтобы размыкание было как можно ближе к переходу через 0 тока.

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

Источник

Arduino.ru

У нас только 2 внешних прерывания, а баба Яга — против .

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Все написанное ниже,
лишь мой путь в мире прерываний,
все это можно легко, сделать самому
покопавшись, час другой в документации

Заранее прошу прощения, если изложение сумбурно. В моем первом проекте «управляемая розетка» мне потребовалось сделать мониторинг наличия напряжения, как на входе, так и на выходе модуля. В модуле было 3 коммутируемых линии, это значит, что мониторинг должен будет работать для всех 3 линий + 1 линия вход, итого 4 линии. Схематически решение очень простое и было подсказано уважаемым товарищем axill в его проекте « SPI модуль для управления мощностью сетевой нагрузки ». Я просто скопировал схему детектора нуля ( это та часть которая с диодным мостом и оптроном ). Замечу, что одно из самых неоспоримых достоинств этого решения это гальваническая развязка. Теперь можно обратиться к программной части.

Посмотрим, что же твориться на выходах МК, для этого просто цепляем logic analyzer к нашим лапкам и в путь.

Итак, мы видим, что у нас при переходе через ноль на цифровом выходе появляется единичка. Вообще надо отметить, что logic analyzer просто не заменим, если вы собрались работать с чем-то большим, чем игры с LED на 13 пине. На картинке сверху вниз отображены следующие параметры:

* Активность обработчика внешних прерываний
* Сигналы детекторов от 3 коммутируемых линий
* Детектор основного входа модуля
* Аналоговый сигнал, который мы детектируем

Я использовал Arduino PRO Mini. Конечно, можно было бы просто организовать полинг на 4 ножках, ибо это дешево и сердито. Но у этого пути есть недостаток. Основная проблема этого подхода в том, что нам придется реализовывать весь остальной функционал, с учетом того, что у нас имеется почти real-time задача, а это сделать все сложнее чем больший функционал мы будем добавлять в модуль. Поэтому мы не будем искать легких путей, а обратимся к прерываниям, вдруг там жизнь будет более легкой и приятной.

На этом пути нас ожидает другая засада. Официально в документации написано, что у нас есть только 2 внешних прерывания, а у нас целых 4 импульсных сигнала. Немного покапав документацию, находим 3 очень забавных прерывания

* PCINT0_vect
* PCINT1_vect
* PCINT2_vect

По сути это прерывания, которые срабатывают когда изменяется любой бит PORTB, PORTC, PORTD. Это как раз то, что нам и надо. Быстренько соберем платку на макетке и подключим 4 наших детектора к ножкам 4,5,6,7 нашего МК. Путь написания кода и сам код я, пожалуй, пропущу, ровно как и разборку того как работают прерывания, это не столь интересно, тому кто просто хочет это использовать, а если кому интересно посмотреть, как оно устроено, то они могу просто скачать и посмотреть код, по прерываниям смотрим 12 главу даташита.

Рассмотрим цифровую часть более подробно. Первый вопрос который может прийти в голову, «А почему на всех 4 детекторах появлений импульса происходит в разное время и сам импульс различной длительности, если исходный сигнал только один ?» Тут все очень просто, это конструктивная особенность и связано это с погрешностями электронных компонентов использованных при создании детекторов.

Рассмотрим вкратце алгоритм работы:

* Перехватываем нужное прерывание
* Смотрим, какой бит изменился
* Вызываем нужную функцию, которая обновляет соответствующий детектор
* Запоминаем текущее состояние битов для последующей работы.

Теперь о том, как всем этим пользоваться ( код урезан и приведен только в качестве примера )

Несколько слов о быстродействии. В обработчик прерывания, я вставил включение и выключение пина А0. И в итоге получил некоторое представление и накладных расходах. Итого вы можете видеть это на картинке, накладные расходы составили примерно 28,5мкс. Много это или мало, сказать трудно, но меня это устраивает.

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

Источник

Детектор перехода через ноль с гальванической развязкой и без неё

В современных домохозяйствах большинство устройств (лампочки, телевизоры, кондиционеры и т.д.) запитываются от напряжения переменного тока. Мы можем управлять включением и выключением этих устройств с помощью платы Arduino и реле, эти способы управления домашними электронными устройствами рассматривались на нашем сайте в проектах автоматизации дома. Но если нам нужно не просто управлять процессами включения/выключения устройств, а нужно еще, к примеру, регулировать яркость свечения лампы или частоту вращения вентилятора, то здесь нам необходимо использовать методы управления фазами и статические переключатели наподобие симисторов (TRIAC) для управления фазами напряжение переменного тока.

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

На нашем сайте вы можете также посмотреть проекты, в которых использовалась регулировка силы света:

  • регулятор силы свечения светодиода на микроконтроллере AVR ATmega32;
  • автоматическое управление яркостью свечения светодиода с помощью Arduino;

Методика обнаружения перехода через ноль

Для управления напряжением переменного тока первое, что мы должны уметь делать – это обнаруживать переходы через ноль сигнала переменного тока. Следовательно, в каждый момент времени, когда этот сигнал переходит через ноль, мы должны переключать симистор. Момент перехода через ноль сигнала переменного тока показан на следующем рисунке.


Программирование

Создаем глобальную переменную:

/* USER CODE BEGIN PV */ uint8_t AC_Zero_Crossing = 0; /* USER CODE END PV */

Для гальванически неразвязанного просто добавляем обработчик, в которм переменная инвертируется (значение меняется на противоположенное (0->255->0->255…)) каждый раз при возникновении прерывания (при каждом переходе):

/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) < if(GPIO_Pin == AC_Zero_Pin) < AC_Zero_Crossing =

AC_Zero_Crossing; > > /* USER CODE END 4 */

Для развязанного с сетью в главном цикле, если на входе ноль присваиваем переменной ноль (задержка добавлена для отладки):

И функция, вызываемая при каждом импульсе по переднему фронту, в которой присваивается переменной 255:

/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) < if(GPIO_Pin == AC_Zero_Pin) < AC_Zero_Crossing = 255; >> /* USER CODE END 4 */

Принцип работы симистора

Симистор (симметричный триодный тиристор, в англ. TRIAC) представляет собой переключатель переменного тока с тремя выводами, который можно переключить при помощи подачи отпирающего импульса на его управляющий вывод (затвор). Но в отличие от других подобных переключателей, которые проводят ток в одном направлении, симистор может управлять током в обоих направлениях. В нашем проекте мы будем использовать симистор BT136.

Принцип управления симистора переменным током показан на следующем рисунке.

Как показано на рисунке, мы можем переключать, к примеру, симистор на угле 90 градусов при помощи подачи отпирающего импульса на его управляющий вывод. В этом случае мы будем подавать ток на лампу только в половине времени положительной полуволны сигнала (на графике время t1), соответственно, лампа будет гореть вполовину мощности. Уменьшая или увеличивая это время мы можем заставить лампу гореть ярче или тусклее.

Частота сигнала переменного тока в нашей сети составляет 50 Гц, соответственно, период сигнала равен 1/f =20 миллисекунд. Значит, половина периода будет равна 10 мс. Поэтому мы можем изменять время t1 на приведенном графике для управления яркостью свечения лампы переменного тока в диапазоне от 0 до 10 мс (10000 мкс).

Определение пересечения нуля без гальванической развязки

Если МК находится в корпусе, то можно очень просто определять пересечение нуля синусоидой благодаря наличию встроенных защитных диодов.
Они есть у всех распространенных микроконтроллерах, в том числе и STM32:

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

Собирать тут почти нечего, просто подключаю сетевое напряжение через два резистора:

На осциле почти прямоугольные импульсы, как и при моделировании.

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

Можно ли вообще так делать? Этот способ советует Atmel, также видел такую же реализацию в конструкции встраиваемого регулятора на микроконтроллере Microchip.

AVR182: Zero Cross Detector

Простой цифровой регулятор мощности

Схема проекта

Схема регулятора силы света (диммера) на Arduino и симисторе представлена на следующем рисунке.

Схема соединения симистора и оптопары показана на следующем рисунке.

Эту схему мы собрали на перфорированной плате, у нас получилась конструкция следующего вида:

Оптопару MCT2E и соединения с ней мы также разместили на перфорированной плате и подсоединили ее к понижающему трансформатору.

Конструкция всего проекта в сборе выглядит следующим образом:

Материалы

Вариант 1

Для удобства следует разбить список покупок на несколько основных пунктов, в зависимости от того, для чего мы будем использовать те или иные инструменты. Так, вам будет необходимо собрать:

  1. Детектор для отслеживания пересечений с нулем. Для этой части проекта потребуется H11AA11 с парой резисторов на 10кОм, а также мостовой выпрямитель на 400 Вольт и ещё пара резисторов на 30 кОм. Для удобства стоит прикупить и 1 разъем, а также стабилизатор на 5.1 Вольт.
  2. Драйвер для лампы. Здесь достаточно будет простого светодиода, а также MOC3021 с резистором 220 Ом (можно и больше), а еще резистором на 470 Ом и 1 кОм, и один симистор, подойдет версия TIC Также можете докупить ещё один разъем.
  3. Вспомогательные элементы. Конечно, при спайке не обойтись без проводов и куска текстолита 6 на 3 см.

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

Вариант 2

Для нашего второго альтернативного варианта нам понадобятся:

1x — 330 Ом резистор 2x — 33К резистора 1x — 22К резистор 1x- 220 Ом резистор 4x — 1N4508 диоды 1x — 1N4007 диоды 1x — Диод Zener 10V.4W 1x — Конденсатор 2.2uF / 63V 1x — Конденсатор 220nF / 275V 1x — Arduino / Ардуино 1x — Оптрон: 4N35 1x — МОП-транзистор: IRF830A 1x — Лампа: 100 Вт 1x — Питание 230 В 1x — Розетка 1x — Паяльная плата и паяльный комплект

Тестирование работы проекта

На следующих трех рисунках показаны 3 степени регулировки яркости лампы переменного тока.

1. Маленький шаг регулировки.

2. Средний шаг регулировки.

3. Максимальный шаг регулировки.

Создание платы

Мы рассмотрим самый бюджетный вариант – вытравку платы в соляном растворе, но прежде на неё необходимо будет наклеить проект, который вы можете создать в программе по желанию. Дальнейшая сборка не несёт никаких трудностей и секретов, необходимо будет воспользоваться панельками под оптроны и мостовые выпрямители. Также, при написании текста, для разметки элемента, его стоит делать зеркальным, так как при ЛУТе, отпечатавшийся рисунок примет правильный вид на меде, и перенесется так, что вы без проблем прочитаете все необходимые данные.

Хорошим выбором станет TIC206, который выдаст добротных 6 ампер. Но здесь стоит учесть, что те проводники, которые установлены на плате, просто не выдержат такую силу тока, поэтому дополнительно стоит припаять провод на проводник симистора у разъемов, а вторую часть – к другим разъемам.

Также, при наличии оптрона H11AA11, мостовой выпрямитель можно не использовать, ведь в нем уже имеются два не параллельных диода, а также возможность работы с переменными токами. Совместимость с выводами 4N25 позволяет просто вставить его к припою с двумя перемычками, находящимися между 5 и 7 резистором, на нашей схеме.

Во втором варианте схема будет выглядеть так:

Конструкция детектора скрытой проводки

Прибор состоит из 3 основных элементов:

  1. Датчика электромагнитного поля.
  2. Усилителя.
  3. Визуального или звукового сигнализатора.

По форме корпуса искатели делятся на виды:

Прибор первого типа чаще всего похож на указатель фазы (индикаторную отвертку).

Необходимые компоненты

Помимо инструментов, нужны радиодетали – транзисторы, светодиоды, микросхемы и др.

Перечень зависит от того, какая схема искателя скрытой проводки взята за основу.

Универсальный детектор электропроводки

Самодельная версия комбинированного устройства. Состоит из 2 модулей:

  • металлоискателя;
  • электростатического детектора.

Такое исполнение усложняет конструкцию прибора, но расширяет спектр его возможностей. Он способен найти:

  • обесточенную линию;
  • провод под напряжением внутри металлического профиля;
  • арматуру, гвозди и т.д.

Индуктивные катушки металлоискателя выполняют из провода марки ПЭВТЛ сечением 0,35 кв. мм, наматывая их на ферритовый сердечник диаметром 8 мм.

В схеме задействованы 2 усилителя марки КР140УД1208. Транзистор КТ315 (VT1) выступает генератором высоких частот (100 кГц). Он переходит в режим возбуждения благодаря переменному резистору R6.

Диод КД522 выпрямляет выходной сигнал VT1.

Микросхема К561ЛЕ5 выступает генератором звука. Выходной сигнал с VT1 посредством компаратора на базе усилителя КР140УД1208ОУ переводит ее в режим ожидания, что сопровождается затуханием светодиода.

Порядок настройки металлоискателя:

  1. Разместить прибор на удалении от металлических предметов.
  2. С помощью подстроечных резисторов R3 и R5 добиться, чтобы генерация стала минимальной (диод светится слабо и неравномерно).
  3. Вращая R3, погасить диод.
  4. Поднести металлический предмет, например монету, и с помощью подстроечных резисторов настроить чувствительность.

При попадании металлического предмета в поле действия антенны из катушек L1 и L2 происходит срыв генерации с последующим запуском компаратора и свечением диода. Одновременно пьезоизлучатель издает звук частотой 1000 Гц.

Зачем знать разводку электропроводки

Точные сведения о местоположении кабеля нужны в следующих случаях:

  1. Если предстоят ремонтные работы, включающие в себя сверление стены.
  2. При необходимости вскрытия штробы для извлечения перебитого или сгоревшего провода.

Капитальные конструкции сверлят для решения таких задач:

  • устройства новых розеток и выключателей;
  • навешивания полки, бойлера, прочего оборудования;
  • прокладки труб или новых кабелей.

Если перфоратор повредит провод в стене, это может привести к таким последствиям:

  1. Инструмент выйдет из строя.
  2. Возникнет короткое замыкание и вводный автомат обесточит квартиру.
  3. Вместо перебитого кабеля придется прокладывать новый, после чего нужно будет заново делать ремонт.

Чтобы избежать перечисленных неприятностей, перед сверлением выясняют расположение проводов. В большинстве случаев чертеж с привязками отсутствует либо отражает недостоверную информацию. Поэтому используют специальный прибор – детектор (искатель) скрытой проводки.

Малогабаритный металлодетектор

Этот вариант металлоискателя является более компактным за счет отсутствия катушек индуктивности. Их функцию выполняет обмотка реле.

Принцип действия прибора основан на подсчете разности частот 2 генераторов – LC и RC. У одного из них она меняется в случае приближения к металлическому предмету.

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

Источник

Ардуино переход через ноль

Arduino.ru

Переход переменной через 0

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Нужно сделать плавное заполнение ШИМ (как для светодиода)

Пишу примерно такой код:

В итоге переменная i после значение 255 становится 0, а после 0 при уменьшении становится 255 и диод плавно мигает. Как от этого избавиться?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

есть пример FADE называется

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да я видел, только он тоже меняет значение, а мне нужно, чтобы кнопку нажал, плавно стартануло и на нужном уровне(другая переменная) осталось, пока я ее держу. Потом после отпускания плавно погасло :)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

приклей ему кнопку — иначе будет жаловаться, что работает без остановки.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Завтра на работе попробую. Делей никак нельзя. Она паразитирует радиомодуль

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

приклей ему кнопку — иначе будет жаловаться, что работает без остановки.

Та неохота было ещё кнопки писать.

Делей никак нельзя. Она паразитирует радиомодуль

Убрать не проблема, millis() же есть.

P.S. Налажал я что-то. В строке 07 надо так: if (brightness1 brightness1 = brightness1 + fadeAmount;

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Итак, рабочего цикла все-равно не получается :(

Вот код. Если убрать плавное торможение, то все работает, но вот последний блок все портит. Что не так?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Проблема оказалась в другом. Код исправил. Все стартует и останавливается, но вот значение spd прыгает с 252-255, соответственно есть перебои в выполнении условий и как результат, резкие скачки мотора. Как заложить предел?

Источник

Фазное регулирование нагрузки переменного тока с помощью FLProg

Выдался свободный денёк и я решил наконец то опробовать блок скоростного счетчика в режиме линии задержки. Этот режим создавался в основном для реализации фазного регулирования нагрузки, но до сих пор я не успевал его обкатать в реальном применении. Думаю уже пора.
Обвязку блока я сделал по этой схеме:

На оптопаре PC814 собран детектор нуля. Поскольку блок работает на прерываниях, то входом детектора нуля могут служить только входы контроллера к которым привязываются аппаратные прерывания. В случае UNO это входы D2 и D3.
На оптосимисторе MOC3023 собран блок управления симистором. Для управления этим блоком можно выбрать любой свободный цифровой выход контроллера.
Схема проекта

Res — Аналоговый вход. На входе стоит переменный резистор.
Блок SCT2 — Блок скоростного счетчика. (Библиотека элементов -> Счетчики -> SpeedCounter)





Поскольку все оптопары отличаются — необходимо произвести настройку блока Scalе. Для этого на время модернизируем проект.

Теперь значение задержки раз в секунду будет выводится в Ком-порт. Для чего это нужно? Поскольку передний фронт импульса с детектора нуля приходит немного раньше истинного момента перехода синусоиды через 0 (в момент потухания светодиода оптопары), то нам необходимо определить это время для задания его в качестве 100% значения мощности на нагрузке. Вот настроечные параметры для блока Scale.

Зальем программу в контроллер и запустим монитор компорта. При вращении переменного резистора лампа будет либо гореть либо мерцать.Вот как это выглядит.

Ну и тетерь можно использовать полученные значения. Заполняем блок Scale

Ну вот что получилось

Теперь можно убирать блоки генератора и передачи данных компорта, а на вход Scale подавать необходимое Вам регулирующее значение. Обратите внимание в поле «Верхний предел входного значения» блока Scale необходимо занести значение регулирующей величины соответствующее 0 мощности на нагрузке, а в поле «Нижний предел входного значения» значение соответствующее 100% мощности.

Источник

Arduino.ru

У нас только 2 внешних прерывания, а баба Яга — против .

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Все написанное ниже,
лишь мой путь в мире прерываний,
все это можно легко, сделать самому
покопавшись, час другой в документации

Заранее прошу прощения, если изложение сумбурно. В моем первом проекте «управляемая розетка» мне потребовалось сделать мониторинг наличия напряжения, как на входе, так и на выходе модуля. В модуле было 3 коммутируемых линии, это значит, что мониторинг должен будет работать для всех 3 линий + 1 линия вход, итого 4 линии. Схематически решение очень простое и было подсказано уважаемым товарищем axill в его проекте « SPI модуль для управления мощностью сетевой нагрузки ». Я просто скопировал схему детектора нуля ( это та часть которая с диодным мостом и оптроном ). Замечу, что одно из самых неоспоримых достоинств этого решения это гальваническая развязка. Теперь можно обратиться к программной части.

Посмотрим, что же твориться на выходах МК, для этого просто цепляем logic analyzer к нашим лапкам и в путь.

Итак, мы видим, что у нас при переходе через ноль на цифровом выходе появляется единичка. Вообще надо отметить, что logic analyzer просто не заменим, если вы собрались работать с чем-то большим, чем игры с LED на 13 пине. На картинке сверху вниз отображены следующие параметры:

* Активность обработчика внешних прерываний
* Сигналы детекторов от 3 коммутируемых линий
* Детектор основного входа модуля
* Аналоговый сигнал, который мы детектируем

Я использовал Arduino PRO Mini. Конечно, можно было бы просто организовать полинг на 4 ножках, ибо это дешево и сердито. Но у этого пути есть недостаток. Основная проблема этого подхода в том, что нам придется реализовывать весь остальной функционал, с учетом того, что у нас имеется почти real-time задача, а это сделать все сложнее чем больший функционал мы будем добавлять в модуль. Поэтому мы не будем искать легких путей, а обратимся к прерываниям, вдруг там жизнь будет более легкой и приятной.

На этом пути нас ожидает другая засада. Официально в документации написано, что у нас есть только 2 внешних прерывания, а у нас целых 4 импульсных сигнала. Немного покапав документацию, находим 3 очень забавных прерывания

* PCINT0_vect
* PCINT1_vect
* PCINT2_vect

По сути это прерывания, которые срабатывают когда изменяется любой бит PORTB, PORTC, PORTD. Это как раз то, что нам и надо. Быстренько соберем платку на макетке и подключим 4 наших детектора к ножкам 4,5,6,7 нашего МК. Путь написания кода и сам код я, пожалуй, пропущу, ровно как и разборку того как работают прерывания, это не столь интересно, тому кто просто хочет это использовать, а если кому интересно посмотреть, как оно устроено, то они могу просто скачать и посмотреть код, по прерываниям смотрим 12 главу даташита.

Рассмотрим цифровую часть более подробно. Первый вопрос который может прийти в голову, «А почему на всех 4 детекторах появлений импульса происходит в разное время и сам импульс различной длительности, если исходный сигнал только один ?» Тут все очень просто, это конструктивная особенность и связано это с погрешностями электронных компонентов использованных при создании детекторов.

Рассмотрим вкратце алгоритм работы:

* Перехватываем нужное прерывание
* Смотрим, какой бит изменился
* Вызываем нужную функцию, которая обновляет соответствующий детектор
* Запоминаем текущее состояние битов для последующей работы.

Теперь о том, как всем этим пользоваться ( код урезан и приведен только в качестве примера )

Несколько слов о быстродействии. В обработчик прерывания, я вставил включение и выключение пина А0. И в итоге получил некоторое представление и накладных расходах. Итого вы можете видеть это на картинке, накладные расходы составили примерно 28,5мкс. Много это или мало, сказать трудно, но меня это устраивает.

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

Источник

Диммер на Arduino

Диммер на базе Arduino – это одно из сотен простых и интересных устройств, с помощью которого можно плавно изменять сетевое напряжение от 0 до номинального значения. Каждый пользователь Arduino найдёт применение столь полезной самоделке, а опыт, полученный во время сборки своими руками, пополнит багаж знаний.

Схема и принцип её работы

Как и большинство недорогих диммеров, данная схема работает за счёт фазовой регулировки напряжения, что достигается путем принудительного открывания силового ключа – симистора. Принцип действия схемы следующий. Arduino на программном уровне формирует импульсы, частота которых подстраивается сопротивлением потенциометра. Управляющий импульс с вывода P1 проходит через оптопару MOC3021 и поступает на управляющий электрод симистора. Он открывается и пропускает ток до перехода полуволны сетевого напряжения через ноль, после чего закрывается. Затем приходит следующий импульс и цикл повторяется. Благодаря сдвигу управляющих импульсов, в нагрузке формируется обрезанная по фронту часть синусоиды.

Чтобы симистор открывался в соответствии с заданным алгоритмом, частота следования импульсов должна быть засинхронизирована с напряжением сети 220 В. Другими словами Arduino должен знать, в какой момент синусоида сетевого напряжения проходит через ноль. Для этого в диммере на элементах R3, R4 и PC814 реализована цепь обратной связи, сигнал с которой поступает на вывод P2 и анализируется микроконтроллером. В цепь детектора нуля добавлен резистор R5 на 10 кОм, который нужен для подпитки выходного транзистора оптопары.

Один силовой вывод симистора подключается к фазному проводу, а ко второму – подключается нагрузка. Нулевой провод сети 220 В напрямую следует от клеммника J1 к J2, а затем к нагрузке. Применение оптопар необходимо для гальванической развязки силовой и низковольтной части схемы диммера. Потенциометр (на схеме не показан) средним выводом подключается на любой аналоговый вход Arduino, а двумя крайними – на +5 В и «общий».

Печатная плата и детали сборки

Минимум радиоэлементов позволяет сконструировать одностороннюю печатную плату, размер которой не превышает 20х35 мм. Как видно из рисунка на ней отсутствует переменный резистор, чтобы радиолюбитель мог самостоятельно подобрать потенциометр подходящего форм-фактора и определить место его крепления к корпусу готового диммера. Подключение к Arduino осуществляется через провода, которые запаивают в соответствующие отверстия на плате.

Для сборки своими руками диммера, управляемого Arduino, понадобятся следующие радиоэлементы и детали:

  1. Симистор BT136-600D, способный выдерживать обратное напряжение до 600 В и пропускать в нагрузку ток до 4 А (естественно с предварительным монтажом на радиатор). В схеме можно применить симистор и с большей нагрузочной способностью. Главное – обеспечить отвод тепла от его корпуса и правильно подобрать ток на управляющий электрод (справочный параметр). При подключении к нагрузке электроприбора большой мощности ширину печатных проводников в силовой части схемы необходимо будет пересчитать. Как вариант, силовые дорожки можно продублировать с другой стороны платы.
  2. Оптопара MOC3021 с симисторным выходом.
  3. Оптопара PC814 с транзисторным выходом.
  4. Резисторы номиналом 1 кОм, 220 Ом, 10 кОм мощностью 0,25 Вт и 2 резистора на 51 кОм мощностью 0,5 Вт.
  5. Переменный резистор на 10 кОм.
  6. Клеммные колодки – 2 шт., с двумя разъёмами и шагом 5 мм.

Все необходимые файлы по проекту находятся в ZIP-архиве: dimmer-arduino.zip

Алгоритм управления Arduino

Программа управления симистором создана на базе таймера Timer1 и библиотеки Cyber.Lib, благодаря чему отсутствует влияние на работу других программных кодов. Принцип её действия следующий. При переходе сетевого напряжения через ноль «снизу вверх» таймер перенастраивается на обратный переход «сверху вниз» и начинает отсчёт времени в соответствии со значением переменной «Dimmer». В момент срабатывания таймера Arduino формирует управляющий импульс и симистор открывается. При следующем переходе через ноль симистор перестаёт пропускать ток и ожидает очередное срабатывание таймера. И так 50 раз в секунду. За регулировку задержки на открывание симистора отвечает переменная «Dimmer». Она считывает и обрабатывает сигнал с потенциометра и может принимать значение от 0 до 255.

Область применения диммера на Arduino

Конечно, использовать дорогостоящий Arduino для управления яркостью галогенных ламп – избыточно. Для этой цели лучше заменить обычный выключатель диммером промышленного изготовления. Диммер на Arduino способен решать более серьёзные задачи:

  • управлять любыми видами активной нагрузки (температурой нагрева паяльника, проточного водонагревателя и т. д.) с точным удержанием заданного параметра;
  • одновременно выполнять несколько функций. Например, обеспечивать плавное включение утром (отключение вечером) света, а также контролировать температуру и влажность террариума.

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

Авторство вышеприведенных материалов принадлежит Youtube каналу AlexGyver.

Источник

Adblock
detector