Андрей Смирнов
Время чтения: ~17 мин.
Просмотров: 58

Библиотека PID регулятора для Arduino [27.02.20]

PID РЕГУЛЯТОР НА ARDUINO

ПИД регулятор – мощный инструмент, позволяющий удерживать заданную величину (температура, скорость вала, положение) при помощи управляющего устройства (обогреватель, контроллер мотора, линейный привод). Вот отличная статья по теории, что такое ПИД регулятор, как он работает и как его настроить. А я предлагаю свою библиотеку для работы с PID на Arduino.

ПИД регулятор выдаёт на  выходе сигнал для плавного управления управляющим устройством (диммер, транзистор), если вам нужно реле – используйте библиотеку GyverRelay.

Алгоритм ПИД регулятора выглядит так, можете использовать его напрямую в скетче:

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ  // величины регулятора  int setpoint = 0;   // заданная величина, которую должен поддерживать регулятор  int input = 0;      // сигнал с датчика (например температура, которую мы регулируем)  int output = 0;     // выход с регулятора на управляющее устройство (например величина ШИМ или угол поворота серво)  int pidMin = 0;     // минимальный выход с регулятора  int pidMax = 255;   // максимальный выход с регулятора    // коэффициенты  float Kp = 1.0;  float Ki = 1.0;  float Kd = 1.0;  float _dt_s = 0.1; // время итерации в секундах    // вспомогательные переменные  int prevInput = 0;  float integral = 0.0;    // ПИД  // функция расчёта выходного сигнала  int computePID() {    float error = setpoint - input;           // ошибка регулирования    float delta_input = prevInput - input;    // изменение входного сигнала    prevInput = input;    output = 0;    output += (float)error * Kp;                  // пропорционально ошибке регулирования    output += (float)delta_input * Kd / _dt_s;    // дифференциальная составляющая    integral += (float)error * Ki * _dt_s;        // расчёт интегральной составляющей    // тут можно ограничить интегральную составляющую!    output += integral;                           // прибавляем интегральную составляющую    output = constrain(output, pidMin, pidMax);   // ограничиваем выход    return output;  }

БИБЛИОТЕКА GYVERPID

GyverPID v2.2

pidLogo.png

Библиотека классического PID регулятора для Arduino

  • Быстрая и лёгкая библиотека
  • Время одного расчёта около 70 мкс
  • Режим работы по величине или по её изменению (для интегрирующих процессов)
  • На выбор целочисленная или float модель вычисления
  • Возвращает результат по встроенному таймеру или в ручном режиме

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

ДОКУМЕНТАЦИЯ

Документация

Логика работы

ПИД регулятор принимает на вход две величины:

  • Входной сигнал input – сигнал с датчика: температура, скорость, положение, и т.д;
  • Установку setpoint – величина, к которой регулятор будет стараться регулировать входной сигнал (температуру, скорость, положение…)

С ПИД регулятора выходит выходной (управляющий) сигнал output – безразмерная величина, которая подаётся на управляющее устройство. Это может быть транзистор с ШИМ сигналом, диммер, сервопривод, и т.д. Выходной сигнал должен влиять на входной сигнал: нагреватель нагревает объект с датчиком температуры, мотор крутится и даёт значения для датчика оборотов, и т.д.

Закон управления регулятора устанавливается при помощи коэффициентов Kp, Ki и Kd. Kp – пропорциональный коэффициент, выходная величина будет увеличиваться пропорционально разнице входного сигнала и установки. Ki – коэффициент интегрирующей составляющей, отвечает за накапливающуюся ошибку, позволяет сгладить пульсации и нивелировать маленькую ошибку. Kd – коэффициент дифференциальной составляющей, отвечает за скорость изменения величины, позволяет уменьшить раскачку системы.

Инициализация

Можно инициализировать объект тремя способами:

  • GyverPID regulator;  // инициализировать без настроек (всё по нулям, dt 100 мс)
  • GyverPID regulator(kp, ki, kd);  // инициализировать с коэффициентами. dt будет стандартно 100 мс
  • GyverPID regulator(kp, ki, kd, dt);   // инициализировать с коэффициентами и dt (в миллисекундах)

Режимы и настройки

Направление регулирования: зависит от того, в какую сторону направляется управляемая величина (input) при увеличении управляющего сигнала (output). Например: охлаждение или нагрев, разгон или торможение, и т.д. По умолчанию стоит NORMAL – регулятор считает, что увеличение управляющего сигнала (output) увеличит входной сигнал (input). Устанавливается командой

