ЕСТЬ ИДЕЯ Стабилизация оборотов шпинделя

Earnest

ПОЧТИ ПРОФИ
ПРОВЕРЕННЫЙ
Регистрация
10.02.2025
Сообщения
255
Реакции
333
Баллы
88
Возраст
68
Город
Донецк
Имя
Алексей
Отчество
Леонидович
Станок
сам склепал
Плата
Самоделка, Camxtool v35
Прошивка
1.1h
Стабилизация оборотов шпинделя

Посмотрел я это видео и мне очень понравилась идея. Попробую сделать что-то подобное. Тем более, что с ПИД-регуляторами я когда-то возился, на Ассемблере, для STM8. Только для измерений останавливать ШИМ я не буду, буду мерять в паузах между импульсами. Но это значит что стопроцентную скорость, когда импульсы сливаются, устанавливать нельзя – обязательно должны быть паузы. Поэтому для сохранения оборотов напряжение питания надо будет приподнять, скажем, до 36 Вольт. А регулировку ШИМ-а ограничить значениями 0..127.

Первым делом, для наладки будущего девайса, сделал простенький тахометр. Использовал древний контроллер AT90S1200, которые у меня валяются ещё с прошлого века.

tachometer.png

tacho_3D.pngtacho_pcb.pngtacho_pcb.jpg

Результат измерений вывожу через UART на внешний дисплей. У меня для этого служит универсальная приблуда, но, в принципе, можно подключить к PC и запустить там какой-либо терминал. Разумеется подключать надо через преобразователь TTL-RS232.

На патрон шпинделя нанёс белой краской полоску, шириной миллиметров пять. Светодиод светит на полоску, фототранзистор на неё смотрит, контроллер считает импульсы и пересчитывает период в обороты в минуту.

50 секунд видео работающего тахометра.

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

Завтра напишу про собственно регулятор.
 
Ну, тахометр, сам по себе можно и на Тиньке13 сделать, но разговор то про регулятор с ПИ. Там и задание и опорник и еще вращение и все связано
 
Ну, тахометр, сам по себе можно и на Тиньке13 сделать, но разговор то про регулятор с ПИ.
Ну, тринадцатая тайни помощнее будет чем 1200-й контроллер. У него, даже SRAM нет от слова совсем. Только регистры. Так что вы правы, тахометр можно и на ней. А про ПИД -- завтра, пока ещё не дописал.
 
  • Последнее редактирование:
Последнее редактирование:
Про железо

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

Clipboard_10-21-2025_01.jpg

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

ШИМит у меня восьмибитный таймер, по прерыванию которого я сначала измеряю напряжение питания двигателя, (его всё равно когда измерять, почему бы не сейчас?) затем запускаю второй таймер, по прерыванию которого измеряю ЭДС на обмотке двигателя, незадолго до начала следующего импульса ШИМ. Разность этих измерений и даст значение напряжения самоиндукции, пропорциональное скорости.

pwm_times.png

Измерения накапливаю в массиве на 16 отсчётов, из которого беру среднее значение. Но даже при этом результат прыгает на несколько единиц. Для устранения этого, сделал аппаратное накопление. На момент измерения подключаю интегрирующий конденсатор к измеряемой цепи. На моей схеме, что ниже, это C2.

Clipboard_10-25-2025_01.png

Синий луч – напряжение на входе АЦП, жёлтый показывает моменты измерения. Маленький пик с плоской вершинкой на синей линии это результат подключения накопительного конденсатора. Это на этой картинке он выглядит пик, на самом деле линия качается и на конденсаторе то пик, то провал, но уровень его вершинки постоянен. На мохнатость линий не обращайте внимание, вот такой хреновый у меня USB-осциллограф.

ПИД-макет.png

Выше схема моего макета. Работает. На видео я на малых оборотах пытаюсь остановить вращение, а шпиндель сопротивляется. Видно как растёт управляющее воздействие (его показывает цифровой индикатор). Да и слышно это по звуку моторчика. Без ПИД-а на этой скорости шпиндель останавливался просто от касания пальцем. Да, после отпускания есть выбег и скорость на некоторое время немного повышается. Надо точнее подбирать коэффициенты. Буду заниматься когда перенесу на плату. Посмотрел сейчас что наснимал. Да, оператор из меня так себе…

Завтра напишу как всё это работает.
 
ПИД это очень просто

Про то, что такое Пропорционально-Интегрально-Дифференциальное управление можно почитать где угодно, хотя бы в Википедии. Но пусть нас не пугают страшные интегралы в формуле, считать будем дискретным численным методом. Т.е. каждые N миллисекунд (у меня N=10) будем вычислять функцию:

u(t) = P (t) + I (t) + D (t);
P (t) = Kp * e (t);
I (t) = I (t — 1) + Ki * e (t);
D (t) = Kd * {e (t) — e (t — 1)}.


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

