Опубликовано 2026-03-29
При разработке инновационных продуктов самый большой страх заключается в том, что в случае замены основного управляющего чипа изначально хорошо отрегулированныйсервоприводперестанет вращаться. Многие друзья получили новую плату разработки STM32 и захотели переместить ее.сервоприводпрограмма, изначально использовавшаяся на других платах, но обнаружила, что она либо не отвечает, либо сильно трясется. На самом деле, если вы разъясните несколько ключевых моментов трансплантации, это совсем не сложно. Сегодня мы поговорим о том, как плавно «переместить»сервоприводпрограмма между различными моделями STM32.
Суть сервоуправления заключается в выдаче волны ШИМ с периодом около 20 мс и временем высокого уровня в диапазоне от 0,5 мс до 2,5 мс. Поэтому первым шагом при миграции кода является поиск на новой плате таймеров и каналов, способных генерировать ШИМ. Ваша исходная программа использовала CH1 из TIM2, но теперь вам, возможно, придется изменить его на CH2 из TIM3. Это соответствие должно быть четко подтверждено в паспорте чипа. На самом деле изменение — это всего лишь вопрос нескольких параметров. После изменения номера таймера и номера канала можно использовать большую часть кода.
После изменения конфигурации таймера не забудьте проверить тактовую частоту. Различные модели STM32 могут иметь разные источники синхронизации для системных часов и таймера. Например, исходная основная частота 72 МГц, используемая в серии F1, может стать 48 МГц при переключении на серию F0. В это время вам необходимо пересчитать коэффициент деления частоты ШИМ и перезагрузить значение, чтобы гарантировать, что конечный выходной период ШИМ по-прежнему составляет 20 мс. Проще говоря, два параметра ARR и PSC пересчитываются на основе тактовой частоты нового чипа, чтобы гарантировать, что сервопривод может получать сигналы, которые он распознает.
При выборе контактов не просто найдите GPIO и подключите его. Сначала вам следует найти контакты с функцией «», которые являются выходными контактами аппаратного ШИМ. Преимущество использования аппаратного ШИМ заключается в том, что он не занимает ресурсы процессора, импульсный выход очень стабилен, а сервопривод вращается плавно. Если вам придется использовать обычный GPIO для симуляции через функцию задержки, процессор будет исчерпан, а если программа станет немного сложнее, то время будет легко испорчено, и сервопривод обязательно будет трястись.
После выбора контакта в части инициализации программы вам необходимо установить режим работы GPIO на мультиплексированный двухтактный выход. Это все равно, что назначить этому контакту должностные обязанности и сказать ему: «Вы несете ответственность за вывод ШИМ-сигнала». Кроме того, если исходная плата имеет подтягивающий резистор, а новая — нет, вам необходимо подумать, следует ли включать внутреннее подтягивание в коде, чтобы гарантировать, что вывод имеет определенное состояние уровня в режиме ожидания, чтобы избежать помех сигнала.
У многих людей при расчете частоты болит голова. На самом деле есть простой способ. Цикл ШИМ, необходимый для сервопривода, составляет 50 Гц, что соответствует циклу 20 мс. Независимо от того, какой таймер вы используете, цель состоит в том, чтобы довести частоту до 50 Гц. Формула расчета проста: выходная частота таймера = системная тактовая частота / (PSC+1) / (ARR+1). Сначала вы устанавливаете PSC на удобное число, например 7200-1, а затем меняете значение ARR так, чтобы конечный результат был близок к 50 Гц.
Например, если системная частота составляет 72 МГц и вы установили PSC на 7200-1, то частота счета таймера станет 10 кГц. Чтобы выходная частота достигла 50 Гц, ARR необходимо установить на 200-1, чтобы подсчитывались каждые 200 чисел, что составляет 20 мс. Разные чипы имеют разные основные частоты, поэтому вы можете выполнить расчет в соответствии с этой идеей, чтобы гарантировать, что окончательные рассчитанные ARR и PSC являются целыми числами, а ARR не должен превышать максимальное значение счетчика таймера, чтобы программа работала без проблем.
Если вы хотите, чтобы одна плата управляла несколькими сервоприводами одновременно, это зависит от того, сколько каналов имеет таймер. Таймер обычно имеет 4 канала, каждый канал может независимо выводить ШИМ, а частота является общей. Таким образом, пока все ваши сервоприводы работают на частоте 50 Гц, вы можете использовать один таймер для управления четырьмя сервоприводами, что может сэкономить много ресурсов таймера. Вам нужно всего лишь настроить несколько каналов во время инициализации и соответственно установить их значения сравнения.
Если необходимо управлять более чем 4 сервоприводами, необходимо включить второй таймер. При пересадке можно написать код инициализации управления одним сервоприводом как функцию, вызывать ее столько раз, сколько необходимо для управления, и передавать в качестве параметров номер таймера и номер канала. Таким образом, код можно многократно использовать, и его будет легко поддерживать независимо от того, сколько сервоприводов будет добавлено в будущем. Помните, что регистр сравнения каждого канала независим, и вы можете управлять им отдельно при настройке рабочего цикла.
Программа прописана, но сервопривод не реагирует? Не волнуйтесь, начните с самого простого оборудования. С помощью мультиметра проверьте правильность подключения источника питания и заземления сервопривода. Сервопривод имеет высокие требования к току, поэтому необходимо использовать внешний источник питания. Не ждите, что напряжение 3,3 В на плате разработки сможет включиться. Если проблем с источником питания нет, используйте осциллограф или логический анализатор, чтобы проверить, есть ли выходной сигнал на выводах микросхемы, и проверить правильность периода и ширины импульса.
Если форма сигнала правильная, но сервопривод по-прежнему не вращается, возможно, проблема в логике кода. Вы можете сначала написать простейшую тестовую программу и выводить фиксированный высокий уровень в 1,5 мс, чтобы вернуть сервопривод в среднее положение. Если это можно включить, это означает, что с базовым драйвером нет проблем, а проблема заключается в вашей логике управления. Постепенно добавляйте функции, меняйте понемногу и используйте метод исключения, чтобы быстро найти проблему, что гораздо быстрее, чем догадываться самостоятельно.
Теперь, когда основная трансплантация завершена, мы можем проделать некоторые трюки. Например, если вы хотите, чтобы сервопривод поворачивался на определенный угол, вы можете написать функцию преобразования угла, которая будет отображать угол от 0 до 180 градусов на значение ширины импульса от 0,5 мс до 2,5 мс. Таким образом, вам не нужно запоминать эти сложные значения времени. Вы можете напрямую вызвать функцию и передать угол. Читабельность и переносимость кода значительно улучшатся, и другие поймут его с первого взгляда.
Другой пример: вы также можете добавить программную фильтрацию, чтобы избежать внезапных изменений управляющего сигнала, вызывающих «дрожь» сервопривода. В реальных проектах данные, отправляемые датчиком, неизбежно будут иметь джиттер. Если добавить в программу простой фильтр скользящего среднего, а затем отправить его на сервопривод, движение будет гораздо более плавным. Инкапсулируйте эти расширенные функции в независимые модули. При пересадке на другие проекты в следующий раз эти «накопления» можно будет использовать напрямую, и эффективность разработки увеличится вдвое.
На чем застрял ваш проект по трансплантации сервоприводов? Это потому, что конфигурация контактов не ясна, или расчет частоты всегда неправильный? Добро пожаловать, чтобы оставить сообщение в области комментариев, чтобы рассказать о своем опыте. Если вы считаете, что эта статья вам полезна, не забудьте поставить лайк и сохранить ее. Вы также можете поискать на официальном сайте нашей компании более практичные примеры и шаблоны кодов!
Время обновления: 29 марта 2026 г.
Свяжитесь со специалистом по продукции Kpower, чтобы порекомендовать подходящий двигатель или редуктор для вашего продукта.