setDirection(dir);   // dirNORMAL или REVERSE

Режим работы: режим регулирования по ошибке входного сигнала (ON_ERROR) или по изменению входного сигнала (ON_RATE). По умолчанию стоит ON_ERROR, его рекомендуется использовать в большинстве случаев, потому что большинство процессов – саморегулирующиеся (температура нагревателя сама установится в своём максимуме, скорость мотора – тоже). Режим ON_RATE рекомендуется использовать в интегрирующих процессах, в которых выходная величина влияет на скорость изменения входной величины, например положение моторизированного слайдера, который не остановится при управляющем сигнале, отличном от нуля. Таким процессом будет проще управлять в режиме ON_RATE. Устанавливается командой

setMode(mode);  // modeON_ERROR или ON_RATE

Пределы выхода: ограничение значения выходного сигнала, по умолчанию: 0-255 (для 8 бит ШИМ). Может быть установлено 0-180 для угла сервопривода, и т.д. Устанавливается командой

setLimits(min, max);  // установить пределы

Время итерации: время итерации можно изменить в процессе работы (не знаю, зачем, но возможность есть). Время устанавливается в миллисекундах и влияет на функцию getResultTimer, которая с этим периодом делает новый расчёт управляющего сигнала. Также это время входит в расчёт управляющего сигнала (в И и Д составляющей). Устанавливается командой

setDt(dt);  // установка времени итерации в мс

Установка/чтение параметров

Основные величины регулятора можно менять в любом месте программы любым удобным способом (кнопки, энкодер, передача через UART/GSM/WiFi, как угодно). Коэффициенты регулятора Kp, Ki и Kd можно устанавливать и читать напрямую как члены класса, например

regulator.Kp = 1.5;        // установить  regulator.Ki += 0.7;       // изменить  lcd.print(regulator.Kd);   // читать

Время итерации меняется при помощи метода setDt() (см. выше).

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

regulator.input = 10;     // ВХОД регулятора, например текущая температура  regulator.setpoint = 20;  // УСТАНОВКА регулятора, например необходимая температура  analogWrite(regulator.output);  // ВЫХОД с регулятора можно подавать напрямую на ШИМ или серво

Тип вычислений

Библиотека имеет режим целочисленных вычислений. Скорость вычислений особо не меняется, но код занимает меньше места и всё-таки должен выполняться быстрее. По умолчанию стоит режим чисел с плавающей точкой, в заголовочном файле библиотеки смотрите ключевое слово datatype, datatype будет float или int в зависимости от настройки: это некоторые переменные и функции. Настройка осуществляется дефайном перед подключением библиотеки:

#define PID_INTEGER  #include "GyverPID.h"

Как работать с библиотекой?

Нужно скормить регулятору текущее значение величины в input, нужное значение в setpoint, провести расчёт при помощи getResult или getResultTimer, и после этого выходную величину output подать на управляющее устройство. Делать это нужно часто для быстрых процессов (стабилизация частоты оборотов шпинделя станка под нагрузкой: dt берём около 10-50 мс), и не очень часто для медленных процессов (удержание заданной температуры бойлера: dt можно взять пару секунд, процесс очень инерционный). Функция getResult делает расчёт в каждый свой вызов и возвращает output, а getResultTimer делает расчёт только при срабатывании встроенного таймера. То есть getResult нужно вызывать по своему таймеру (для продвинутых пользователей), а getResultTimer нужно вызывать как можно чаще, он посчитает только тогда, когда это будет нужно по своему таймеру. После расчёта можно подавать управляющий сигнал (выходную величину output) на управляющее устройство. Смотрите пример!

Как настроить коэффициенты?

Подбор коэффициентов ПИД регулятора – индивидуальная задача, зависящая от конкретных условий и “железа”. Можно почитать статьи на эту тему: например эту, вот эту попроще, и вот эту посложнее. Первым делом нужно установить dt – об этом я писал выше. Маленький dt для быстрых процессов и побольше для медленных (инертных). Dt влияет на расчёты при неизменных коэффициентах, поэтому dt лучше не менять во время настройки, чтобы не пришлось пересчитывать все остальные коэффициенты. Диапазон коэффициентов: 0.01 – 100, т.е. довольно широк и зависит напрямую от инертности системы и выбранного времени dt. Коэффициенты должны быть положительные, противоположное направление регулирования задаётся в setDirection.

