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

Обсуждение и вопросы по урокам Ардуино
Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

Урок 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". Убрал добавленные строчки - результат тот же.
Подскажите, пожалуйста - в чём может быть причина? Энкодер планирую использовать в одном из проектов, и зависимость шага переключения от скорости вращения вала меня очень прельщает.


Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 23 дек 2017, 00:17

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 23 дек 2017, 00:18

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 29 дек 2017, 14:35

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 29 дек 2017, 19:44

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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 - аналогично). А вычисления х занимают много времени.
Если можно - объясните принцип работы с массивами, я не имею представления, как их использовать.

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 29 дек 2017, 23:01

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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];

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 29 дек 2017, 23:59

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 30 дек 2017, 22:25

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 31 дек 2017, 05:13

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 02 янв 2018, 22:05

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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.

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 03 янв 2018, 18:00

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

Аватара пользователя
AlexCo
Сообщения: 18
Зарегистрирован: 01 мар 2017, 21:34

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

Сообщение AlexCo » 03 янв 2018, 18:18

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 03 янв 2018, 19:29

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 03 янв 2018, 20:47

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 05 янв 2018, 01:26

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 05 янв 2018, 01:48

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 05 янв 2018, 14:41

Эдуард, прошу прощения - увлёкся и показал часть Вашего кода. Сразу же поставил на удаление, но это не быстро.
Вот то же сообщение, но исправленное:

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

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 05 янв 2018, 15:26

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 05 янв 2018, 18:55

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 05 янв 2018, 23:49

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

Эдуард
Администратор
Сообщения: 366
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 06 янв 2018, 00:04

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

Михаил_Я
Сообщения: 36
Зарегистрирован: 13 дек 2017, 23:18

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

Сообщение Михаил_Я » 06 янв 2018, 00:33

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


Вернуться в «Уроки Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей