Arduino регулировка оборотов вентилятора

Arduino регулировка оборотов вентилятора

Потребуется:

Датчик температуры — 1шт.

Твердотельное реле — 1шт.

В этом примере будут использоваться следующие компоненты:

Arduino Pro Mini.

Реле SSR-25DA. (Судя по описанию потребляемый ток всего 7.5mA)

Датчик температуры 18b20.

Пример подключения:

Для управления скоростью вращения вентилятора используется PIN 9 т.к. он ШИМ и после изменения частоты ШИМ эффект искажения работы некоторых функций проявится только для Servo library нам это не страшно т.к. здесь мы не используем такой функционал. Цифровой датчик температуры подключается к цифровому порту PIN 2. Так как вывод микроконтроллера держит 40mA то можно запитывать реле прямо с микроконтроллера, ему ничего не будет, но все равно на всякий случай воспользуемся транзистором кт315:

Распиновка транзисторов npn перехода:

Распиновка 1N4148

Частота бытовой сети куда будет подключаться вентилятор составляет 50Гц. Используемое реле SSR-25DA оборудовано датчиком пересечения ноля (cross zero sensor). Это значит что реле отключится/включится только в те моменты когда синусоида переменного тока будет пересекать значение 0. Поэтому частота работы ШИМ должна быть не выше чем 50Гц*2 = 100Гц (2 — потому, что за один период синусоида переменного тока пересекает ноль дважды).

Т.к. по умолчанию частота ШИМ гораздо выше надо ее разделить. Ниже таблица допустимых делителей для разных PIN:

PINs Частота, Гц Делитель
3 31250 1, 8, 32, 64, 128, 256, 1024
5 62500 1, 8, 64, 256, 1024
6 62500 1, 8, 64, 256, 1024
9 31250 1, 8, 64, 256, 1024
10 31250 1, 8, 64, 256, 1024
11 31250 1, 8, 32, 64, 128, 256, 1024

Мы используем PIN 9, значит его частота по умолчанию 31250Гц, нам надо получить не более 100Гц, для этого разделим на 1024. Получим

30 Гц. Такой частоты уже достаточно для регулировки оборотов. Если вместо вентилятора подключить лампу накаливая то будет видно как она мерцает, для бытового канального вентилятора это не критично.

Скетч:

В скетче используется код получения значения температуры отсюда.

#include
#include
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
int ventPin = 9;
int maxTemp=28;
int minTemp=26;
int interval=20; //min 30sec recomended for 18B20
DallasTemperature sensors(&oneWire);
void setup(void) <
Serial.begin(9600);
sensors.begin();
setPwmFrequency(ventPin, 1024); //division on 1024 for

30Hz
>
void loop(void) <
sensors.requestTemperatures();
Serial.print(«Temp=»);
float temp=sensors.getTempCByIndex(0);
Serial.print(temp);
Serial.print(«; Power=»);
int val = (((-1)*((maxTemp-temp)-(maxTemp-minTemp)))/2*100)*255/100;
if (val 255)
Serial.print(val);
if (val>20) <
analogWrite(ventPin, val);
Serial.print(«; Vent=on;»);
> else <
analogWrite(ventPin, 0);
Serial.print(«; Vent=off;»);
>
delay(interval*1000);
>
void setPwmFrequency(int pin, int divisor) <
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) <
switch(divisor) <
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
>
>
>

При требуемой мощности менее 20% вентилятор запускаться не будет вообще т.к. возможно не будет хватать времени для проворачивания ротора двигателя и он не будет крутиться. Начиная с 20% мощности на ротор начнет поступать ток и тока станет достаточно для проворачивания вентилятора.

Для информации:

Рассказы про частоту ШИМ arduino здесь.

Общий пример схемы подключения реле к ардуино через транзистор:

Источник

Вентилятор на Arduino Uno, управляемый с помощью температуры

В этом проекте на Arduino мы будем управлять скоростью вращения вентилятора постоянного тока в соответствии с температурой в комнате и показывать изменения этих параметров (температуры и скорости вращения вентилятора) на жидкокристаллическом (ЖК) дисплее 16×2. В проекте будет происходить обмен данными между Arduino, ЖК дисплеем и датчиком температуры DHT11. Управлять скоростью вращения вентилятора постоянного тока мы будем с помощью широтно-импульсной (ШИМ) модуляции, с помощью которой можно управлять средним значением напряжения, подаваемого на вентилятор.

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

  1. Плата Arduino UNO (купить на AliExpress).
  2. Датчик температуры и влажности DHT11 (купить на AliExpress).
  3. Транзистор 2n2222 (купить на AliExpress).
  4. ЖК дисплей 16×2 (купить на AliExpress).
  5. Вентилятор постоянного тока.
  6. Резистор 1 кОм (купить на AliExpress).
  7. Батарейка на 9 В.
  8. Соединительные провода.
