Как управлять шаговым двигателем с помощью датчика абсолютного положения, имеющего полосу погрешности?
Я использую плату разработки Feather M4 express с установленными на ней двигателем постоянного тока + шаговым двигателем FeatherWing и Ethernet FeatherWing. Идея заключается в считывании целевой позиции с UDP от 0 до 360 градусов и управлении шаговым двигателем путем считывания текущих значений энкодера. Я использую эту библиотеку для чтения значений энкодера.
Энкодер установлен под углом 90 градусов к исходному положению двигателя. В настоящее время я могу считывать показания энкодера, но даже с фильтром скользящего среднего по SSI часто передаются неточные значения наряду с правильными. Поскольку значение targetPosition нестабильно, несмотря на фильтр скользящего среднего, шаговый двигатель продолжает вращаться, пока не достигнет заданного значения targetPosition (которое должно быть равно 0 или смещено на -90 градусов). Однако задание начального значения targetPosition = 10, похоже, приводит к стабильному положению после 2–4 полных оборотов.
Следующая проблема заключается в том, что когда я отправляю требуемый угол в UDP-сообщении, значение stepsToMove в функции moveToPosition(), похоже, верно, но шаговый двигатель просто не проходит необходимое количество шагов. Если currentPosition < targetPosition, в большинстве случаев шаговый двигатель просто продолжает движение, фактически блокируя микроконтроллер.
Я ищу улучшения в программном обеспечении, так как аппаратное обеспечение не может быть изменено.
- Как можно улучшить значения фильтра, чтобы получить наиболее точные значения кодировщика?
- Как добавить это смещение в функцию
rotateToIntialPosition()и динамически перемещать ее вместе с этим смещением во время операции в функцииmoveToPosition()? - Поскольку ожидается, что энкодер будет иметь диапазон ошибок, как я могу включить +/- 5 градусов в контур управления в функции
moveToPosition()?
@dreamcoder, 👍0
Обсуждение1 ответ
Возможно, это не единственная ваша проблема, но у вас есть проблема с
Функция getFilteredEncoderAngle(), которая... совершенно неверна. Представьте себе,
Ваш двигатель находится точно под углом 0, но из-за шума вы получаете половину
показания показывают 0,5°, а другая половина — 359,5°. Это довольно
Небольшой шум, с амплитудой всего 0,5°. Среднее значение, конечно,
должно быть равно нулю, но ваш фильтр сообщит 180°: это было бы невозможно
чтобы получить результат, который еще более неверен.
Я ожидаю, что это будет сеять хаос в вашей программе каждый раз, когда вы пересекаете границу Нулевой угол. Ваш мотор может плавно пересечь его: 358° → 359° → 0° → 1°… но ваш фильтр будет считать, что двигатель внезапно начал вращаться очень быстро в противоположном направлении.
Вам действительно нужен сглаживающий фильтр, который учитывает углы. Предполагается, что он будет охватывать 360°. Я написал ответ несколько лет назад. показаны три разных способа реализации сглаживания с учетом переноса фильтр. Роб Тилларт применил мой третий подход (мой любимый) и Реализовано в библиотеке Arduino runningAngle. Обратите внимание, что это не является «простым» скользящим средним, а скорее экспоненциально взвешенным скользящее среднее значение.
Спасибо за предложение. Мне нужно только считывать абсолютное положение с энкодера и перемещать степпер в нужное положение. Реализация библиотеки runningAngle всё ещё вызывает трудности. Я понимаю, что функция отфильтрованного значения — плохая идея. Я просто хочу использовать функцию moveToPosition(target_steps). Что бы вы посоветовали?, @dreamcoder
@dreamcoder: Я не понимаю вашего вопроса. Вам не нужно реализовывать библиотеку runningAngle, так как она уже реализована Робом Тиллартом. Вы можете установить её из менеджера библиотек Arduino. Чтобы узнать, как её использовать, ознакомьтесь с разделом [Использование] (https://github.com/RobTillaart/runningAngle#usage) в файле README. Вы также можете посмотреть пример скетча, который также называется «runningAngle»., @Edgar Bonet
Я использовал библиотеку runningAngle в своём скетче, но это лишь незначительно улучшило ситуацию. Энкодер положения всё ещё считывает половину значений неверно. Из-за чего управление шаговым двигателем сильно отклоняется. Есть ли способ отфильтровать неверные значения и использовать только допустимые?, @dreamcoder
- Шаговый двигатель TMC2208 не меняет скорость вращения линейно
- Шаговый двигатель не работает с платой A4988
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Шаговый двигатель работает медленно при чтении с датчика MPU 6050
- Как позволить шаговому двигателю вращаться постоянно?
- Как изменить направление шагового двигателя с помощью библиотеки AccelStepper?
- Как правильно использовать микрошаговый драйвер с шаговым двигателем более низкого напряжения
- Неодновременное управление несколькими шаговыми двигателями
также опубликовано по адресу https://electronics.stackexchange.com/questions/719639/how-to-read-position-sensor-values-more-accurately-for-stpper-control, @jsotola