Драйвер двигателей и сервопривод, взаимное влияние

Olger
Offline
Зарегистрирован: 28.02.2015

Столкнулся с проблемой, которой ранее не наблюдал при подобных схемных решениях.

К драйверу DRV8835 подключены два коллекторных двигателя, управление с Ардуино через d4 и d5, к d6 подключен сервопривод типа SG90. К выводам каждого двигателя припаян керамический конденсатор 0,1мкФ. Питание драйвера, Ардуино и серво от одного стабилизатора 5в (U1), питание двигателей от другого (U3).

При подаче ШИМ на d5 серво начинает дергаться, при этом двигатели резко меняют направление движения и скорость. Через несколько секунд серво прекращает дергаться и двигатели приходят в норму - вращаются с заданной скоростью в заданном направлении. Потом опять.

Если серво отключить, выдернув его из разъема на плате, то двигатели ведут себя нормально.

Лечил установкой емкостей 0,1 между выводами двигателей и корпусом, между d6 и землей - изменений нет.

Помогла установка резисторов в цепи подключения двигателей - R25, R26 на схеме. Сначала поставил 22 Ом, проблема ушла. Через какое-то время снова всё дергается, увеличил сопротивления до 39 Ом - проблема ушла, но снова вернулась )) Поставил 47 Ом, пока работает... Но не пойму природу явления и как с ним бороться, что-то я может не то делаю. 

Кто сталкивался с подобным, что скажите?

sadman41
Offline
Зарегистрирован: 19.10.2016

Серва через что крутится?

