Управление шаговым двигателем
- Войдите на сайт для отправки комментариев
Пт, 19/07/2013 - 14:52
Управляю шаговиком с помощью трёх кнопок (лево, стоп, право) , библиотека AccelStepper. Проблем нет. Ввёл в пограмму lcd и меню для изменения параметров движения и сразу возникли тормоза - скорость упала в разы. Как то можно решить подобную проблему? Может вывести дисплей и меню из loop в отдельную функцию и потом вызывать?
Как то можно решить подобную проблему?
Можно, но только как-то и никак по-другому.
Может вывести дисплей и меню из loop в отдельную функцию и потом вызывать?
Да может, например, послезавтра вызвать, тогда точно до послезавтра тормозов не будет и скорость у двигателя нормальная будет.
Вы вроде не первый день на форуме...
Вы вроде не первый день на форуме...
maksim, я не программист и просто не знаю куда рыть дальше. Вот и прошу подсказки. Что lcd 16x2 тормозит шаговый двигатель я прочитал. Примеров "борьбы" с этим не нашёл.
Я к тому что здесь по прежнему нет экстрасенсов и без кода обсуждать нечего.
С таким кодом крутится шустро
Теперь тормоза
Что за переменные valM, valSPEED, valACCEL ??? код весь покажите.
valM режим микрошага- ещё не реализовал.
valSPEED и valACCEL скорость и ускорение шагового двигателя , будут регулироваться в меню ( в процессе разработки).
Тогда выводите данные на дисплей только при их изменении
Спасибо. Сейчас попробую.
А как тогда работать с меню?
Не знаю, не вижу никакого меню.
Код выводит на дисплей всю нужную мне информацию, но тормозит двигатель
Попробовал во время вращения мотора вызывать показания на дисплей с помощью функций. Работает и не тормозит мотор. А вот как теперь из menuStop() перейти в меню для установки параметров двигателя и потом вернуться в menuStop()? Пока не получается
Не проще ли купить готовый драйвер шаговика, а ардуине дать делать всю остальную работу
Я же вам уже показывал как это делается - выводите на дисплей только тогда когда есть изменения, плюс ко всему вы так еще и ЕЕПРОМ запорите очень быстро.
Не проще ли купить готовый драйвер шаговика, а ардуине дать делать всю остальную работу
Так у меня готовый драйвер и ардуина, которая делает всю остальную работу.
Спасибо maksim. Всё отлично, только при включении пустой экран до нажатия кнопок - как то непривычно.
static long sumPrev = 1431655765; дисплей пустой.
static long sumPrev;
sumPrev = 1431655765; дисплей высвечивает меню A=5 и тормоза
Засуньте все "меню" по фунциям и вызовите меню А в сетапе.
Веселье продолжается.
Всё меню в функциях - при изменении valSPEED и valACCEL визуально на дисплее значения не меняются, но в память записываются и считываются изменённые.
Попробовал оставить часть кода, где происходит изменение скорости и ускорения A=10 и A=15 как было раннее - теперь визуально все хорошо, но при сохранении параметров не выходит в menuStop().
Нестал создавать новую тему - спрошу в этой , если надо перенесу.
Имеем:
Cтандартную ШИМ с дуни " A " и естественно при увиличении скважности импульса он увеличивается по направлении стрелки " + "
Возникла необходимость управлять двигателем постоянного тока через H-мост на полевиках и одно из условий чтобы двигатель не вращался - но при этом стоял в возбуждении для сопротивления вращения его сторонними силами .
И для этого надо на него подавать сразу две ШИМ прямой и обратной полярности - ну и естественно надо чтобы их импульсы непересикались.
Отсюда вопрос:
Как сделать сдвиг ШИМ " B "на одном и более выводах дуни относительно линии " S " и соответственно нарастание импульса ШИМ нужно в обратную сторону от стандартного как показано на стрелке " - "
Не знаю что вы там пытались сделать, но я имел ввиду это:
Плюс ко всему получилось свернуть все отображение меню всего в две функции.
Нестал создавать новую тему - спрошу в этой , если надо перенесу.
Спасимо maksim - прочитал всю тему по вашей ссылке - но вопрос не отпал.
Мотивировал вопрос именно здесь по тому , что именно работу шагового двигателя мне нужно имитировать на моем двигателе ( ход якоря 100 !!! градусов всего ) паральлельно которому стоит резистор для обратной связи , да н-мосты похожи , но в моем случае на один мост подаются именно два ШИМ ( сдвинутые по переуду ) минимальной скважности одновременно для удержание якоря в том или ином положении и при увеличении одного из ШИМ происходит поворот этого якоря на 10-ки градусов всего в одну или другую сторону в зависимости от того какой ШИМ используется.
На аппаратном уровне буду тринироваться позже - двигатель огромный , токи до 40А , пока хочу на програмном получить то что описывал в посте выше.
Есть возможность управления ШИМ как показано на диограме " В " в дуне или нет ?
Есть, в самом простом случае это можно реализовать программно. Не совсем ясно что вы хотите реализовать...
Каждый из выводов управляет одной половиной Н-моста. Когда на одном из выводов лог.1, а на втором лог.0 двигатель крутится в одну сторону и когда наоборот - в другую. Когда на обоих выводах одинаковые логические уровни, то двигатель не крутится. Так?
И вы хотите реализовать что-то типа микрошага как у шаговых двигателей?
Ну логические нули и еденицы - это не решение этой задачи.( Поэтому я к вам и обратился )
Каждый из двух-ШИМ 1, и ШИМ 2 управляет естественно своей половинкой моста , используя ШИМ 1 и минимальный переид импульса мы заставляем крутится двигатель в одну сторону , а если подать такиеже импульсы в обратной полярности и сдвинуть их чтобы они невстретелись - то двигатель встанет и увеличивая Шим до 127 на каждом из ШИМ он так и будет стоять и при этом механическое усилие на его скручивание тоже будет меняться в зависимости от периуда ШИМ , так как параллельно валу стоит резистор мы естественно отслеживаем его положение и если механически применить силу к валу и чуть повернув его то дуня увеличивая тот или иной ШИМ - ставит его наместо и опять удерживает!
Так до ШИМ 127 мы можем упралять сдвинув один ШИМ относительно другого на 1/2 периуда далее они пересекуться и КЗ в H-мосте , а если ШИМ 2 сдвинуть на 2/255 назад и инвертировать наростание импульса во временном периуде как в первом моем посте то в нашем распоряжении 253 градации в каждое из направлений.
Вот так мне надо.
Только смог вернуться к теме. Спасибо maksim, ваш пример отлично работает.
Теперь двигаюсь дальше - хочу добавить новые переменные. Попробовал по подобию
Теперь никакие параметры не меняются и нет выхода из меню в MenuDir(' ')
Доброго времени суток !
2vvadim: у меня тоже были проблеммы с заиканием двигателя при использовании стандартной библиотеки с lcd1602
по этому я написал свою библиотеку, которая использует паузы только на этапе инициализации. В процессе работы работает по прерыванию не занимая процессорного времени:https://github.com/Void1509/lcdLib1602
очень простая, но есть несколько НО. Буфер строки ограничен 48 символами, по этому за один раз больше лучше не выводить(лишнии будут игнорироваться). Спецфункций (установка, отображение курсора и т.д.) я не делал, вместо этого сделал управляющие последовательности чарез 0x1B(27). К примеру lcdChr(0x1b);lcdChr(0x85); установит курсор в 5 позицию верхней строки, а lcdChr(0x1b);lcdChr(0xc5); в 5 позицию нижней строки. Коды управления можно почитать в даташит на контролер.
2sp34: Вам необходимо настроить таймер (к примеру 2) в режим fastPWM и настроить выходы oc2a в неинверсный, а oc2b в инверсный режимы. Таким образом длина импульса 1 будет в регистре ocr2a, а содержимое регистра ocr2b будет 255 - (длина импульса 2). Оверфлоу таймера - точка S. Если возникнут проблемы распишу подробней, но недолжны - даташит очень подробный.
sva1509, спасибо за участие. На досуге я обязательно попробую разобраться с вашей библиотекой, хотя без примеров такому , ну скажем, очень слабенькому программисту как я будет не просто, но интересно.
Сейчас есть пример от maksim, который работает. Теперь нужно ввести дополнительные переменные и добавить потом 2 кнопки. Думаю так будет проще.
С дополнительными переменными разобрался. Теперь добавлю новые кнопки с новыми функциями.
maksim, не могли бы Вы мне помочь. Мне очень нужен ваш код, но я пока новичок и мало что понимаю. Я попыталась использовать код, но он у меня не компилируется. До этого я нашла библиотеку AccelStepper, скачала и вроде бы она подсвечивается. а при компилляции пишет ошибку на строчке stepper.setMaxSpeed(1000). Ошибка звучит так: "stepper" was not declared in this scope. Не могли бы Вы мне подсказать причину такой ошибки. Вы меня очень бы выручили!!!
Хотя я и не maksim. но и он вам напишет - покажите код и напишите в чём проблема.
Ну и перед написанием вопроса было бы неплохо внимательно почить библу и поиграться с примерами.
vvadim, я взяла код из 20 сообщения. Он приведен неполностью?
а насчет примеров - они у меня также не работают, тоже ошибки появляются.
Видимо я как-то неправильно библиотеку подключаю
и еще вопрос, если можно! подойдет ли этот код, если двигатель подключен через микросхему ULN2003
Код там естественно не весь, поэтому и не компилируется
Если у вас с примерами из библиотеки проблема, то и ничего не выйдет. Установите правильно библиотеку и примеры должны все работать. Скачайте последнюю версию AccslStepper 1.38
maksim, спасибо большое!
а Вы не могли бы мне подсказать, у меня такая же задача, я попробовала соединить два кода для lcd и stepper motor, но естественно не работает, как мне надо :) приведу код
и загвоздка в том, что когда я добавляю кнопку вверх, то у меня она работает как кнопка вправо. кнопку вниз я еще не добавляла пока. даже только когда у меня запрограммированы только 2 кнопки правая и левая, верхняя у меня все равно работает как правая, хотя я её не программировала. с чем это может быть связано?
Как у вас подключены кнопки?
lcd сверху вставлена на платформу MEGA 2560
наверно стоит уточнить, что пример просто для lcd у меня работает, нажатие каждой кнопки выводит нужное сообщение на экране
я на картинке пометила, какие входы-выходы задействованы
Данный код предназначен для аналоговой клавиатуры, подключенной к одному аналоговому выводу:
Если вы подключаете каждую кнопку к своему выводу, то необходимо пользоваться функцией digitalRead() для каждой кнопки.
И вы так и не описали как у вас подключены кнопки, а аналоговых входов указали 6, а кнопок всего 5.
maksim, спасибо за разъяснения! а как мне подключить клавиатуру к одному аналоговому выводу? или это невозможно?
В этом есть смысл если она (клавиатура) у вас уже есть всборе, иначе логичнее и проще подключать на каждый вывод свою кнопку.
Подключаете кнопки с А0 по А4.
maksim, клавиатура у меня на lcd keypad shild, и кажется уже в сборе. вот такая
а остальной код прежний останется?
maksim, неожиданно работает. теперь начального сообщения нет, а работает так, как если бы была нажата правая кнопка. остальные кнопки вообще не работают
Ну так потому что у вас и есть аналоговая клавиатура.
maksim, я не знаю, что сказать. одни восторги! спасибо большое Вам за помощь. теперь моя кандидатская продвинулась еще дальше, благодаря Вам :)
maksim, я не знаю, что сказать. одни восторги! спасибо большое Вам за помощь. теперь моя кандидатская продвинулась еще дальше, благодаря Вам :)
надеюсь, что юзер форума http://arduino.ru/ maksim займёт засслуженное место в списке соавторов какдитатской.
maksim, у меня еще один вопрос возник, надеюсь, что последний. как заставить двигатель вращаться назад? я почему-то думала, что достаточно поставить минус перед числом в скобках у функции stepper.step(), но это не сработало.