Сервоприводы, срыв ШИМа

ourlive
Offline
Зарегистрирован: 26.05.2012

В скетче используюся библиотеки:

#include <i2cmaster.h>
#include <Servo.h> 
#include <Adafruit_GFX.h>    // библиотека графики
#include <Adafruit_ST7735.h> // библиотека на экран
#include <SPI.h>

В устройстве соотвественно LCD, ИК-датчик температуры, два сервопривода.

Внезапно стала наблюдаться проблема срыва ШИМ на сервы (изменение скважности в один импульс), сервы соответственно дёргаются. ШИМ срывается бессистемно один раз в 2-5 секунд.

Нано ATmega 328 подключение

Что может вызывать конфликты предположительно на уровне таймеров?

Скетч в общем то перегружет и операциями над строковыми переменными (команды по ком-порту), и вложенные циклы математических операций (измеренная температура проходит несколько мат фильтров из-за сильной девиации), но всё это ведь не должно влиять на геренацию ШИМ?

 

 

ourlive
Offline
Зарегистрирован: 26.05.2012

Конфликт оказался с LCD, если полностью прекратить на него вывод инфы, то срывы ШИМ прекращаются.

А как с этим бороться не ясно.

Flight
Offline
Зарегистрирован: 02.10.2013

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

 

ourlive
Offline
Зарегистрирован: 26.05.2012

Питание проседает, но только как следствие резких дёрганий серв (при рывке скважности с положения 0 градусов на 90 и более, по одному импульсу не ясно), срыв ШИМа я осцилографом глядел. Внешний дополнительный источник питания проблему не устранял, всё прекратилось именно после прекращения передачи данных по SPI на LCD. Сейчас при исключении библиотек и кода на LCD cервы стабильно и чётко позиционируются даже без внешнего источника питания(его я правда заместил пачкой кондёров на питании, хотя и без них стабильность выше 0.2 В)

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробуйте выводить на дисплей данные только при их изменении

ourlive
Offline
Зарегистрирован: 26.05.2012

Весь алгоритм так и строится, прочитать данные с датчика, вывести данные, дёрнуть серву, прочитать данные с датчика. и т.д. SPI очень ресурсоёмкий протокол, похоже придётся отказаться от LCD, и отсылать всё по сериал на комп (так по крайней мере это устройство уже работало).

StrangerM
Offline
Зарегистрирован: 02.11.2013

Есть ЖК с сериал интерфейсом. Вот здесь можно посмотреть http://www.robot-electronics.co.uk/

ourlive
Offline
Зарегистрирован: 26.05.2012

Так у меня графический LCD, с символьными понятно, что вариантов полно. В свободное от лени время собираю сканирующий тепловизор. Хотелось сделать автономное устройство без использования компа в качестве средства отображения, но это уже другая история. Красиво выводить графику без SPI с ардуины сложно. I2C уже занят и побеждать проблему с параллельным устройством даже начинать не буду (тем более экрана такого у меня сейчас точно нет). Проще наверное соорудить пару внешних ШИМ генераторов для серв.

StrangerM
Offline
Зарегистрирован: 02.11.2013

А посмотрите структуру МК. Если у вас МЕГА, то можно попробовать для ШИМ 4-ый таймер. Он на другом порту сидит, чем эспэи.  ШИМ ведь аппаратный и пересекается с эспэи на уровне порта.

ourlive
Offline
Зарегистрирован: 26.05.2012

В стартовом посте есть ссылка на картинку подключения перефении к дуине (и тип её указан). И по всей видимости таймены там совершенно разные. Но дело то не в этом. SPI протокол синхронный и цикл передачи данных занимает много времени. Щас поэкспериментировал, отсыл единичного пикселя проблем не вызывает(раз в несколько минут случается пересечение срабатывания таймеров), а вот более 50ти пикселей (приблизительно) прерывания по таймерам гарантированно начинают пересекаться очень часто.

Побившись над примерами к LCD нашел вариант работы LOW SPEED, в два раза лучше для ШИМа и откровенно мерцающая прорисовка на экране.

StrangerM
Offline
Зарегистрирован: 02.11.2013

Могет быть, могет быть. Я так себе аппаратный ШИМ представляю - пашет таймер и цифровой компаратор. И ничего вокруг им не надо. А вот если в лупе каждый раз обновляется значение скважности посредством библиотеки серво. Тогда да.

ourlive
Offline
Зарегистрирован: 26.05.2012

Не аппаратный в дуинах ШИМ, а программный, ЦП его по прерываниям обслуживает. Ради интереса даже в даташит камня заглянул.

StrangerM
Offline
Зарегистрирован: 02.11.2013

Программный? Те если я в сетапе напишу analogWrite(pin, value) никакого ШИМа на ножке не будет?

ourlive
Offline
Зарегистрирован: 26.05.2012

А если я напишу digitalWrite в сетапе? Вам страницу даташита с развернутым описанием работы PWM? Предположите хотя бы что совершает описанная вами команда.

StrangerM
Offline
Зарегистрирован: 02.11.2013

Не, не надо. Не буду настаивать. С моей точки зрения эта команда в сетапе выполняется один раз. Упрощенно, она инициализирует таймер-счетчик который бегает по кругу (те грубо говоря выдает пилу) и помещает в соответствующий регистр некоторое значение для сравнения. При равенстве опорного и сравниваемого кода выдается импульс и тд.  

ourlive
Offline
Зарегистрирован: 26.05.2012

Вооот. С пунктом "сравнение" по ходу проблема и есть. В том же даташите указано несколько вариантов генерации ШИМ. Не поленился попереводить с помощью гугла. Ваш вариант там называют прямым методом генерации и считают не рекомендованным, потому как кушает слишком много процессорного времени (Using the Output Compare to generate waveforms in Normal mode is not recommended, since this will occupy too much of the CPU time).

StrangerM
Offline
Зарегистрирован: 02.11.2013

В этой схеме ЦПУ вообще не принимает участия. А сравнение происходит без участия ЦПУ в цифровом компараторе. И чем это все не подходит к Figure 16-6. Fast PWM Mode, Timing Diagram?

PS Ааа, понятно, у вас ведь 500 Гц для сервы...  Я пользовал только 3, 30 и 60 кГц.