Интегральная составляющая

В версии 2.1 интегральная составляющая вынесена в публичный доступ как член класса, к ней можно обратиться как regulator.integral. Интегральная составляющая суммирует ошибку по времени, и при слишком сильном накоплении может приводить к перерегулированию. Для наблюдения за её состоянием можно прочитать integral, и при необходимости например ограничить её диапазон (regulator.integral = constrain(regulator.integral, -50, 50);) или даже обнулить (regulator.integral = 0;).

Список функций и методов библиотеки из файла .h

// ==== datatype это float или int, в зависимости от выбранного (см. пример integer_calc) ====  GyverPID();  GyverPID(float new_kp, float new_ki, float new_kd, int16_t new_dt = 100);   // kp, ki, kd, dt    datatype setpoint = 0;     // заданная величина, которую должен поддерживать регулятор  datatype input = 0;        // сигнал с датчика (например температура, которую мы регулируем)  datatype output = 0;       // выход с регулятора на управляющее устройство (например величина ШИМ или угол поворота серво)    datatype getResult();      // возвращает новое значение при вызове (если используем свой таймер с периодом dt!)  datatype getResultTimer(); // возвращает новое значение не ранее, чем через dt миллисекунд (встроенный таймер с периодом dt)    void setDirection(boolean direction);    // направление регулирования: NORMAL (0) или REVERSE (1)  void setMode(boolean mode);              // режим: работа по входной ошибке ON_ERROR (0) или по изменению ON_RATE (1)  void setLimits(int min_output, int max_output);    // лимит выходной величины (например для ШИМ ставим 0-255)  void setDt(int16_t new_dt);              // установка времени дискретизации (для getResultTimer)    float Kp = 0.0;  float Ki = 0.0;  float Kd = 0.0;

ПРИМЕРЫ

Демо — все возможности библиотеки с комментариями

/*     Пример работы ПИД регулятора в автоматическом режиме по встроенному таймеру     Давайте представим, что на 3 пине у нас спираль нагрева, подключенная через мосфет,     управляем ШИМ сигналом     И есть какой то абстрактный датчик температуры, на который влияет спираль  */  #include "GyverPID.h"    GyverPID regulator(0.1, 0.05, 0.01, 10);  // коэф. П, коэф. И, коэф. Д, период дискретизации dt (мс)  // или так:  // GyverPID regulator(0.1, 0.05, 0.01);// можно П, И, Д, без dt, dt будет по умолч. 100 мс    void setup() {    regulator.setDirection(NORMAL); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL    regulator.setLimits(0, 255);    // пределы (ставим для 8 битного ШИМ). ПО УМОЛЧАНИЮ СТОЯТ 0 И 255    regulator.setpoint = 50;        // сообщаем регулятору температуру, которую он должен поддерживать      // в процессе работы можно менять коэффициенты    regulator.Kp = 5.2;    regulator.Ki += 0.5;    regulator.Kd = 0;  }    void loop() {    int temp;                 // читаем с датчика температуру    regulator.input = temp;   // сообщаем регулятору текущую температуру      // getResultTimer возвращает значение для управляющего устройства    // (после вызова можно получать это значение как regulator.output)    // обновление происходит по встроенному таймеру на millis()    analogWrite(3, regulator.getResultTimer());  // отправляем на мосфет      // .getResultTimer() по сути возвращает regulator.output  }  

УСТАНОВКА БИБЛИОТЕКИ

Если вы не знаете, как установить библиотеку – читайте отдельный урок по работе с библиотеками!

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

libs-1.png

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.

Reg_ob.jpg

Понадобился регулятор оборотов коллекторного двигателя. Регулятор оборотов на Ардуино с поддержанием оборотов. Двигатель от стиральной машинки-автомата.

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

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

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

Схема регулятора оборотов будет содержать в себе:

  • Ардуино Нано
  • Блок настроек, и управления оборотами
  • Силовая часть
  • Датчика скорости
  • Защита (реле)
  • Дополнительные входы и выходы

