Страница 1 из 1

Урок 55 - Энкодер.

Добавлено: 23 дек 2017, 00:03
Михаил_Я
Эдуард, здравствуйте!
Для знакомства с темой полностью скопировал Ваш скетч (в конце урока). Для удобства подключения для А и В использовал выводы 10 и 11, соответственно добавил в "void setup()" строчки:
#define PIN_A 11
#define PIN_B 10
pinMode(PIN_A,INPUT_PULLUP);
pinMode(PIN_B,INPUT_PULLUP);
для подключения подтягивающих резисторов.
В итоге независимо от направления вращения монитор порта показывает поворот влево, и только иногда проскакивает строка "R". Убрал добавленные строчки - результат тот же.
Подскажите, пожалуйста - в чём может быть причина? Энкодер планирую использовать в одном из проектов, и зависимость шага переключения от скорости вращения вала меня очень прельщает.

Re: Урок 55 - Энкодер.

Добавлено: 23 дек 2017, 00:17
Эдуард
Здравствуйте!
В последнем скетче выводы объявляются в конструкторе Encod_er encoder( 2, 8, 4);.
В любом случае проверьте кодировку энкодера с помощью первого скетча урока. За одно проверите схему подключения и сам энкодер.

Re: Урок 55 - Энкодер.

Добавлено: 23 дек 2017, 00:18
Михаил_Я
Простите - уже разобрался!
Использовал энкодер, установленный на плату с подтягивающими резисторами, но поскольку вывод "+" этой платы висел в воздухе, то выводы "А" и "В" оказались соединёнными между собой через сопротивление (суммарное) 10кОм. Встроенные в "Ардуино" подтягивающие резисторы, по рвзным источникам, от 20 до 40 кОм.

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 14:35
Михаил_Я
Здравствуйте!
Энкодер использую для установки температуры (термостат для электропечи). затем сравниваю установленную температуру с фактической, полученной от термопары. Всё прекрасно при отображении на мониторе порта.
Однако при подключении LCD-дисплея (библиотека LiquidCrystal_I2C.h) система реагирует только на первые 1 - 2 шага энкодера. Вероятно, это связано с большим временем считывания информации дисплеем и наличием функции delay.
Поэтому вопросы:
1. Возможно ли на время вращения вала приостановить считывание? Термосистема весьма инертна, поэтому времена в доли секунды не окажут заметного влияния.
2. В библиотеке LiquidCrystal_I2C.h есть пример использования дисплея в качестве монитора порта (Serial Display). Возможно ли, что такое использование LCD решит проблему?

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 19:44
Эдуард
Здравствуйте!
Если вы разместили функцию сканирования состояния энкодера в прерывании по таймеру, то никакие задержки в основном цикле не должны мешать работе энкодера. Единственное условие - нельзя запрещать прерывания.
Попробуйте, возьмите скетч из урока 55, добавьте вывод положения энкодера на LCD дисплей и delay. Все должно работать.

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 21:59
Михаил_Я
Эдуард, я понял свою ошибку. Вы писали, что для управления перемещением шпинделя станка задали в массиве зависимость количества шагов двигателя от скорости вращения энкодера. Я же ввёл переменную x:

if(encoder.timeLeft<=30)
{x =x-50;}
if(30<encoder.timeLeft&&encoder.timeLeft<=90)
{ x = x-10;}
if(90<encoder.timeLeft)
{x = x-5;}
encoder.timeLeft= 0;
if(x < 0)
{x=0;}

(для encoder.timeRight - аналогично). А вычисления х занимают много времени.
Если можно - объясните принцип работы с массивами, я не имею представления, как их использовать.

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 23:01
Михаил_Я
PS: может быть, есть смысл сделать урок на эту тему?
Но, в любом случае, я прошу хотя бы вкратце объяснить здесь.

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 23:11
Эдуард
Про массивы в любой книжке можно прочитать. Это простой и интуитивно понятный элемент.
Объявляется так:
тип данных имя массива[размер];
byte tab1[10]; // массив из 10 байтов с именем tab1
int tab2[5]; // массив из 5 int-ов
int tab3[5] = {123, 785, 6, 66, 345, 111}; // массив инициализирован при объявлении

