Изменение оборотов вентилятора с помощью Arduino
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемые.
Прошу отнестись с пониманием к необычной на мой взгляд идеи. Так или иначе помощь ваша краене необходима.
Задача на первый взгляд очень простая, необходимо реализовать возможность изменять обороты вентилятора QLZ06/1200 (там все его характеристики). Рассматриваю любые варианты (плавный или ступенчатый), но этим должен управлять Arduino (конечно код я сам напишу).
Мне важно выяснить схему подключения.
Убедительная просьба всем кто чем сможет помочь оставить хоть какое то совет или ссылку на полехный материал.
За ранее всем уастникам крайне благодарен за уделенное время, проявленный интерес, а тем более за великодушную помощь в столь не легком деле. (Советы по поиску в писковых системах прошу не оставлять)
Есть такая статья http://easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-peremennogo-toka.html, можно ли по этой схеме управлять обораотами вентилятора или только включать и выключать можно.
На контроллере нужно будет реализовать фазовое управление оптосиммистором (с синхронизацией по началу полупериода). Вам нужно управлять задержкой включения оптосиммистора относительно начала полупериода. При этом задержка 0 будет соответствовать полной мощности, задержка 5 мс - половине, 10 мс - 0 мощности. Схему определения начала полупериода где-то встрецал - поищите. Она на оптроне собрана. Если ничего не найдете, я Вам потом нарисую.
Я принципиально то понимаю как это должно работать, но просто дико боюсь навредить Arduino в очередной раз загубив кристал.
Было бы не плохо получить от вас схему и примерные характеристики оптосиммистора способного поддерживать нагрузку указанного вентилятока (напряжений 220в мощьностью 24Вт).
Есть схем множество фазоимпульсного регулятора мощности для цепей переменного тока....
RC-цепочка определяет момент открытия тиристора в каждом полупериоде переменного напряжения питания нагрузки.
Синхронизируем Ардуину под частоту сети 50 Гц и управляем нагрузкой....
Вот тут всё есть.
http://www.embed.com.ua/mikrokontrollernyiy-konstruktor/fazoimpulsnoe-up...
Блин ребята я почему то не уверен что это подходящее решение, может я что то не так понимаю, но даже автор в примерах не приводит возможность регулировать обороты двигателя . . .
А никто и не обещает регулировку оборотов. Здесь регулируется мощность (точнее, напряжение). Возмите в магазине диммер и проверте, как будут регулироваться обороты. Если нормально - расковыривайте диммер и внедряйте туда управление от дуины, или собирайте схему по ссылке выше. Если стоит задача регулировки именно оборотов, то еще нужно завести датчик оборотов на дуину и делать управление типа ПИД-регулятора. Но это уже программрские вопросы, не имеющие отношения к железу.
хорошо, тогда вот какой вопрос.
Можно ли в указанной выше схеме использовать только правую часть.
Если нет, то какие могут быть пробены.
Если да , то какие меня ждут ограничения или что то вроде этого.
Нет. Только полностью. Левая часть - это и есть синхронизация с началом полупериода, по этому сигналу нужно запускать таймер задержки управляющего импульса. Без левой части Вы сможете только включать и выключать.
у меня два варианта. 1. я еще плохо понимаю систему работы полупериодов. 2. Мне просто нучно что то проще для реализации задуманого выше.
Тогда так:
1. Вы изучаете методику регулирования мощности при помощи изменения фазы открытия симистора
2. Ищите устройство управления мотором, у которого есть вход задания.
Дело то все в том я не хотел использовать готовые решения, просто управление мощьностью, вот что мне нужно.
Тогда ваш вариант №1
Читайте теорию, без понимания процесса не получится написать программу.
http://electricalschool.info/main/455-tiristory-princip-dejjstvija.html
http://www.radioradar.net/hand_book/documentation/tiristor_simistor.html
Фазовое управление - из википедии
все это конечно хорошо, но мне вообще то хотелось просто снизить обороты вентиялятора, как то все сложно получается
Чтобы просто снизить, нужен ЛАТР или резистор. А Вы ставили задачу "регулировать".
.......но этим должен управлять Arduino.....
....а ЛАТР можно как раз сервой вращать :)
нет это очень громосткой ичестно гоаоря экспериментальное устройсво, ля моей задумки не подойдет.
Я лучше с методом предложенным выше разберусь и применю, если будет не труно, прошу разобрать возникаемые вопросы.
Правильный подход! Главное - разберитесь с принципом, разобраться с программированием поможем.
Закупил мелочёвку, начал паять.... "в лоб" - напрограммировал так :
А как через счётчики-таймеры - так и не понял.....
Всё по схеме из #5.....
Разъём SV1 - 1 и 3 на пин_GND , 4 на пин_2 , 2 на пин_8
Молодец! Главное - с принципом разобраться, остальное - приложится.
Если устройство больше ничего делать не будет, то не стоит заморачиваться со счетчиками. разве что для самообразования.
Но, дам направление по счетчикам: Библиотека TimerOne еще здесь почитать
Нужно сделать ШИМ с частотой 100 Гц и обнулять его (или запускать... не вдавался в подробности реализации этой библы) по Вашему прерыванию. Только измените вариант срабатывания по одному из фронтов.
Если устройство больше ничего делать не будет, то не стоит заморачиваться со счетчиками. разве что для самообразования.
Устройство будет делать что-то ещё.... И самообразование - естественно....
Путей реализации много. Я попытаюсь пойти по такому ( ниже ) не из-за упёртости, а для изучения таймеров-счётчиков... Надеюсь на Вашу помощь и leshak, конешшшно же.....
Алгоритм :
- датчик нуля сети - на пин 2 ( INT0 )
- обработчик внешнего прерывания :
- настраиваем счётчик на задержку в 6600 микросекунд - 25% мощности
- разрешаем работу счётчика с прерыванием по переполнению
- обработчик прерывания по переполнению 1 :
- на пин 9 устанавливаем HIGH
- перенастраиваем счётчик на задержку в 20 микросекунд - длительность упрИмпульса для симистора
- переопределяем обработчик прерывания по переполнению :
- обработчик прерывания по переполнению 2 :
- на пин 9 устанавливаем LOW
- переопределяем обработчик прерывания по переполнению на 1
....а в loop() - меняем значение мощности ( задержки )
Не сильно коряво объяснил ?
Не сильно :)
Дерзайте. Будем помогать искать ошибки :)
Если не ошибаюсь, то таймер/компаратор можно настроить что-бы он по сработке менял состояние пина на противоположное. То есть в обработчике будет задача только "выставить новое время задержки". А toggle ему он будет делать сам.
Статьи/примеры думаю сами нагуглите.
А примера "из боевой задачи" можете попробовать порытся в исходниках вот этой библиотеки
http://sourceforge.net/projects/arduinorclib/files/releases/
Она включает в себя и классик для работы с таймером (аналог TimerOne библиотеки), и пример ее использования в классе PPMOut. Он как раз тем и занимается, что вначале расчитывает массив "длины импульсов", а потом переключает выходной пин через эти расчитанные интервалы времени.
Там внутри есть массивчик m_timings. В нем лежат интервалы времени в микросекундах через которые нужно менять пин. Как они расчитываются - можете забить, что-бы не разбиратся "зачем эта библиотека" и "что такое PPM" :)
Просто считаетй что массив m_timings - содержит интервалы. Тогда сам обработчик прерывания выглядит вообще "тупо до крика"
Ну а у вас, видимо даже массива не будет, будете по очереди менять 220 и 6600.
Как сконфигурить таймер - смотрите выше в функции ::start (там используется класс Timer1, если захочется "понять до самого конца - лезте в этот класс Timer1, берите даташит и смотрите какие регистры он выставляет и "что это означает"). Либо просто "спионерте" его себе, и не заморачиваесь использйте Timer1::setToggle(true, true); :)
P.S. Не знаю хороший ли это "пример" или слишком "замудренный". Просто "последние место где я сталкивался с работой с таймерами".
Ну а у вас, видимо даже массива не будет, будете по очереди менять 220 и 6600.
Будет массив. Зависимость задежки упрИмпульса от нужной мощности. Мощность -от 0 до 100%, задержка - от 9900 до 0 микросекунд. 6600 - это просто для примера... для 25% мощности...
Спасибо, пойду учицца....
Ну а у вас, видимо даже массива не будет, будете по очереди менять 220 и 6600.
Будет массив. Зависимость задежки упрИмпульса от нужной мощности. Мощность -от 0 до 100%, задержка - от 9900 до 0 микросекунд. 6600 - это просто для примера... для 25% мощности...
Спасибо, пойду учицца....
Зачем массив? Одной переменной хватит. У вас же не будет "серии задержек". У вас есть всего два интервала. Один фиксированный (220), а второй будет менятся (0-9900). Ну и что? Просто один константа, второй - переменная :)
Тем более, что задержку от мощности можно считать - это будет функция от арккосинуса. Типа t=9900*arccos(P*Pi/100), где P в %
Пока вот так :
из-за строки #37 - не компилируется :(
или регистр масок - по другому обозначается ?
Срасибо за скетчи, но - из #26 - мне в жисть не разобраться после Паскаля :)
t=9900*arccos(P*Pi/100), где P в %
это я чуть-чуть знаю :)
alfa = arccos ( P / 50 - 1 ) - в радианах
alfa = arccos ( P / 50 - 1 ) * 180 / Pi - в градусах
t = arccos ( P / 50 - 1 ) * 180 / Pi * 10000 / 180 - в микросекундах ( для 50 Гц )
t = arccos ( P / 50 - 1 ) * 10000 / Pi , с учётом открИмпульса - t = arccos ( P / 50 - 1 ) * 9980 / Pi
Таблицу соответствия делал, ибо не нашёл в Разделе Программирование - arccos ()....
Таблицу соответствия делал, ибо не нашёл в Разделе Программирование - arccos ()....
Нужно еще помнить что "Раздел программирования" рассказывает только про "ардуино функции" (и то, не всегда полно, на arduino.cc - полней). Но и там - не все бывает задокументированно. Следу "заветам AlexFisher" полезном еще самому .h файла библиотек порытся, там бывают полезняшки которые в доках не описанны.
И опять-таки, помним что "ардуино" и "обертка" под которой лежит C/C++ AVR-ристый. Поэтому многие вещи можно гуглить не только в компании с словом "Arduino" но и C/C++ AVR
В частности можно использовать многие функции из AvrLibc (как минимум всякие работы со строками)
http://www.nongnu.org/avr-libc/user-manual/modules.html
Помоему там и кой чаго "математического" надыбать можно :)
:) arcCos() без библиотек работает, как в экселе - acos()
Это пока крайняя версия :
строки нужно добавить #28A = #36 и #28B = #37 ....
Почему же строка #19 капризничает ?
строки нужно добавить #28A = #36 и #28B = #37 ....
Нет, не надо....... забыл, что это уже сделано в ## после if-ов
:) arcCos() без библиотек работает, как в экселе - acos()
Для тех, кому интересно, что еще можно использовать при программировании дуины, рекомендую этот ресурс (англ)
Извините... Наверное тихо спросил.... :)
Компилятор ругается на обращение к регистру маски прерываний. ПРОШУ ПОМОЩИ !
.....если раскомментить TIMSK , всё ломается :(
Потому что этот регистр для каждого таймера свой, т.е. нет TIMSK, есть TIMSK0, TIMSK1, TIMSK2
Не сильно :)
Дерзайте. Будем помогать искать ошибки :)
Это Вы и вы - умеете !!!!!!
А по алгоритму - критиканёте ?
Что обрабатываются оба полупериода сетевого напряжения.... Что счётчик заморожен после формирования открывающего импульса до окончания полупериода.....
Конспектировал, пересчитывал все регистры, и спареннные, и одиночные..... А вот просчитался про TIMSK0.....2 :(
Спасибо !
Читайте хедеры!
Я это нашел в iom238p.h (он для UNO как раз) :)
Привет ребята. Есть одна не приятная проблема, каксаемая симистора.Есть такое убеждения что они не стабильно работае, а вот альтернативы я что то не нашел. Не стабильность работы связано с так называемым залипанием или ложным сработыванием. Разумеется все это лезчится отключением питания и новым запуском системы.
что то я смотрю такое ни у кого не встречалось, но я это наблюдал лично на пеллетном котле. Так вот на нем пришлось менять этот блок на друго с друго технологией уже без симисторов. Мне то как быть, помогите плиииииз!
Есть еще "выключаемые" тиристоры.
Есть еще "выключаемые" тиристоры.
было бы неплохо посмотреть пример.
что то я смотрю такое ни у кого не встречалось, но я это наблюдал лично на пеллетном котле. Так вот на нем пришлось менять этот блок на друго с друго технологией уже без симисторов. Мне то как быть, помогите плиииииз!
Почему "ни у кого не встречалось" - есть в интернете статьи по проблемам ложного срабатывания. Правда в них говорится, что причина этому - неэквивалентная замена силовых транзисторов, что приводит к изменению резистивно-емкостных параметров. Методов борьбы я не увидел, да и та статья на это не претендовала...
Если лечится перезагрузкой - ну, поставьте что-нибудь, регулярно размыкающее на короткое время цепь питания.
http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D1%80
Ищите абзац "Ограничения".
"Залипание" - это когда скорость переключения больше допустимой (dU/dt больше указанного в параметрах симистора). Проявляется на индуктивной нагрузке.
Рас уж симистор такой вариант не надежный может на мощном транзисторе возможно такое реализовать.
Можно, управление будет проще (стандартный ШИМ), но схема сложнее - нужно изолированное питание для транзистора (в принципе, китайский адаптер подойдет). Нужен опртрон, транзистор должен быть включен в диагональ моста из мощных диодов.
Ну и греться это будет не в пример сильнее.
Если не понятно, набросаю схему.
Можно, управление будет проще (стандартный ШИМ), но схема сложнее - нужно изолированное питание для транзистора (в принципе, китайский адаптер подойдет). Нужен опртрон, транзистор должен быть включен в диагональ моста из мощных диодов.
Ну и греться это будет не в пример сильнее.
Если не понятно, набросаю схему.
Оптром уже приобрел MOС3020, мощьный транзистор еще не купил просто незнаю какой подойдет. Про схему даже и не мечтал, буду признателен. Немного не понял про какой арептер идет речь. На сколько мощьные диоды понадобятся. Да и нужен ли мне мощьные детали, там вентилятор то простенький и слабенький )