ШИМ-регулятор на Arduino

  Простой ШИМ-регулятор легко можно сделать с помощью Arduino. Для примера возьмём всем известный контроллер Arduino UNO , который построен на ATmega328.  Он имеет 14 цифровых входов/выходов ( 6 из которых могут использоваться как выходы ШИМ)  и  6 аналоговых входов. Arduino UNO недорого можно купить здесь - http://ali.pub/y24f1



   Для наших целей понадобится один аналоговый вход - А0, который используем для подключения переменного резистора, а также один выход ШИМ - возьмём 11. Соберём простую схему : 



      И напишем простую программу для управления яркостью светодиода , подключённого к 11 выходу ШИМ. Регулировать будем переменным резистором, который подключен к аналоговому входу А0.








   Получаем первый результат  -  яркость светодиода изменяется с помощью переменного резистора. Для управления какой-нибудь силовой нагрузкой включённой в сеть 220 вольт такой ШИМ тоже сгодится, только желательно сделать гальваническую развязку между силовой частью и Arduino.  Можно взять готовый кусочек схемы из предыдущей страницы " ШИМ-регулятор 220 В( IGBT)"
    


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


                                       


 Далее по плану использовать обратную связь от таходатчика коллекторного двигателя для поддержания стабильных оборотов, а также увеличить частоту ШИМ. 

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

и подал это сигнал на аналоговый вход  А1.  Для защиты входа Ардуино от перенапряжения поставил ещё стабилитрон на 5.1  вольт. Получилась такая схема



 Для написания программы  управления оборотами коллекторного двигателя  использовал библиотеку PID - регулятора для Arduino.


#include <PID_v1.h> // подключаем библиотеку PID-регулирования
double pwmSet, pwmSpeed, pwmOut; //  //переменные для пид-регулятора
PID myPID(&pwmSpeed, &pwmOut, &pwmSet, 0.2, 0.5, 0, DIRECT);
// Подобрал коэфф пид-регулятора Kp=0.2, Ki=0.5, Kd=0 .
#define PWM_PIN   11 // выход ШИМ
#define SET_PIN    0 // установка оборотов  0-5 вольт  мин-макс
#define TACHO_PIN  1 // сигнал от таходатчика 0-5 вольт  мин-макс

void setup() {
    myPID.SetMode(AUTOMATIC);
}
void loop()  {
    pwmOut = constrain ( pwmOut , 0, 250); // это необязательно - по умолчанию 0-255
    pwmSet  =  analogRead(SET_PIN); // считываем показания потенциометра регулировки скорости
    pwmSpeed = analogRead(TACHO_PIN); // считываем показания таходатчика
    myPID.Compute(); //  здесь происходят вычисления пид-регулятора - то есть pwmOut
    analogWrite(PWM_PIN, pwmOut);//  получаем выходной сигнал ШИМ
}

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



