Сервопривод отвечает сервотестеру, а не микроконтроллеру. Сигналы выглядят одинаково


8

У меня есть сервопривод TowerPro MG90D ( ссылка производителя ) ( ссылка базы данных ).
Он имеет диапазон 180 градусов (не непрерывный).

TowerPro MG90D

Это отлично отвечает моему серво-тестеру:
Серво тестер

Соблюдайте следующий 7% рабочий цикл (около 90 градусов) на тестере:

тестер сервопривода

тестер сервопривода

Серво отвечает нормально.


Однако, когда я использую servo.write()с моим клоном Arduino Mega 2560, сервопривод не реагирует ни на какие выходные данные угла. У меня есть несколько других сервоприводов, которые прекрасно работают с тем же кодом на тех же выводах.

Соблюдайте следующий 7% рабочий цикл на Arduino с servo.write(90):

сфера arduino сервопривод 90deg

Нет ответа Сервопривод "хромает"; он не занимает какую-либо позицию.


Пока я писал этот вопрос, я думал о попытке servo.writeMicroseconds().

Вот servo.writeMicroseconds(1450):

сфера arduino сервопривод 1450мс

Серво отвечает!

Вот servo.writeMicroseconds(1472)(рабочий), который имеет те же временные интервалы, что и предыдущий нерабочий servo.write(90)!

сфера arduino сервопривод 1472мс

servo.writeMicroseconds(1550) (за работой):

сфера arduino сервопривод 1550мс


В чем разница?
Сервопривод работал при 49,5 Гц, а servo.write()при 49,9 Гц выходил из строя. Я задавался вопросом, имеет ли значение частота 0,4 Гц, но потом я вижу, что она servo.writeMicroseconds()работает и на частоте 49,9 Гц.

В приведенных выше области видимости захватов, можно видеть , что как servo.write(90)и servo.writeMicroseconds(1472)имеют те же временные интервалы:
 1,474,560ns HIGH
18,544,640ns LOW

Сигналы так похожи ... Что может заставить servo.write()не работать?

Мой код настолько прост, насколько это возможно:

#include <Servo.h>
Servo serv1;

void setup() {
  serv1.attach(3); // Pin 3
}

void loop() {
  serv1.write(90); // No response
  delay(3000);

  serv1.writeMicroseconds(1472); // Works
  delay(3000);

  serv1.write(0); // No response
  delay(3000);

  serv1.writeMicroseconds(1800); // Works
  delay(3000);
}

схематический

смоделировать эту схему - схема, созданная с использованием CircuitLab


Я попробовал и настольный линейный источник питания, и я также попытался использовать понижающий преобразователь для понижения с 9В.
Борт

1
Вы уверены, что у вас есть устойчивая волна в течение полных 3 секунд, когда вы используете write? У сервопривода нет никаких причин не работать, так что я бы поставил под сомнение ваши сигналы.
Дмитрий Григорьев

1
@ Борт Тогда мне трудно поверить в твою историю.
Дмитрий Григорьев

2
@ BigHomie: сигналы идентичны, насколько идут изображения области. Что-то происходит, кроме сигнала. Плохое состояние - это то, что может вызвать разные реакции на номинально идентичные сигналы.
JRE

2
Если возможно, запишите два следа прицела на сигнальной линии сервопривода с подключенным сервоприводом . Одна трассировка только с serv1.write () и одна трасса только с serv1.writeMicroseconds (). Опубликуйте оба следа. Для дополнительного очарования добавьте третий след от вашего тестера с подключенным сервоприводом .
neonzeon

Ответы:


0

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

Сервоприводы даже не знают и не заботятся о высоком или низком напряжении в данный момент времени. Их волнует только одно: время между нарастающим и падающим фронтом.

Сервоуправление контролируется путем обнаружения нарастающего фронта напряжения и измерения времени до появления падающего фронта. Время действия обычно составляет от 1,0 до 2,0 мс, но оно может варьироваться от сервопривода к сервоприводу.