Массив представляет таблицу из данных объявленного типа. Обращение к элементам массива происходит так:
tab1[0]= 23; // первому элементу массива задано значение 23
x = tab2[1]; // переменной x присвоено значение из 2го элемента массива
Нумерация элементов массива начинается с 0. Можно делать арифметические операции с элементами массивов.
tab1[3] = tab1[0] * tab1[2];

Re: Урок 55 - Энкодер.

Добавлено: 29 дек 2017, 23:59
Михаил_Я
Что такое массив, как его объявлять и к нему обращаться, я читал в книжках. Но как с его помощью связать две величины ( в данном случае - скорость вращения энкодера и задаваемую температуру) - я нигде не нашёл.

Re: Урок 55 - Энкодер.

Добавлено: 30 дек 2017, 22:25
Эдуард
Вы видели скетч программы, где реализован принцип, который я описываю?
http://mypractic-forum.ru/viewtopic.php?t=66

Re: Урок 55 - Энкодер.

Добавлено: 31 дек 2017, 05:13
Михаил_Я
Увы, пока для меня это слишком сложно - я ж только начинаю, к EEPROM ещё не подобрался...
Но свою задачу на данном этапе я решил - вместо LCD использовал LED, ведь Ваша библиотека работает в параллельном процессе.
Пока что не получается переключать дисплей кнопкой (заданная - фактическая температура), но при переключении в скетче всё работает.
Термостат - это промежуточная тема, я решил, что изучать программирование нужно поэтапно на КОНКРЕТНОЙ задаче. Планируемый конечный результат - контроллер для обжига керамики, программируемый на различные режимы с сохранением этих режимов в памяти.

Re: Урок 55 - Энкодер.

Добавлено: 02 янв 2018, 22:05
Михаил_Я
Здравствуйте, Эдуард!
С наступившим Новым годом Вас!
У меня к Вам очередной вопрос:
позволяет ли время вычисления х (тип int) из показанного выше участка кода разместить это вычисление в прерывании? Там уже производится чтение данных с энкодера и регенерация дисплея. Если период прерывания 2мс мал, поможет ли некоторое его увеличение?

Re: Урок 55 - Энкодер.

Добавлено: 03 янв 2018, 14:46
Эдуард
Здравствуйте! И вам удачного Нового года!
Смотря сколько вычислений. На форуме есть тема о времени выполнения команд и функций Ардуино http://mypractic-forum.ru/viewtopic.php?t=17.
Время 2 мс - достаточно большое. Думаю, все успеет выполниться. Если вычислений много, в большинстве случаев их можно перенести в основной цикл.
Моя библиотека для энкодера должна работать вместе с библиотекой LCD дисплея.
Если вам сильно надо, то я могу переслать программу терморегулятора для печки. Там используется LCD дисплей, а управление происходит кнопками библиотекой Button. Библиотека для кнопок ничем особенным не отличается от библиотеки для энкодера. Все работает.
Скетч вышлю при условии, что он не окажется в интернете. Просто я собираюсь написать урок на тему управления мощной нагрузкой. Если текст всплывет в интернете раньше, чем у меня, то поисковые системы будут считать мою публикацию плагиатом. Несколько слов о программе есть в конце этой темы http://mypractic-forum.ru/viewtopic.php?t=83.

Re: Урок 55 - Энкодер.

Добавлено: 03 янв 2018, 18:00
Михаил_Я
Здравствуйте, Эдуард!
За праздничные дни работа над скетчем весьма продвинулась.
Перенёс вычисление "х" в прерывание - всё получилось, даже не пришлось увеличивать период. Шаги энкодера считываются все, "х" вычисляется прекрасно. Но осталась другая проблема - из-за той же "delay" кнопку энкодера (используется для переключения отображения на дисплее установленной и фактической температур) приходилось держать нажатой время большее, чем "delay".
Удалось вообще отказаться от "delay" обходным манёвром. Ввёл дополнительную переменную "С" и счётчик прерываний. Теперь "С" каждую секунду приравнивается к "с" (фактическая температура). На дисплее отображается именно "С", значение которой в течении секунды неизменно.
Кроме этого написал, но пока не проверял в работе и не добавлял в основной скетч, ПИД-регулятор и регулятор мощности. ПИД мало отличается от Вашего (для элемента Пельтье), за исключением отсутствия отслеживания мощности нагревателя.
Судя по тому, что сказано в приведённой Вами переписке, к регулятору мощности мы с Вами подходим одинаково. Единственное - я предполагал поэкспериментировать с периодом ШИМ 1 - 60 сек и единицей - 10 мс, т.к. симистор может переключаться как при переходе от "+" к "-", так и наоборот.
Буду Вам очень благодарен, если вышлете Ваш вариант. Разумеется, я не буду его никуда выкладывать. Меня интересует, в первую очередь, именно терморегулятор.