Читайте также:  Как снять вентилятор салона рено логан

Принципы ШИМ модуляции

Наша конструкция будет состоять из трех частей. В первой части будет измеряться температура с помощью датчика температуры и влажности DHT11. Вторая часть будет считывать значение температуры с выходного контакта DHT11, преобразовывать ее в температуру по шкале Цельсия и управлять скоростью вращения вентилятора постоянного тока с помощью ШИМ. А третья часть проекта будет показывать значение температуры и скорости вращения вентилятора на ЖК дисплее.

В этом проекте мы использовали датчик DHT11, который подробно описан в статье про измерение температуры и влажности с помощью Arduino. Но в этом проекте мы этот датчик будем использовать только для измерения температуры.

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

Пример ШИМ модуляции на цифровом осциллографе представлен на следующем рисунке.

Скорость вращения вентилятора и соответствующие ей значения ШИМ и ее коэффициента заполнения представлены в следующей таблице.

Температура Цикл занятости ШИМ Значение, передаваемое в функцию управления ШИМ в Arduino Скорость вращения вентилятора
менее 26 0% выключен
26 20% 51 20%
27 40% 102 40%
28 60% 153 60%
29 80% 204 80%
больше 29 100% 255 100%

Что такое ШИМ? Простыми словами это такая технология, с помощью которой мы можем управлять напряжением или мощностью. К примеру, мы подаем на электродвигатель напряжение 5 Вольт, которое будет заставлять его вращаться с некоторой скоростью. Если после этого мы снизим подаваемое напряжение на 2 Вольта (т. е. до 3 Вольт), то скорость вращения электродвигателя также уменьшится. Более подробно об использовании ШИМ можно прочитать в следующей статье: управлению яркостью свечения светодиода с помощью ШИМ.

Основная идея ШИМ состоит в использовании цифровых импульсов с определенным коэффициентом заполнения (циклом занятости), который и будет отвечать за скорость вращения вентилятора.

К примеру, мы будем использовать ШИМ с коэффициентом заполнения 50% — это будет означать что на управляемое устройство мы будем подавать половину максимального напряжения импульса.

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

Duty Cycle= Ton/T

где T – общее время импульса Ton+Toff (сумма его активного и пассивного состояния)
Ton – время активного состояния импульса (означает 1 )
Toff – время пассивного состояния импульса (означает 0)

Более наглядно это представлено на следующих рисунках.

Работа схемы

Схема устройства представлена на следующем рисунке.

ЖК дисплей подключен к плате Arduino в 4-битном режиме, более подробно об этом можно прочитать в статье про подключение ЖК дисплея к Arduino. Контакты ЖК дисплея RS, EN, D4, D5, D6 и D7 подсоединены к цифровым контактам Arduino 7, 6, 5, 4, 3 и 2. Датчик DHT11 подсоединен к контакту 12 Arduino через подтягивающий резистор. Контакт 9 Arduino используется для управления скоростью вращения вентилятора (с помощью транзистора).

Исходный код программы

Сначала мы произведем подключение библиотек для работы с ЖК дисплеем и датчиком температуры (dht), а затем инициализируем контакты для подключения ЖК дисплея, датчика температуры и вентилятора.

Затем инициализируем все остальные нужные нам вещи в секции setup. А затем в секции loop мы будем использовать dht-функции для считывания значений с датчика температуры, извлекать из этих значений температуру, переводить ее в температуру по шкале Цельсия и отображать ее значение на ЖК дисплее.

После этого мы будем сравнивать значение температуры с заранее установленными нами температурными порогами (выше приведенная в тексте статьи таблица) и исходя из результатов сравнения будем генерировать соответствующее значение ШИМ на выходном контакте, к которому подключен транзистор, управляющий скоростью вращения вентилятора.

Для генерации ШИМ мы будем использовать функцию analogWrite(pin, PWM value). Мы будем использовать все 8 бит. Значение ШИМ будет эквивалентно аналоговому значения напряжения. То есть, к примеру, если мы хотим сгенерировать ШИМ с коэффициентом заполнения 20%, то мы в эту функцию (analogWrite) должны передать значение 255/5.

Источник

Arduino.ru