Ардуино Нано будет контролировать и управлять силовой частью

  • А0 — регулировка оборотов двигателя
  • А1 — настройка минимальных оборотов двигателя
  • А2 — настройка максимальных оборотов двигателя
  • А3 — выход управления симистором
  • А4 — дополнительный аналоговый вход (не задействован)
  • А5 — выход управления реле
  • А6 — дополнительный аналоговый вход (не задействован)
  • А7 — разгон или плавный старт
  • D2 — сигнал перехода через ноль
  • D4 — дополнительный выход
  • D6, D7 — тахогенератор
  • D8 — датчик холла

Блок настроек, и управления оборотами

Силовая часть будет управлять двигателем. Разъем Р1 — для подключении к сети 220В. Р3 — для установки перемычки в зависимости от блока питания.

При установке блока питания с выходным напряжением 5 вольт, на разъеме Р3 нужно установить перемычку на контакты 2 и 3. При выходном напряжении блока питания 7-12 вольт перемычку устанавливаем на контакты 1 и 2.

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

На выводы 220V0 И 220V1, подается сетевое напряжение 220 Вольт.

Схема будет питаться импульсным блоком питания с выходным напряжением 5 вольт. Импульсный блок питания, возьмём уже готовый. Так же схему можно питать от 7 до 12 вольт. На плате есть перемычка переключения напряжения 5/12v. Так же можно питать схему и зарядным от телефона, только проверьте выходное напряжение, там не должно быть выше 5 вольт.

При установки перемычки на 5 вольт напряжение поступает напрямую на шину +5 вольт. Реле надо будет установить на 5 вольт.

При установки перемычки на 12 вольт напряжение поступает на вход Ардуино Vin. В этом случае можно питать схему напряжением 7-12 вольт. но и реле должно быть на такое напряжение, какое выходит с блока питания.

Датчик скорости в двух исполнения. На тахогенераторе или на датчике холла.

Схема разрабатывалась так, что бы обороты можно было считывать с тахогенератора,  уже установленные на двигателях машинок-автоматов. Разъем Р4 служит для подключения тахогенератора.

А так же при отсутствии или неисправности тахогенератора можно заменить на датчик холла. 

Реле служит защитой от пробоя симистора. Когда симистор пробивает, двигатель будет выходить на максимальные обороты, и это очень опасно . А что бы этого не случилось, контроллер отслеживает частоту вращения двигателя, и при превышении установленных оборотов реле отключает двигатель. Как обороты упадут ниже нормы, реле включится. Разъем Р7 — для подключения коллекторного электродвигателя.

Дополнительные входы и выходы

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

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

Верхний слой печатной платы

В конце статьи находится архив со всеми файлами для повторения данного проекта

Настройка регулятора

Настройка не сложная, поэтапная, так же можно протестировать все узлы регулятора на правильную работу.

Скачать архив . Внутри лежат: прошивки, файл Gerber.

Lesson73_1.png

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

Предыдущий урок     Список уроков     Следующий урок

Игорь из Москвы заказал мне разработку контроллера- регулятора скорости вращения двигателя постоянного тока.

Это продолжение бесконечной разработки интеллектуального сверлильного станка. Сначала я написал для него общую управляющую программу. Затем мы создали электронный прицел для станка на OSD-генераторе. Пришла очередь до двигателя, который вращает шпиндель.

Используется коллекторный двигатель постоянного тока  мощностью 500 Вт и номинальным напряжением 100 В. Необходимо задавать и стабилизировать его скорость вращения.

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

Должен получиться учебный материал на несколько разных тем:

  • аппаратное подключение двигателя постоянного тока к Ардуино;
  • измерение частоты и периода сигнала ;
  • управление нагрузкой с помощью ШИМ;
  • ПИД-регулятор;
  • этапы разработки подобных устройств.

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

У Игоря используется достаточно мощный мотор 500 Вт, с номинальным напряжением питания 100 В. У меня такого двигателя нет. Поэтому я проведу разработку и испытания на компьютерном вентиляторе с номинальным напряжением 12 В. Не сомневаюсь, что все написанное и разработанное будет справедливо и для гораздо более мощных устройств. По крайней мере, Игорь проверит контроллер на 500 ваттном моторе.

Аппаратное подключение двигателя постоянного тока к Ардуино.

Существуют две основные задачи:

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

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

  •  регулируемый параметр – что мы регулируем;
  • регулирующий элемент – с помощью чего мы регулируем.

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

Подключение двигателя к ШИМ Arduino.