Re: Урок 55 - Энкодер.

Добавлено: 03 янв 2018, 18:18
AlexCo
Проверял работу энкодера на примере вашего кода, и не совсем понял почему по тактильным ощущениям я чувствую два поворота, а по факту происходит один.

Re: Урок 55 - Энкодер.

Добавлено: 03 янв 2018, 19:29
Эдуард
Добрый вечер!
ШИМ, который используется в контроллере холодильника это аппаратный ШИМ, Для управления симистором он не подходит. Как вы реализуете период 1-5 сек. ШИМ надо делать программно. Единицу ШИМ лучше задать кратной 20 мс, чтобы нагрузка работала более симметрично относительно полуволн питающей сети. Скетч сейчас вышлю.

Re: Урок 55 - Энкодер.

Добавлено: 03 янв 2018, 20:47
Михаил_Я
Спасибо за скетч! Чуть позже буду разбираться.
ШИМ у меня, разумеется, программный. Сделал его, используя "millis". В коде жёстко задаётся период, а ПИД-регулятор формирует время паузы.
Не очень уверен насчёт большей симметрии при 20мс. Если управляющий импульс прийдёт в конце полуволны,то она будет практически потеряна, а если он закончится после прохождения через 0, то симистор будет открыт ещё одну полуволну. Хотя что лучше - покажет эксперимент. Думаю, что при такой медленной ШИМ ошибку (в любом из вариантов) вполне скомпенсирует ПИД-регулятор.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 01:26
Михаил_Я
Здравствуйте, Эдуард!
Пытался разбираться с Вашим скетчем. Большая часть для новичка - тёмный лес, но кое-что понял.
Вы отказались от дифференциальной составляющей - я предполагал и раньше, что в термосистеме проблем от неё больше, чем пользы.
Не очень ясно, что за печь с диапазоном от -55, но это не моя проблема.
Теперь вопросы по существу:
1. Каким образом происходит преобразование переменных? Например, если переменная А типа int или float больше 255, то при преобразовании в byte будет 255 или А - 255*n?
2. В строках 136 и 137 числа 0 и 100 - это % ШИМ или максимальная температура? Я имею в виду то, что если это температура, то ШИМ-регулирование начнётся только при отличии температуры от заданной около 100 градусов, а если температура, то её надо приводить к коэффициенту заполнения.
Очень надеюсь на разъяснения, я немного запутался.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 01:48
Эдуард
Здравствуйте!
До - 55 градусов работает измеритель. Печь от комнатной температуры до + 150 градусов. Насколько датчик позволяет.
1. При преобразовании типов надо следить за значением переменной, иначе результат может быть неверным. А в каком месте моей программы у вас появились сомнения по этому поводу?
2. В уроке 39 я пишу: "В любом регуляторе надо четко выделить, что мы регулируем и с помощью чего мы регулируем. Т.е. регулируемый параметр и регулирующий элемент."
Для регулятора температуры регулируемый параметр это температура в печке, а регулирующий элемент это программный ШИМ. regOut это программный ШИМ, который может принимать значения в диапазоне от 0 до 100.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 14:41
Михаил_Я
Эдуард, прошу прощения - увлёкся и показал часть Вашего кода. Сразу же поставил на удаление, но это не быстро.
Вот то же сообщение, но исправленное:

Это не сомнения, а непонимание.
Значение программной ШИМ получается из разности температур. В моём случае диапазон от 0 до 1200. Если в комнате +25, а установлена 1025, то
regTmpPr=1000*2. Интегральная составляющая сравнительно мала, пока отпустим её.
В этом случае, если regOut ограничить значением 100, снижение мощности начнётся при разности ок. 50 градусов, что явно мало. Правильно ли я думаю, что мне нужно сумму составляющих делить на 12 (1% от максимально возможной температуры). Тогда регулирование начнётся с ~50% от максимальной разницы температур.