Изменение оборотов вентилятора с помощью Arduino

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

Доброго времени суток уважаемые.

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

Задача на первый взгляд очень простая, необходимо реализовать возможность изменять обороты вентилятора QLZ06/1200 (там все его характеристики). Рассматриваю любые варианты (плавный или ступенчатый), но этим должен управлять Arduino (конечно код я сам напишу).

Мне важно выяснить схему подключения.

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

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

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

Есть такая статья http://easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-peremennogo-toka.html, можно ли по этой схеме управлять обораотами вентилятора или только включать и выключать можно.

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

На контроллере нужно будет реализовать фазовое управление оптосиммистором (с синхронизацией по началу полупериода). Вам нужно управлять задержкой включения оптосиммистора относительно начала полупериода. При этом задержка 0 будет соответствовать полной мощности, задержка 5 мс — половине, 10 мс — 0 мощности. Схему определения начала полупериода где-то встрецал — поищите. Она на оптроне собрана. Если ничего не найдете, я Вам потом нарисую.

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

Я принципиально то понимаю как это должно работать, но просто дико боюсь навредить Arduino в очередной раз загубив кристал.

Было бы не плохо получить от вас схему и примерные характеристики оптосиммистора способного поддерживать нагрузку указанного вентилятока (напряжений 220в мощьностью 24Вт).

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

Есть схем множество фазоимпульсного регулятора мощности для цепей переменного тока.

RC-цепочка определяет момент открытия тиристора в каждом полупериоде переменного напряжения питания нагрузки.

Синхронизируем Ардуину под частоту сети 50 Гц и управляем нагрузкой.

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

Вот тут всё есть.

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

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

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

А никто и не обещает регулировку оборотов. Здесь регулируется мощность (точнее, напряжение). Возмите в магазине диммер и проверте, как будут регулироваться обороты. Если нормально — расковыривайте диммер и внедряйте туда управление от дуины, или собирайте схему по ссылке выше. Если стоит задача регулировки именно оборотов, то еще нужно завести датчик оборотов на дуину и делать управление типа ПИД-регулятора. Но это уже программрские вопросы, не имеющие отношения к железу.

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

хорошо, тогда вот какой вопрос.

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

Если нет, то какие могут быть пробены.

Если да , то какие меня ждут ограничения или что то вроде этого.

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

Нет. Только полностью. Левая часть — это и есть синхронизация с началом полупериода, по этому сигналу нужно запускать таймер задержки управляющего импульса. Без левой части Вы сможете только включать и выключать.

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

у меня два варианта. 1. я еще плохо понимаю систему работы полупериодов. 2. Мне просто нучно что то проще для реализации задуманого выше.

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

1. Вы изучаете методику регулирования мощности при помощи изменения фазы открытия симистора

2. Ищите устройство управления мотором, у которого есть вход задания.

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

Дело то все в том я не хотел использовать готовые решения, просто управление мощьностью, вот что мне нужно.

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

Тогда ваш вариант №1

Читайте теорию, без понимания процесса не получится написать программу.

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

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

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

Чтобы просто снизить, нужен ЛАТР или резистор. А Вы ставили задачу «регулировать».

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

. но этим должен управлять 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 ему он будет делать сам.

Статьи/примеры думаю сами нагуглите.

А примера «из боевой задачи» можете попробовать порытся в исходниках вот этой библиотеки

Она включает в себя и классик для работы с таймером (аналог TimerOne библиотеки), и пример ее использования в классе PPMOut. Он как раз тем и занимается, что вначале расчитывает массив «длины импульсов», а потом переключает выходной пин через эти расчитанные интервалы времени.

Там внутри есть массивчик m_timings. В нем лежат интервалы времени в микросекундах через которые нужно менять пин. Как они расчитываются — можете забить, что-бы не разбиратся «зачем эта библиотека» и «что такое PPM» 🙂

Просто считаетй что массив m_timings — содержит интервалы. Тогда сам обработчик прерывания выглядит вообще «тупо до крика»

Ну а у вас, видимо даже массива не будет, будете по очереди менять 220 и 6600.

Как сконфигурить таймер — смотрите выше в функции ::start (там используется класс Timer1, если захочется «понять до самого конца — лезте в этот класс Timer1, берите даташит и смотрите какие регистры он выставляет и «что это означает»). Либо просто «спионерте» его себе, и не заморачиваесь использйте Timer1::setToggle(true, true); 🙂

Источник

Поделиться с друзьями
Вентилиция и кондиционирование
Adblock
detector