Естественно для управления двигателем будем использовать ШИМ. Это значительно упростит схему, повысит КПД. Практически, независимо от мощности и напряжения мотора, для управления им достаточно одного ключа. Конечно, передельно-допустимые параметры ключа должны соответствовать двигателю. Для моего двигателя-вентилятора я выбрал такие элементы.

Lesson73_2.png

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

  • полевым проще управлять;
  • у него меньше падение напряжения в открытом состоянии, а значит он меньше греется;
  •  в отличие от биполярного транзистора, он работает на высоких частотах 100 кГц и выше.

Я выбрал MOSFET-транзистор IRF7341: N-канал, 55 В, 4 А. Кроме предельно-допустимых параметров необходимо учитывать то, что транзистор должен быть низкопороговым, т.е. открываться при небольшом напряжении (не более 5 В). Иначе необходимо использовать дополнительный элемент – драйвер.

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

В некоторых подобных схемах используют низкочастотные выпрямительные диоды, например, 1N4007. Это допустимо только для дискретного управления двигателем: включить или выключить. При управлении с помощью ШИМ, особенно с высокой частотой, диод должен быть высокочастотным, лучше с барьером Шоттки.

При закрытом транзисторе диод находится в открытом состоянии, через него течет ток размагничивания обмотки двигателя. Затем транзистор открывается. А диод закрывается только через время восстановления обратного сопротивления. Даже у “быстрых” (FR307) диодов это время составляет 150-500 нс, у “супербыстрых” 35 нс, а у выпрямительных  1N4007 этот параметр не нормируется. Представьте себе, что при частоте ШИМ 100 кГц 100000 раз в секунду будет происходить короткое замыкание. Это приведет к жутким помехам, уменьшению КПД  и нагреву диода и транзистора.

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

  • Лучше всего диод Шоттки.
  • Если высокое напряжение (более 150 В) не позволяет использовать диод Шоттки, то лучшим вариантом будет карбидокремиевые диоды Шоттки.
  • Следующим приемлемым вариантом могут быть HEXFRED-диоды с ограничением обратного тока обратного восстановления;
  • На крайний случай остаются супербыстрые и ультрабыстрые диоды.

У меня напряжение всего 12 В. Я выбрал диод Шоттки SS16.

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

Измерение скорости вращения.

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

Конструкции измерителей скорости могут быть самыми разными. Можно закрепить на валу двигателя металлический диск с радиальными прорезями и использовать автомобильный датчик Холла.

Lesson73_3.png

Диск будет прерывать магнитное поле между датчиком Холла и постоянным магнитом. На прорезях магнитное поле будет проходить к датчику и таким образом, при вращении,  будут формироваться импульсы.

Я поступил проще. Использовал дешевый, миниатюрный датчик Холла TLE4905L. В самых дорогих магазинах он стоит до 50 руб, а на АлиЭкспресс от 25 руб.

Это цифровой датчик Холла, настроенный на определенный порог магнитного поля.  Он прекрасно срабатывает на расстоянии 8 мм от миниатюрного магнита диаметром 5 мм и толщиной 1 мм.

Lesson73_4.jpg

Конструкция измерителя очевидна. Я приклеил 2 магнита к диску вентилятора и над линией, по которой они двигаются при вращении, расположил датчик Холла.

Lesson73_5.jpg

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

Как у датчика, так и у магнитов есть полярности. Поэтому перед тем, как устанавливать эти компоненты надо проверить в каком положении срабатывает датчик.

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

Lesson73_6.png

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

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

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

Lesson73_7.png

В реальных приложениях обороты можно задавать напряжением на аналоговом входе A0. Получится стандартный аналоговый интерфейс 0…5 В. Если необходим диапазон 0…10 В, то достаточно добавить резисторный делитель напряжения.

Состояние контроллера для отладки ПИД-регулятора будем передавать на компьютер через последовательный порт. Я разработаю программу верхнего уровня с регистрацией данных и отображением их в графическом виде. Регистратор значительно облегчает настройку любого ПИД-регулятора.

В следующем уроке начнем “оживлять” контроллер.

Предыдущий урок     Список уроков     Следующий урок

Coin.png Поддержать проектИспользуемые источники:

  • https://alexgyver.ru/gyverpid/
  • https://radiolubitelyam.su/regulyator-oborotov/
  • http://mypractic.ru/urok-73-pid-regulyator-skorosti-vrashheniya-dvigatelya-postoyannogo-toka-razrabotka-apparatnoj-chasti.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации