Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Плавное ускорение и торможение
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
gembird
Здравствуйте
имеется привод с ШД, скорость вращения управляется переменным val, значение которого меняется
от 0 до 1023. При val=0 привод остановлен. (val это как бы педаль газа)
нужно осуществить плавное ускорение и плавный останов привода а так же сглаживать движение
когда val будет резко менятся скачкообразно.
подскажите пожалуйста как этот алгоритм реализовать ,
через какую функцию пропустить val прежде чем подать на двигатель ?
спасибо.

P.S. машинные ресурсы для расчетов не велики (МК ATMEL AVR ATmega)
DVF
Да, ну, просто увеличивайте/уменьшайте скорость вращения двигателя с выбранной для себя скоростью (плавной) увеличения/уменьшения оборотов, посматривая на переменную val - увеличивая плавно скорость вращения достигли значения val и остановили наращивание, а "увидели" что переменная val меньше текущей скорости, начинайте также со своей скоростью снижать обороты.
Iptash
Цитата(gembird @ Apr 21 2012, 18:49) *
...
через какую функцию пропустить val прежде чем подать на двигатель ?
...

Через ПИ функцию.
Код
    Тело прерывания: допустим время прерывания 1мсек
   PI = PI + val;               // чем больше входное воздействие val, тем больше будет рассогласование
   err = PI - count;           // ошибка рассогласования
   count = count + err;     // чем больше ошибка, тем быстрее заполняется счетчик контура расогласования
   if(count2 > 0) {
     count2 = count2 - err; //чем больше рассогласование, тем быстрее уменьшится count2
     impuls = 0;                //чем быстрее уменьшается count2, тем быстрее шагает ШД
     }
   else {
     count2 = 100;            // Это как бы коэфициент времени интеграции.
     impuls = 1;                // по этому сигналу происходит один шаг ШД
   }

Это допустим для положительного движения.
Здесь я показал сам принцип только(как мне видится), нужно писать программу эксперементировать и симулировать.
Вообще управлением движками и т.п., лучше управлять с помощью CPLD или FPGA. А микропроцессоры должны заниматься различными данными и последовательными вычислениями (это мое мнение).
gembird
Цитата(DVF @ Apr 21 2012, 21:11) *
Да, ну, просто увеличивайте/уменьшайте скорость вращения двигателя с выбранной для себя скоростью

просто линейное увеличение и понижение пробовал, это не катит,
мне нужно что то вроде сигмоида

Цитата(Iptash @ Apr 21 2012, 23:10) *
Через ПИ функцию.

Очень интересно это надо обязательно пробовать.

но в моем случае ШД шагает от прерываний таймера
а частота прерываний задается исходя из значения val.


Нажмите для просмотра прикрепленного файла
нужно что то вроде этого (может немного криво нарисовал):
красная линия педаль газа
зеленая линия скорость двигателя
Alex11
Так как Вы нарисовали, можно посчитать только задним числом. У Вас скорость начинает меняться раньше внешнего воздействия. В реал тайм это невозможно. Вы еще не знаете, что произойдет дальше.
gembird
Да знаю немного неправильно нарисовал но в общем суть понятно не так ли.
главное это момент старта и останова когда педаль резко нажимают и когда
резко отпускают до нуля обратите внимание на график,, типа сигмоида
alexPec
Цитата
нужно что то вроде этого (может немного криво нарисовал):
красная линия педаль газа
зеленая линия скорость двигателя


PI скорее всего не прокатит - разве что с P - компонентом равным 0. Потому как если P не равно 0 то при появлении рассогласования выходное воздействие скачком поменяется, а это как я понял не айс.

Странно что никто до сих пор не предложил - а если через простой ФНЧ первого-второго порядка пропустить входное воздействие? Подозреваю, что частота среза фильтра должна быть связана с инерцией ротора двигателя для оптимального регулирования (самого быстрого и с минимальным перерегулированием).
Impartial
Цитата(alexPec @ Apr 22 2012, 22:08) *
Странно что никто до сих пор не предложил - а если через простой ФНЧ первого-второго порядка пропустить входное воздействие? Подозреваю, что частота среза фильтра должна быть связана с инерцией ротора двигателя для оптимального регулирования (самого быстрого и с минимальным перерегулированием).

Спасибо за идею!
Tanya
Цитата(gembird @ Apr 21 2012, 18:49) *
через какую функцию пропустить val прежде чем подать на двигатель ?
спасибо.

Эту функцию можно определить только экспериментально, так как она зависит от механических деталей, которые приделаны к двигателю.
gembird
получилось sm.gif
по прерыванию от таймера с определенным интервалом делаю инкремент/декремент
скорости, а дельта инкремента беру из разниц текущей скорости и заданной скорости
деля на некое константное число (фактор акселерации)
таким образом чем ближе приближается текущая скорость к заданной тем медленнее он
ровняется с ним.
Может не супер пупер но практически в полне удовлетворяет.
Спасибо всем за помощь.
Tanya
Цитата(gembird @ Apr 23 2012, 23:04) *
по прерыванию от таймера с определенным интервалом делаю инкремент/декремент
скорости, а дельта инкремента беру из разниц текущей скорости и заданной скорости
деля на некое константное число (фактор акселерации)
таким образом чем ближе приближается текущая скорость к заданной тем медленнее он
ровняется с ним.

Может не супер пупер но практически в полне удовлетворяет.
Спасибо всем за помощь.

Это совсем не супер-пупер. Книжки не стали читать... Сочиняем все сами. Если бы это было управление не физическим объектом, обладающим моментом инерции, полюсами, обмотками, а какой-нибудь точкой на экране, вот тогда было бы супер.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.