Навскидку: D5 и D6 - один таймер (#0). Для эксперимента можно перекинуть PWM драйвера мотора на D11/D3 (timer #2).

 

Olger
Offline
Зарегистрирован: 28.02.2015

Используется стандартная библиотека серво, пробовал и библ-ку серво 2 и совсем без библиотек управлять, то же самое.

Olger
Offline
Зарегистрирован: 28.02.2015

sadman41 пишет:

Серва через что крутится?

Навскидку: D5 и D6 - один таймер (#0). Для эксперимента можно перекинуть PWM драйвера мотора на D11/D3 (timer #2).

 

d3 используется под софт сериал, d11 на SPI, не могу их задействовать

sadman41
Offline
Зарегистрирован: 19.10.2016

А, ну где софтсериал, там жди подставы от Servo.h.

Крутите сервы вручную, без таймеров в библиотеках.

Olger
Offline
Зарегистрирован: 28.02.2015

sadman41 пишет:

А, ну где софтсериал, там жди подставы от Servo.h.

Крутите сервы вручную, без таймеров в библиотеках.

Пробовал без библиотек, вид в профиль тот же.

 

b707
Offline
Зарегистрирован: 26.05.2017

Olger пишет:

d3 используется под софт сериал, d11 на SPI, не могу их задействовать

вы хотя бы ради проверки попробуйте - на время откажитесь от сериала и СПИ. как проверите - тогда будете думать

Olger
Offline
Зарегистрирован: 28.02.2015

b707 пишет:

Olger пишет:

d3 используется под софт сериал, d11 на SPI, не могу их задействовать

вы хотя бы ради проверки попробуйте - на время откажитесь от сериала и СПИ. как проверите - тогда будете думать

от SPI не могу, через него команды подаются (nRF24). 

Сейчас попробую в скетче отключить софт сериал.

sadman41
Offline
Зарегистрирован: 19.10.2016

Olger пишет:

Пробовал без библиотек, вид в профиль тот же.

...каким образом?

Olger
Offline
Зарегистрирован: 28.02.2015

sadman41 пишет:

Olger пишет:

Пробовал без библиотек, вид в профиль тот же.

...каким образом?

Как то так

// ***************************** Функция управления серво без библиотеки **********************************************************************************************************
void servoPulse(byte servo_out, byte pos)                                     // объявляем функцию с входными параметрами - номер порта серво и угол поворота в град.
{
  static uint32_t prevDmillis = millis();                                     // задаем переменную для хранения текущего времени
  if (millis() - prevDmillis > 20)                                            // каждые 20мс выполняем действия указанные в теле условия
  {
    prevDmillis = millis();
    int pulseWidth = (pos * 13) + 260;                                        // пересчитываем угол поворота в задержку в мкс, значение множителя (12) и слагаемого (340) надо подбирать
    digitalWrite(servo_out, HIGH);                                            // включаем порт серво
    delayMicroseconds(pulseWidth);                                            // делаем задержку соответствующую заданному углу поворота
    digitalWrite(servo_out, LOW);                                             // выключаем порт серво
    
  }
}

 

Olger
Offline
Зарегистрирован: 28.02.2015

Сейчас поставил R25 47 Ом, R26 56 Ом.

Отключил софт сериал в скетче, управляю серво без библиотеки, как указал в посте выше. Вроде работает, но так уже было - работало, работало и потом начало дергаться.

Хотелось бы понять причину, что на что влияет. Дело в серве, как я думаю, ибо при ее физическом удалении, проблем не возникает.

sadman41
Offline
Зарегистрирован: 19.10.2016

В принципе верно. Но, если есть аттаченные обработчики прерываний, то они будут соваться в delayMicroseconds() и выдержка будет неточной

Есть ещё одна гипотеза - проблема с питанием. Смотрю, что с каждым постом всё больше потребителей появляется - проверьте, нет ли просадки на U1.

Проверить - в серве ли дело очень просто: один короткий скетч, который крутит серву туда-сюда и включает PWM на D5.

Olger
Offline
Зарегистрирован: 28.02.2015

Погонял двигатели несколько минут, было норм, а потом на максимальном ШИМ опять серво задергалось.

U1 - 5В, 1А. Тут тока с запасом, столько потребителей нет. Nano+драйвер+серво. 

Когда кручу серво, проблемы нет, она крутится и двигатели работают. Проблема в хаотично возникающем самопроизвольном её подергивании, причину которого не пойму.

sadman41
Offline
Зарегистрирован: 19.10.2016

Самое действенное - подсесть осциллографом на сервопин. Если там всё чисто, а серва дёргается - проблема в ней. Мошт там позиционирующий резистор при тряске мотором начинает контактом шуметь.

Olger
Offline
Зарегистрирован: 28.02.2015

sadman41 пишет:

Самое действенное - подсесть осциллографом на сервопин. Если там всё чисто, а серва дёргается - проблема в ней. Мошт там позиционирующий резистор при тряске мотором начинает контактом шуметь.

Дело хорошее, только осцилла нет.

Сервы менял. Штатная установлена в корпус между двигателями, в глубокой теории можно предположить влияние близко расположенных двигателей на неё. Но, подключал другие серво, располагал их далеко от двигателей. Всё равно дёргаются.

nik182
Offline
Зарегистрирован: 04.05.2015

А если серву переписать на аппаратный таймер, который независит отпрограммы и прерываний? Запрограмировать первый таймер на 20 мс и шим 50 процентов и к выходу серву? Что будет? 

Olger
Offline
Зарегистрирован: 28.02.2015

nik182 пишет:

А если серву переписать на аппаратный таймер, который независит отпрограммы и прерываний? Запрограмировать первый таймер на 20 мс и шим 50 процентов и к выходу серву? Что будет? 

Не совсем понял всю глубину вашей мысли )) Можно попроще и на пальцах ?)

sadman41
Offline
Зарегистрирован: 19.10.2016

Железный таймер предлагает перестроить так, чтобы он давал каждые 20мс пульс ногой на заданное кол-во микросекунд.

Olger
Offline
Зарегистрирован: 28.02.2015

Перекинул серво на А2, погонял двигатели, пока нормально. Посмотрим что будет завтра )

Заодно установил на плате монитор питания типа INA219 и поправил скетч под него.

Что заметил - сама схема без нагрузок (серво, двигатели, светодиоды) потребляет 50мА, при уровне ШИМ на двигатели 150, потребление составляет 260мА (это с двумя двигателими), при уровне ШИМ 200 - потребление 230мА, при уровне ШИМ 250 - потребление 190мА. 

Странно как-то. 

Olger
Offline
Зарегистрирован: 28.02.2015

Уменьшил сопротивление в цепи двигателей до 33 Ом, погонял, проблема ушла. Надеюсь, совсем.

Всё равно хотелось бы понять природу взаимного влияния d6 на d5 и d4. Может, когда-нибудь узнаю.