Вы можете управлять им на 1 Гц, 10 Гц, 50 Гц, 100 Гц. Большинство будет реагировать на еще более высокие частоты пульса, но опять же, это переменная. Я пытаюсь сказать, что частота, коэффициент заполнения, длительность между импульсами не могут быть менее значимыми для вашей проблемы, а именно то, что сервопривод не реагирует, когда вы ожидаете этого.

Единственное, что имеет отношение к делу - это границы вашего пульса, на которые вы не обращали никакого внимания. Если вы хотите понять это, пожалуйста, начните с того, что вы видите, что имеет значение, сделайте снимки ваших краев импульсов, и тому подобное. Вы не сделали ничего полезного на этих снимках экрана, поэтому, вероятно, здесь нет проблем или различий. Есть много проблем или различий, которые никогда не будут видны с тем, что вы измерили.

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

Что еще более важно, в нерабочем захвате посмотрите на «время падения». 809μs? Ваш осциллограф считает, что он видит время падения продолжительностью 0,8 мс. Это плохо. Понятно, что это неверно, но факт остается фактом, вот что он измеряет.

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

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

Другими словами, он не только не двигается, но и не сопротивляется движению вала. Это будет просто мягко, именно так, как вы видите.

Теперь возникает вопрос .... почему вызов servo.write влияет на качество края?

Вы сказали, что клон. Как этот?введите описание изображения здесь

Эти клоны, в частности, склонны вести себя хаотично из-за невероятно плохой развязки. На каждом выводе питания должны быть развязывающие конденсаторы, максимально приближенные к mega2560. И на самом деле Arduino, действительно, есть. Однако по этим клонам они слишком далеки или, возможно, отсутствуют, трудно сказать. Из доски видно, что она не будет вести себя надежно, это главное.

Так в чем же разница?

Когда вы вызываете servo.write, он толкает стек выше, чем если вы вызываете writeMicroseconds. Учитывая 3-байтовый указатель стека mega2560 (17 бит), ему приходится перебрасывать кучу критических битов, которых нет при вызове writemicroseconds. Я знаю, что это кажется маловероятной разницей, но я испытал свою долю плохо отсоединенных микроконтроллеров, и, в частности, atmegas, похоже, демонстрирует странное поведение, особенно при использовании таймеров и / или толкании или выталкивании стека. Нечто подобное произошло со мной, только стек был поврежден, когда я пытался управлять светодиодами с помощью ШИМ, но если я поместил все в линию, не вставляя стек, это сработало. Плохая развязка была в конечном итоге проблемой.

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

Разъединяющие вещи всегда такие причудливые и гиперспецифичные. Вот почему разделение так важно. Храните кошмарный ад проблем, из-за которых отсутствие емкости может отвлечь вас от хороших толстых керамических колпачков и как можно ближе к чипу, насколько это физически возможно.


0

Это может быть связано с настройками выходного контакта, выполняемыми подпрограммой .write (). Пожалуйста, попробуйте использовать резистор 1K, если он не работает, затем удалите его и используйте резистор. это уравновесит эффект любого внутреннего недельного понижающего / понижающего резистора, который может быть установлен программой. Когда вы измеряете сигнал с помощью своего прицела, внутреннее сопротивление датчика действует как понижение.
Большинство сервоприводов также отключают питание внутреннего двигателя, если сигнал не задан в течение 10 импульсов подряд. Это используется для экономии энергии.


Боюсь, ваш ответ не верный. servo.write () принимает угол как ввод, а не время. Люди не должны слепо голосовать за ответы.
Борт

Да, моя ошибка, я плохо прочитал код. это может быть связано с настройками выходного контакта, выполняемыми подпрограммой .write ().
555

2
Это было бы моей первой мыслью, хотя следы прицела, кажется, опровергают это. Отсутствие заземления и другая ситуация подтягивания / опускания могут быть причиной того, что один и тот же сигнал отправляется, но не поступает (после определения местоположения зонда).
KalleMP

Я думаю, что @KallieMP, вероятно, прав. Резисторы Pullup / Down вполне могут быть ответом. Они могут ограничить ток. Импульсы могут быть сформированы правильно, но при недостаточном возбуждении. Поэтому независимо от конкретной функции servo.write () текущие уровни должны точно соответствовать выходу сервотестера, чтобы получить тот же результат.
SDsolar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.