61 комментарий:

  1. Здравствуйте Александр. Смотрел ваше видео. Данная тема, тоже интересует. Но я новичек во всем этом. Вот интересное видео с использованием датчика холла.
    https://www.youtube.com/watch?v=x2fLvS8Ms9w

    ОтветитьУдалить
  2. Здравствуйте вы случайно неделание регулятора и управления бесколекторный двигателем от стиральной машины лж рабочее напряжение от 0 до 100 вольт постоянного тока ампераж сказать не могу

    ОтветитьУдалить
    Ответы
    1. Я такими пока не занимался, возможно там какое-то подобие частотного привода

      Удалить
  3. Здравствуйте Александр, никак не дождусь ардуино, тоже бы поэкспериментировал. А пока собираю разный материальчик. Вот интересное видео, можно связаться с автором, может что подскажет https://www.youtube.com/watch?v=cU9oF3OKIlY

    ОтветитьУдалить
  4. Александр, прокомментируй, пожалуйста что происходит в void loop

    ОтветитьУдалить
    Ответы
    1. Александр, я написал кое-какие пояснения в скетче, хотя я не большой специалист в программировании. Делал программу больше по аналогии и по интуиции. А что конкретно непонятно в этом скетче?
      Вообще на первый взгляд ПИД-регулятор - это просто, но вся проблема заключена в этих коэффициентах Kp, Ki, Kd а также в их подборе для каждого конкретного случая.

      Удалить
    2. Спасибо. Да, вот смотрю на вашу программу и вижу что просто. До этого читал, не понял толком ничего. Размазывают, растягивают, а что куда подставлять не понятно. Позже посмотрю ваши пояснения - спрошу ещё.

      Удалить
  5. Доброго всем времени.
    Вопрос к автору и повторившим, есть ли разница между регулятором на Ардуино и ТДА1085. в работе на динамическую нагрузку например болгарка.

    ОтветитьУдалить
  6. На сегодня всё проверено на TDA1085, а Arduino (как и другие контроллеры) будет работать не хуже и позволит реализовать гораздо больше возможностей в будущем.

    ОтветитьУдалить
  7. Спасибо за ответ.
    Да Ардуино должно давать больше возможностей. Неплохо было бы прикрутить тахометр или еще что нибудь, может счетчик оборотов, тогда получиться универсальный девайс.

    ОтветитьУдалить
  8. можете выложить саму библиотеку PID_v1.h

    ОтветитьУдалить
  9. Почему нет защиты, ведь не сложно реализовать.

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

      Удалить
  10. Великолепное по простоте решение! Особенно в программной части :). Есть два маленьких недостатка. Во-первых при такой обратной связи реальные обороты двигателя не определить, т.к. все импульсы таходатчика сглаживаются. Но это излечимо, если снимать с датчика не выпрямленное напряжение, а считать частоту импульсов. И во вторых, силовая часть будет малость по-дороже, чем в случае управления переменным током через симистор. Но зато как всё просто!

    ОтветитьУдалить
    Ответы
    1. Согласен с вами, я думаю примерно также, надо считать импульсы, тогда и обороты можно измерять.

      Удалить
  11. Я очень извиняюсь, но с нетерпением жду регулятор с тахометром. Когда можно, примегно ждать. Еще раз извините, но сам я не могу ничего написать.Очень жду.

    ОтветитьУдалить
    Ответы
    1. Буду работать над этим вопросом, но точно не могу сказать - это зависит очень от многих причин.

      Удалить
  12. У меня вопрос, что это за транзистор VT2 S8580?

    ОтветитьУдалить
  13. Здравствуйте. Хочу повторить эту схему. С ардуино уже знаком (часы,барометр собирал, светодиодиком моргал :)) , надеюсь получится. Вопрос по диоду RHRP3060. Его функции? Он скоростной,мощный (30А) , нужен именно такой или чем то можно заменить ?
    И спасибо за проделанную работу.

    ОтветитьУдалить
    Ответы
    1. Это защитный диод для работы с индуктивной нагрузкой, он должен быть быстродействующий - зависит от частоты ШИМ. Должен перекрывать рабочие напряжение и ток. Насчёт быстродействия - я подбирал по нагреву - сначала поставил по-моему FR1007 на 10 ампер 1000 вольт - на малой частоте ШИМ не нагревался - как только я увеличил частоту до 10-20 кГц - стал сильно греться. Тогда поставил RHPR3060 - стала нормальная температура . То есть главный параметр - это быстродействие.

      Удалить
  14. Увы, по быстрому повторить не получится. Как я понимаю, логичное продолжение проекта это драйвер hcpl 3120 и транзистор Fga25n120 ? Так в наших радиоларьках запросили 3$ за драйвер и 11$ (!) за транзистор, про диод уже и спрашивать не стал. Всё заказал на eBay, (к примеру: 10 драйверов всего 2.45 и 5 транзистров за 4$ ). Придётся ждать.

    ОтветитьУдалить
    Ответы
    1. Знакомая история, я почти всё так заказываю.

      Удалить
  15. Может, пока подскажете, что заранее заказать для новой версии с тахометром.

    ОтветитьУдалить
    Ответы
    1. Дисплей будет LCD1602, а для обработки сигнала таходатчика компаратор LM393

      Удалить
    2. Спасибо, буду готовиться.

      Удалить
  16. Доброго дня, хочеться повторить Вашу схему. Подскажите программа для ардуино в свободном доступе, ткните где/как скачать. И еще вопрос, она программа, совместима с ардуино мини?
    Извините за ламерские вопросы)) учусь...
    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Программу легко набрать, она прямо в тексте на этой странице и на фото тоже. С мини должна быть совместима.

      Удалить
  17. Этот комментарий был удален автором.

    ОтветитьУдалить
  18. александр подскажите наименование стабилитронов vd2, vd4, vd8 и диодный мост на входе тахо?

    ОтветитьУдалить
  19. 1N4742A и 1N4733A подойдут?
    а вот диодный мост какой?

    ОтветитьУдалить
    Ответы
    1. Подойдут любые 0.5 или 1 Вт, 1N4742A и 1N4733A тоже подойдут.
      Диодный мост абсолютно любой, напряжение до 50 вольт, ток небольшой.

      Удалить
  20. и мощность резисторов хотелось бы узнать )
    а еще скажите почему с5 на 400 вольт?

    ОтветитьУдалить
    Ответы
    1. Амплитуда у синусоиды питающей - 310 вольт ( 220 вольт это действующее значение)
      R12 у меня 2 Вт, R11 - два 5-ватных сопротивления по 20 Ком. Остальные 0.25 Вт.

      Удалить
    2. А разве R10 не на 3 ватта?

      Удалить
    3. Да, R10 стоит на 3 ватта

      Удалить
  21. Транзистор FGA25N120ANTD с диодом внутри между эмиттером и коллектором .нужен ли тогда диод VD5 ?

    ОтветитьУдалить
    Ответы
    1. Диод нужен, он ставится параллельно индуктивной нагрузке и в обратной полярности.

      Удалить
  22. А параметры схемы которая идет с таходатчика у вас подобраны таким образом, что когда вы потенциометром устанавливаете, допустим, 2.5 В, у вас двигатель раскручивается до таких оборотов, что с таходатчика приходит 2.5 Вольта, или это необязательно, главное чтобы просто было меньше 5?

    ОтветитьУдалить
    Ответы
    1. Просто непонятно, как работает регулятор, он должен сравнивать входной сигнал с потенциометра и с датчика или нет?

      Удалить
    2. Подстроечник R3 устанавливается так, чтобы на максимальных оборотах на вход Ардуино поступало 5 вольт. Тогда получается диапазон 0 - 5 вольт.

      Удалить
    3. Совершенно верно, сравнивает два сигнала - с потенциометра и с таходатчика

      Удалить
  23. А на последнем рисунке с кодом, это весь программный код, или ещё что-то есть?
    просто попробовал сейчас его загрузить, у меня на выходе стабильно 0 почему-то.
    Как при разных сигнлах на А1 и А0 так и при одинаковых

    ОтветитьУдалить
  24. Наверно у вас нет этой библиотеки PID_v1.h - загрузить надо.

    ОтветитьУдалить
    Ответы
    1. http://www.picshare.ru/view/8122613/
      в том и дело что есть...
      единственное, на что я думаю, у меня не оригинальная ардуинка, может быть поэтому..
      А весь код точь в точь как Ваш
      http://www.picshare.ru/view/8122614/

      Удалить
    2. А помните, в первоначальном коде вы задавали уменьшение выходной переменной в 4 раза, в это случае нужно ли так делать? просто на выходе то изначально предел сигнала 1024

      Удалить
  25. Разобрался, это почему-то некорректно отображался именно сам светодиод, когда подключил к двигателю всё заработало)

    ОтветитьУдалить
  26. А ещё, последний вопрос... Почему у вас в строке
    PID myPID(&pwmSpeed, &pwmOut, &pwmSet, 0.2, 0.5, 0, DIRECT);
    задан параметр DIRECT? Директ это ведь прямое рягулирование, и уменьшение сигнала входного сигнала приводит к уменьшению сигнала на выходе? Там разве не нужно было написать Reverse?

    ОтветитьУдалить
    Ответы
    1. Нет, DIRECT правильно -
      https://playground.arduino.cc/Code/PIDLibrarySetControllerDirection

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

      Удалить
  27. Здраствуйте помогите в написании скетча для ардуино уно управление двигателем постоянного тока с реверсом поддержанием момента и торможением?

    ОтветитьУдалить
    Ответы
    1. Я больше по аппаратной части, программы у меня очень упрощённые получаются - не программист я. Мне бы самому помощь в программировании не помешала бы.

      Удалить
  28. Все собрал, движок 750 Вт (Ручной фрезер), сгорает выходной транзистор, видать пусковой ток очень большой (сопротивление обмоток на холостую 10-12 Ом). Есть мысли как ограничить пусковой ток (аппаратно или программно)? Частоту увеличил до 4 кГц, датчик тахометра поставил цифровой. Кому интересно скетч выложу.

    ОтветитьУдалить
  29. Здравствуйте, Александр. Собрал я электропривод к инвалидной коляске на двигателе с "индезита" 370 Вт. Питание 75-80 В (6 аккумуляторов ИБП 12В). Управлял китайским ШИМ регулятором 0-90 В, За месяц два сгорело. Хочу сделать ШИМ на ардуинке, силовую часть на FGA25N120ANTD. Пробовали ли Вы для управления использовать драйвер hcpl 3120?

    ОтветитьУдалить
    Ответы
    1. Пока сделал пробный регулятор на NE555 с гальвнической развязкой от 220 вольт и с драйвером TLP250. Он похож на HCPL3120. Также аппаратную защиту по току сделал. На компараторе.

      Удалить
  30. Подскажи пожалуйста какая площадь радиаторов и как сильно греется ? у меня нагрузка примерно 500 вт.

    ОтветитьУдалить
    Ответы
    1. У меня был двигатель мощностью 300 ватт, включал без нагрузки, в общем ничего особо не грелось.
      Радиаторы были такие - для транзистора - http://ali.pub/1t9krd
      Диод Шоттки стоял - http://ali.pub/1t9kuo . Площадь можете сами посчитать.

      Удалить
  31. Добрый день. Александр, Вы планируете развитие проекта например как тут https://youtu.be/KpTU8BqM6UI?t=2m59s ?

    ОтветитьУдалить
    Ответы
    1. Да, планирую и делаю сейчас, но всё очень медленно получается.

      Удалить
  32. Здравствуйте! Я так понимаю для тэна эта схема тоже подойдет? Можно ли использовать сторонний источник +12В? Нужно ли как-то программно ограничивать шим(ведь после моста у нас будет 310В)? Для чего резистор R10 0,1 Ом между истоком и землей? Обязательно ли использовать диод D8, если нагрузка чисто активная?
    Заранее благодарю за ответы.

    ОтветитьУдалить