Сервоприводы, срыв ШИМа
- Войдите на сайт для отправки комментариев
Ср, 04/06/2014 - 20:16
В скетче используюся библиотеки:
#include <i2cmaster.h> #include <Servo.h> #include <Adafruit_GFX.h> // библиотека графики #include <Adafruit_ST7735.h> // библиотека на экран #include <SPI.h>
В устройстве соотвественно LCD, ИК-датчик температуры, два сервопривода.
Внезапно стала наблюдаться проблема срыва ШИМ на сервы (изменение скважности в один импульс), сервы соответственно дёргаются. ШИМ срывается бессистемно один раз в 2-5 секунд.
Что может вызывать конфликты предположительно на уровне таймеров?
Скетч в общем то перегружет и операциями над строковыми переменными (команды по ком-порту), и вложенные циклы математических операций (измеренная температура проходит несколько мат фильтров из-за сильной девиации), но всё это ведь не должно влиять на геренацию ШИМ?
Конфликт оказался с LCD, если полностью прекратить на него вывод инфы, то срывы ШИМ прекращаются.
А как с этим бороться не ясно.
Возможно сервам не хватает питания. Обычно когда недостаточно питания, то они начинают дергаться (у меня было так).
Питание проседает, но только как следствие резких дёрганий серв (при рывке скважности с положения 0 градусов на 90 и более, по одному импульсу не ясно), срыв ШИМа я осцилографом глядел. Внешний дополнительный источник питания проблему не устранял, всё прекратилось именно после прекращения передачи данных по SPI на LCD. Сейчас при исключении библиотек и кода на LCD cервы стабильно и чётко позиционируются даже без внешнего источника питания(его я правда заместил пачкой кондёров на питании, хотя и без них стабильность выше 0.2 В)
Попробуйте выводить на дисплей данные только при их изменении
Весь алгоритм так и строится, прочитать данные с датчика, вывести данные, дёрнуть серву, прочитать данные с датчика. и т.д. SPI очень ресурсоёмкий протокол, похоже придётся отказаться от LCD, и отсылать всё по сериал на комп (так по крайней мере это устройство уже работало).
Есть ЖК с сериал интерфейсом. Вот здесь можно посмотреть http://www.robot-electronics.co.uk/
Так у меня графический LCD, с символьными понятно, что вариантов полно. В свободное от лени время собираю сканирующий тепловизор. Хотелось сделать автономное устройство без использования компа в качестве средства отображения, но это уже другая история. Красиво выводить графику без SPI с ардуины сложно. I2C уже занят и побеждать проблему с параллельным устройством даже начинать не буду (тем более экрана такого у меня сейчас точно нет). Проще наверное соорудить пару внешних ШИМ генераторов для серв.
А посмотрите структуру МК. Если у вас МЕГА, то можно попробовать для ШИМ 4-ый таймер. Он на другом порту сидит, чем эспэи. ШИМ ведь аппаратный и пересекается с эспэи на уровне порта.
В стартовом посте есть ссылка на картинку подключения перефении к дуине (и тип её указан). И по всей видимости таймены там совершенно разные. Но дело то не в этом. SPI протокол синхронный и цикл передачи данных занимает много времени. Щас поэкспериментировал, отсыл единичного пикселя проблем не вызывает(раз в несколько минут случается пересечение срабатывания таймеров), а вот более 50ти пикселей (приблизительно) прерывания по таймерам гарантированно начинают пересекаться очень часто.
Побившись над примерами к LCD нашел вариант работы LOW SPEED, в два раза лучше для ШИМа и откровенно мерцающая прорисовка на экране.
Могет быть, могет быть. Я так себе аппаратный ШИМ представляю - пашет таймер и цифровой компаратор. И ничего вокруг им не надо. А вот если в лупе каждый раз обновляется значение скважности посредством библиотеки серво. Тогда да.
Не аппаратный в дуинах ШИМ, а программный, ЦП его по прерываниям обслуживает. Ради интереса даже в даташит камня заглянул.
Программный? Те если я в сетапе напишу analogWrite(pin, value) никакого ШИМа на ножке не будет?
А если я напишу digitalWrite в сетапе? Вам страницу даташита с развернутым описанием работы PWM? Предположите хотя бы что совершает описанная вами команда.
Не, не надо. Не буду настаивать. С моей точки зрения эта команда в сетапе выполняется один раз. Упрощенно, она инициализирует таймер-счетчик который бегает по кругу (те грубо говоря выдает пилу) и помещает в соответствующий регистр некоторое значение для сравнения. При равенстве опорного и сравниваемого кода выдается импульс и тд.
Вооот. С пунктом "сравнение" по ходу проблема и есть. В том же даташите указано несколько вариантов генерации ШИМ. Не поленился попереводить с помощью гугла. Ваш вариант там называют прямым методом генерации и считают не рекомендованным, потому как кушает слишком много процессорного времени (Using the Output Compare to generate waveforms in Normal mode is not recommended, since this will occupy too much of the CPU time).
В этой схеме ЦПУ вообще не принимает участия. А сравнение происходит без участия ЦПУ в цифровом компараторе. И чем это все не подходит к Figure 16-6. Fast PWM Mode, Timing Diagram?
PS Ааа, понятно, у вас ведь 500 Гц для сервы... Я пользовал только 3, 30 и 60 кГц.