У меня есть сервопривод TowerPro MG90D ( ссылка производителя ) ( ссылка на ServoDatabase ).
Он имеет диапазон 180 градусов (прерывистый).
Он отлично реагирует на мой тестер сервоприводов:
Наблюдайте за следующим рабочим циклом 7% (около 90 градусов) на тестере:
Сервопривод нормально реагирует.
Однако, когда я использую servo.write()
свой клон Arduino Mega 2560, сервопривод не реагирует ни на какой угол. У меня есть несколько других сервоприводов, которые прекрасно работают с тем же кодом на тех же контактах.
Соблюдайте следующий рабочий цикл 7% на Arduino с помощью servo.write(90)
:
Нет ответа. Сервопривод «хромает»; он не занимает никаких позиций.
Пока я писал этот вопрос, я подумал о том, чтобы попробовать servo.writeMicroseconds()
.
Вот servo.writeMicroseconds(1450)
:
Сервопривод отвечает!
Вот servo.writeMicroseconds(1472)
(рабочий), у которого такие же временные промежутки , как и у предыдущего нерабочего servo.write(90)
!
servo.writeMicroseconds(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
Сначала короткое отступление. Вы, кажется, немного не понимаете, как работают сервоприводы. Сервоприводы не контролируются ШИМ, и они не знают и не заботятся о том, что вы отправляете импульсы с частотой 49 Гц. Они не знают, что импульс составляет какой-то процент от произвольного периода. Сервоприводу все равно, какое время между импульсами. Я говорю это, потому что вы кажетесь необычайно сосредоточенным на вещах, которые на самом деле не имеют значения.
Сервоприводы даже не знают и не заботятся о том, высокое или низкое напряжение в данный момент времени. Их волнует только одно: время между нарастающим и спадающим фронтами.
Сервопривод управляется путем обнаружения нарастающего фронта напряжения и измерения времени до появления спадающего фронта. Допустимое время обычно составляет от 1,0 до 2,0 мс, но может варьироваться от сервопривода к сервоприводу.
Вы можете управлять им на 1 Гц, 10 Гц, 50 Гц, 100 Гц. Большинство из них отреагируют на еще более высокую частоту пульса, но, опять же, это может быть разным. Я пытаюсь сказать, что частота, рабочий цикл, продолжительность между импульсами - все это не может быть менее важным для вашей проблемы, заключающейся в том, что сервопривод не отвечает, когда вы этого ожидаете.
Единственное, что имеет значение, это края вашего пульса, на которые вы не обратили никакого внимания. Если вы хотите в этом разобраться, пожалуйста, начните с того, что имеет значение, сфотографируйте фронты пульса крупным планом и тому подобное. Вы не зафиксировали ничего полезного на этих снимках экрана, поэтому, вероятно, здесь нет проблем или различий. Есть много проблем или различий, которые никогда не были бы видны с тем, что вы измерили.
Что я вижу, так это то, что захват нерабочей последовательности импульсов заметно грязнее, как импульса, так и земли, чем любой другой. Что странно, поскольку он должен вызывать ту же функцию, что и другие. Почему он такой шумный?
Что еще более важно, в нерабочем захвате посмотрите на «время падения». 809 мкс? Ваш осциллограф считает, что время спада составляет 0,8 мс. Это плохо. Ясно, что это неверно, но факт остается фактом: именно это он и измеряет.
Это классический признак грязного края. Подумай об этом. Если этот импульс обманывает ваше высококачественное тестовое оборудование, то есть ваш осциллограф, заставляя видеть смехотворно длинный фронт или время спада, или, может быть, настолько грязный, что он просто не может правильно определить спадающий фронт все время (или кто знает), тогда какие шансы у этого бедного дрянного маленького сервопривода за 8 долларов уловить приличный спадающий фронт?
Если сервопривод не получает действительный импульс (например, если задний фронт занимает слишком много времени, слишком грязный или пропущен) в пределах допустимого диапазона импульсов, и сервоприводы считают по фронтам, которые могут иметь или не иметь ничего общего делайте с тем, что вы считаете краями импульса, тогда он реагирует так же, как если бы он был выключен.
Другими словами, он не только не движется, но и не сопротивляется движению своего вала. Он просто будет вялым, именно так, как вы видите.
Теперь возникает вопрос... почему вызов servo.write влияет на качество края?
Эти клоны, в частности, имеют тенденцию вести себя хаотично из-за невероятно плохой развязки. Развязывающие конденсаторы должны быть на каждом выводе питания и как можно ближе к mega2560. А на собственно ардуино действительно есть. Однако на этих клонах они слишком далеко или, возможно, отсутствуют, трудно сказать. Глядя на плату, очевидно, что она не будет работать надежно, это главное.
Так в чем же разница?
Когда вы вызываете servo.write, он перемещает стек выше, чем если бы вы вызывали writeMicroseconds. Учитывая 3-байтовый указатель стека mega2560 (17 бит), ему приходится переворачивать кучу критических битов, которые ему не нужны, когда вы вызываете writemicroseconds. Я знаю, что это кажется маловероятным, но я испытал свою долю плохо развязанных микроконтроллеров, и, в частности, atmegas, кажется, демонстрируют странное поведение, особенно при использовании таймеров и / или проталкивании или извлечении стека. У меня было нечто похожее, только стек был поврежден, когда я пытался управлять светодиодами с помощью ШИМ, но если я поставил все в строку, не проталкивая стек, это сработало. Плохая развязка была в конечном счете проблемой.
Я полностью ожидаю, что плохая развязка сможет по причинам, известным только atmega2560 и никому другому, иметь пагубное влияние на качество фронта этого импульса, но только когда вы толкаете стек прямо перед этим. Этот сервопривод просто не в состоянии справиться с загрязнением этих краев, поэтому в этом случае он не видит действительных импульсов. Другие сервоприводы, очевидно, справляются с этим.
Разделение вещей всегда причудливо и гиперспецифично, как это. Вот почему так важна развязка. Избавьтесь от кошмарного ада проблем, связанных с недостатком емкости, с хорошими толстыми керамическими колпачками и как можно ближе к чипу, насколько это физически возможно.
Это может быть связано с настройками выходного вывода, выполненными подпрограммой .write(). Пожалуйста, попробуйте использовать подтягивающий резистор 1K, если он не работает, удалите его и используйте подтягивающий резистор. это сбалансирует действие любого внутреннего подтягивающего/подтягивающего резистора, который может быть установлен программой. Когда вы измеряете сигнал с помощью осциллографа, внутреннее сопротивление пробника действует как понижающее.
Большинство сервоприводов также отключают питание внутреннего двигателя, если сигнал не задан в течение 10 импульсов подряд. Это используется для экономии энергии.
Борт
Дмитрий Григорьев
write
? На самом деле нет причин, чтобы сервопривод не работал, поэтому я бы поставил под сомнение ваши сигналы.Борт
Дмитрий Григорьев
Борт
JRE
MDMoore313
servo.write()
посылает сигнал , отличный от сервотеста иservo.writeMilliseconds(uS)
. Я думаю , что ОП ищет фактическую разницу между сигналами, потому что для всех намерений и целей они кажутся одинаковыми.JRE
Всплеск напряжения
Борт
Кен Ширрифф
servo.write()
код , он вызываетservo.writeMicroseconds()
. Поэтому очень удивительно, что вы говорите, чтоwriteMicroseconds()
работает, аwrite()
что нет.неоновый
Курт Э. Клотье
Скотт Сейдман