Управление коллекторным двигателем

Kuvator
Offline
Зарегистрирован: 12.01.2017

Добрый день, 

Я являюсь очень начинающим радиолюбителем и программистом с 3-х дневным стажем =) но возможности, которые открывает ардуино меня сильно заинтересовали.

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

Поставленная задачи:

1) Заставить двигатель вращаться с достаточно низкой скоростью 700-1200 RPM. - Выполнено (на основесетевого диммера (естественно не моей разработки, но не уверен, что можно давать ссылки на ресурс, на котором нашел эту инфу).

2) Организовать обратную связь для автоматического поддержания оборотов при появлении нагрузки.

Двигатель имеет таходатчик, создающий переменный ток от 30 вольт на низжих оборотах. Вот здесь и начинаются первые вопросы, имеет ли смысл организовывать мониторинг числа оборотов при помощи Zero crossing?  или есть другие способы? также прошу помощи с написанием кода для автоматического поддержания заданных оборотов.

Схема очень проста даже для меня:

1) оптопара PC017 передает прерывание на ардуино, тем самым информирует о переходе через 0.

2) Симистор БТ137, развязанный с ардуино при поможи оптоары MOC3052, открывается с задержкой установленной кодом ардуино, отрезая часть полупериода переменного тока, и закрывается во вермя перехода через 0, что позволяет снизить напряжение подаваемое на двигатель.

Схема платы управления:

 

Использованный Код:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimtime = (9800); // При 50Гц период = 20 000 микросекунд, получериод = 10 000микросекунд, 
задержка включения симистора 9 800 микросекунд позволяет получить достаточно низкое напряжение на выходе.


void setup()
{
  pinMode(AC_LOAD, OUTPUT);	      // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
       
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

sslobodyan
Offline
Зарегистрирован: 28.09.2016

Никогда не используйте задержки через delay в прерываниях - там они просто не работают. Вам в zero_crosss_int надо выставить в 1 управляющую триаком ногу и запустить таймер, который при сработке через заданный интервал в своей подпрограмме прерываний снимет этот сигнал. Или решайте задачу в лоб - делайте задержку через длинный холостой цикл (что не совсем красиво, но в примитивных задачах работает)

Kuvator
Offline
Зарегистрирован: 12.01.2017

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

Основной же мой вопрос, так как мотор худо-бедно да регулируется, заключается в организации обратной связи и контроле/доддержание заданных оборотов, при помощи имеющегося на моторе таходатчика, который выдет переменное напряжение. За неимением абсолютно никакого опыта сейчас вижу только один вариант - подсчет переходов через 0, но предполагаю, что есть какой-то более популярный и логичный способ для осуществления поставленной задачи.

 

bwn
Онлайн
Зарегистрирован: 25.08.2014

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