И второй вопрос. Есть ли необходимость вводить в программу минимально возможную для датчика измеряемую температуру? В моём случае (термопара ХА + АЦП МАХ31855) она составляет -270 градусов.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 15:26
Михаил_Я
Кажется, ошибся. Сумму составляющих надо делить на 1% от ЗАДАННОЙ температуры.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 18:55
Эдуард
Здравствуйте!
Посмотрите в уроке 39 раздел "Ограничение интегратора". Ограничение должно происходить на уровне максимального ШИМ. В моей программе это 100.
Что касается коэффициентов регулятора, то их надо подбирать на практике. Естественно, ваши коэффициенты будут отличаться от моих.
Посмотрите в уроке 41 раздел "Выбор коэффициентов регулятора". Я привел в нем примеры реального влияния коэффициентов регулятора.
Может я чего-то не понял, но, если у вас максимальный ШИМ 100, то для того чтобы при разности температур 1000 был ШИМ 50% необходим пропорциональный коэффициент 0,05.
Почему вы пишите "регулирование начнется от максимальной разности температур". У вас аналоговый регулятор. Регулирование должно происходить при любой разнице температур.
Что касается измерения отрицательных температур, то необходимости в этом, конечно, нет. Я просто реализовал измеритель на весь диапазон датчика.

Re: Урок 55 - Энкодер.

Добавлено: 05 янв 2018, 23:49
Михаил_Я
В отношении ограничения интегратора и подбора коэффициентов всё ясно изначально.
Вероятно, я неточно выразился - мне нужно,чтоб ограничение мощности начиналось примерно с 50% от разницы между заданной и фактической (начальной) температурами. Если оно начинается раньше, то процесс нагрева замедляется, не сказываясь на точности - это из опыта, какое-то время назад я делал аналоговый термостат и провёл немало экспериментов.
Сейчас я пришёл к мысли, что коэффициенты составляющих ПИД (или ПИ)-регулятора ДОЛЖНЫ зависеть от заданной температуры.
В ТАУ обычно не рассматривается вариант, когда заданная температура отличается от максимально возможной заданной, поэтому коэффициенты фиксированы.
Например, если в Вашем варианте рассмотреть 2 случая:
1. Задана температура 120 град., начальная - 20. Ограничение мощности начнётся при фактической температуре 50 град. (50% от разницы), до этого момента мощность 100%.
2. Задана 50, начальная 20. Тогда (50-20)*2=60 - это мощность в начале процесса.
(Интегральную составляющую не учитываю по причине её малости (5%)).
А вот если коэффициенты (лучше - regOut) увязать с УСТАНОВЛЕННОЙ температурой, то картина меняется.
Чем ниже температура, тем меньше количество тепла,накопленного в нагревателе. Соответственно - меньше время остывания до температуры следующего включения (тем более, что изолирующие свойства теплоизолятора падают вместе с температурой). В итоге - скорость реакции системы увеличивается.
Эдуард, это только мысли. Если я неправ, то поправьте меня - я буду только благодарен за избавление от лишних экспериментов (потерь времени).

Re: Урок 55 - Энкодер.

Добавлено: 06 янв 2018, 00:04
Эдуард
ПИД регулятор не я придумал. Не думаю, что для реализации терморегулятора нужна адаптивная система.
Выбираете пропорциональный коэффициент эмпирически, исходя из того, какую мощность должен обеспечить нагреватель, чтобы поддерживать температуру заданной. С запасом, естественно. При большой разнице температуры нагреватель включается на полную мощность, затем мощность уменьшается.
Все остальное компенсирует интегральное звено.
Непонятно, почему вы в своих вычислениях пропорциональный коэффициент все время считаете равным 2. Думаю, он у вас совсем другим будет. Этот коэффициент и определит начальное состояние нагревателя.

Re: Урок 55 - Энкодер.

Добавлено: 06 янв 2018, 00:33
Михаил_Я
Понятно, что не Ваше изобретение. И с выбором коэффициента понятно, и с интегральным звеном.
Работать будет! Только вот скорость нагрева...
Насчёт коэффициента: "Например, если в ВАШЕМ варианте" - отсюда и 2.
Надеюсь в течении каникул провести реальные испытания - тогда всё встанет на свои места.