Как видите никакой сложной математики. Сложение, вычитание и умножение. Если пересказать простыми словами – сначала считаем невязку (разность между нужным нам значением скорости шпинделя и текущим), затем умножаем на пропорциональный коэффициент и прибавляем к прошлому значению управляющего воздействия. Так как невязка может быть и отрицательной, сложение может как увеличивать, так и уменьшать результат. Это мы посчитали пропорциональную составляющую. В принципе, этим можно было бы и ограничиться – регулировать оно будет, но ооооочень медленно. И скорость никогда не достигнет заданного значения, так как невязка тут не может быть нулевой, иначе вращение прекратится.

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

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

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

Затем производим нормализацию управляющего воздействия (приводим к значению от 0 до 127) и забрасываем в регистр сравнения ШИМ. Как видите, ничего сложного.

Я даже не использую арифметику с плавающей точкой. Просто, по-крестьянски, беру коэффициенты, умноженные на 65536 (2^16), а потом, после операции умножения, отбрасываю два младших байта. Это эквивалентно делению на 65536. Зато вычисление функции ПИД у меня занимает всего 21 мкс при тактовой 16 МГц.

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

Макетировал я всё это на Ардуинке уно, освободившейся после переноса grbl-контроллера на плату. Я, вроде, говорил что люблю использовать платы Arduino при макетировании прототипов. Но в конечном изделии ATMega328 сильно избыточна. 99 процентов времени программа крутится в холостом цикле, занимаясь только регенерацией дисплея. И память программ занята всего на 3 процента. При таких смешных требованиях подойдёт любая AVR-ка, лишь бы у неё было два таймера, АЦП и, желательно, аппаратное умножение. Как вариант, присмотрел ATtiny412. Маленькая, восьминогая, и подходит по всем параметрам. Правда, программируется через UPDI одним проводом. Но это даже хорошо, будет повод разобраться с этим интерфейсом.

Заказал парочку в Китае, как приедут, будет продолжение.

Извините, сегодня "многа букаф" и ни одной картинки. В следующем посте исправлюсь...
 
Ура, заработало!

Да, изрядно поизвращавшись с измерением ЭДС самоиндукции в паузах ШИМ, сейчас, с учётом полученного опыта, я бы не стал с этим возиться, а поставил какой-нибудь счётчик оборотов. Или оптопару, или датчик холла. Но, что сделано, то сделано.

Заказанные мною Тайни 412 шли из Китая больше месяца, за который я, как тот Полесов, слегка охладел к проекту. Но заставил себя закончить, тем более что на макете всё работало. Но тут начались грабли.

Грабли номер 1. Как оказалось, эти новые “Tiny 1-series” вовсе не старые добрые “тиньки”. Микрочип изрядно потоптался по простым и понятным AVR-ам в сторону усложнения и запутывания. Набор команд у них стал такой же как у Mega, тут вопросов нет, вся математика и логика заработала без корректировки, а вот нижний уровень, таймеры, UART и даже порты, полностью переделаны. И адреса, и мнемоники и логика работы. Особенно у таймеров. Тут углубляться не буду, желающие могут полистать даташит объёмом почти шестьсот страниц.

Кстати, с UPDI разобраться оказалось не просто, а очень просто. Пять минут гугления и я надыбал программатор JTAG2UPDI. Залил в Ардуинку готовый HEX, подключил к контроллеру одним проводом и всё пошло. Правда пришлось после заливки прошивки снять конденсатор, который соединяет RESET с DTR. Но ничего, как снял, так и поставлю, когда надо будет. Свежий avrdude понимает тайни серии 1, с этим проблем не было, а вот с фьюзами пришлось разбираться. Микрочип и сюда запустил свои грязные лапы. А фьюз-калькулятор этих камней не знает.

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

А вот на Tiny412 – фиг вам. Измерительная “полочка” почему-то оказывалась значительно ниже чем должна была быть. И что самое печальное – я не понимал причину. И не понимал недели две, пока наконец не дошло. Предполагаю, что у новой Тайни появился защитный диод на выходе (катодом вверх), и в момент отрицательного выброса на конденсаторе, последний разряжается через этот диод.

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

ШИМ-ит у меня IRFZ44N, по той же самой причине – потому что он у меня был. А вот управляющий им оптрон я выбросил, уж очень он валил фронты. А ведь всем известно, чем меньше время переключения ключа, тем меньше он греется. Пришлось изобретать драйвер для управления транзистором, так как ёмкость затвора у него преизрядная. Обошёлся двумя транзисторами и диодом. Нижний транзистор через диод разряжает затвор, верхний – заряжает. Так и работает.

Выбросил вторую линию измерения напряжения. Напряжение питания измеряю тем же делителем что и ЭДС самоиндукции, только в другой момент времени, сразу после спада импульса ШИМ.

pic52.png

Ну, а остальное, думаю, понятно. Далее схема, печатка.

ПИД-схема.png

pcb2_top.png

Печатная плата односторонняя, и так как схема очень простая, получилось развести без перемычек. Размер 80x30. Ширина дорожек в основном 0.5мм, промежуток – 0.4мм. Фрезеровалась гравером 0.4 с заглублением 50мкм. Честно говоря, фактически гравер имел ширину 0,3 но добавилось биение моего шпинделя (около десятки) и получилось то что надо.

плата.jpg

Продолжу завтра.
 
Сверху Снизу