Подключение сервопривода к PIC16F628A

Сервопривод (часть 2)

Устройство сервомашинки было описано в предыдущей статье.

Теперь рассмотрим, как подключить его к контроллеру.
Подключение цифрового сервопривода к контроллеру выглядит очень просто, достаточно подать на сервомашинку питание, а цифровой вход подключить напрямую к выходу МК.

Подключение сервопривода к микроконтроллеру

Подключение сервопривода к микроконтроллеру

Для демонстрации работы сервопривода была собранна простая схема.

Схема

Схема

Схема содержит микроконтроллер PIC16F628A с 2 кнопками, кварцем и обвязкой в вид пары конденсаторов для кварца и трёх резисторов для кнопок и MCLR. Большинство сервоприводов спокойно работают от 5 В, так что посадим его на один источник с микроконтроллером (хотя лучше развязать, т.к. при работе серва может сильно просаживать напряжение). Красный провод + питания, чёрный (или коричневый) – земля, а жёлтый (или белый) – сигнальный, который подключаем к выходу RB6 МК.

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


const unsigned int MAX=837; 		//	максимальная длина импульса
const unsigned int MIN=237; 		//	минимальная длина импульса
const unsigned int DIFFERENCE=600; 	//	разница между минимальным и максимальными импульсами
const unsigned int INTERVAL=5730; 	//	интервал одной посылки
const unsigned int STEPS=200; 		//	шагов

unsigned int calk(unsigned int i)
{
return MIN+DIFFERENCE/STEPS*i;
}

Константа DIFFERENCE задаёт разницу между минимальным и максимальным импульсами, её можно задавать в ручную или высчитывать как разницу MAXMIN. Константа STEPS (количество шагов) должна быть кратная константе DIFFERENCE, иначе серва не будет доходить до конца.

Временная диаграмма

Временная диаграмма

Перейдём к основному коду программы:

void main()
{
unsigned int n,m;
unsigned int step=STEPS/2; 	//	установка начального положения
low_init();					//	инициализация МК
n=calk(step); 				//	расчёт начального положения
m=INTERVAL-n;
while(1==1)
{
  SetBit(PORTB,6); 	//	формирование управляющего импульса
  delay(n);
  ClrBit(PORTB,6); 	//	формирование остатка посылки
  delay(m);
  if(BUTTON1==0&&step!=STEPS) 	//	обработка кнопки
  {
    step++;
    n=calk(step); 			//	расчёт положения
    m=INTERVAL-n;
    delay(1000); 			//	задержка и антидребезг
  }
  if(BUTTON2==0&&step!=0) //	обработка кнопки
  {
    step--;
    n=calk(step); 			//	расчёт положения
    m=INTERVAL-n;
    delay(1000); 			//	задержка и антидребезг
  }
}
}

В самом начале происходит инициализация микроконтроллера и расчёт начального положения вала сервопривода. В бесконечном цикле главная задача – это формирование управляющего импульса и всей посылки. Также происходит обработка нажатий кнопок. Первая кнопка BUTTON1 увеличивает значение текущего шага, тем самым поворачивая вал привода в одну сторону, вторая кнопка BUTTON2 уменьшает текущий шаг привода, что приводит к повороту в другую сторону.

Ниже приведены осциллограммы управляющего сигнала сервопривода и зависимость положения вала сервопривода от них.

Осциллограмма 1 Положение движка вала 1

Осциллограмма 2 Положение движка вала 2

Осциллограмма 3 Положение движка вала 3

Осциллограмма 4 Положение движка вала 4

Осциллограмма 5 Положение движка вала 5

Осциллограммы зависимости положения движка
вала сервопривода от длины импульсов.

И напоследок небольшое видео, демонстрация работы сервопривода.

Видео

Скачать файлы исходника и прошивки

Но этот метод подходит для управления одной – двумя сервомашинками, для управления множеством сервоприводов нужно уже использовать другой алгоритм, который рассмотрен в следующей статье — управление множеством сервомашинок с PIC16F628A.

40 комментариев на « Подключение сервопривода к PIC16F628A»

  1. andre пишет 15.08.2011 в 05:13 #

    собрал схему, при старте двиг дергается но на кнопки не реагирует

  2. Alex_EXE пишет 16.08.2011 в 21:42 #

    Возможно, ваш компилятор или программа для прошивки МК не смогла прочитать фьюзы, если так, то тогда их нужно выставить вручную.
    Используемые фьюзы: HS, MCLR, BODEN.
    Так же скомпилировал и добавил файл прошивки.

  3. sed пишет 05.01.2012 в 22:02 #

    Как раз, что я искал, но для меня программирование микроконтроллеров — темный лес, схему то я спаять смогу, а вот прошить микроконтроллер врятли. Можете рассказать, можно «ткнуть носом в ссылку» как зашить программу в контроллер?

  4. Alex_EXE пишет 08.01.2012 в 02:09 #

    В этой статье представлено не законченное устройство, а материал для освоения, если вы не сильны в программирование (нужно будет подправить код под себя в 50% случаев), то этот материал вам будет мало полезен.
    Для прошивки контроллеров нужен программатор – на сайте есть схема Extra-PIC, есть и другие, и программа для прошивки – например – IC-Prog, для правки кода и компилирования – MPLAB и компилятор. Если вас это не пугат, то тогда я вас смогу направить в нужном направление.

  5. sed пишет 10.01.2012 в 11:58 #

    немного пугает, если честно то я хочу сделать управляемую вебкамеру, управляться она будет через lpt порт, схема подходит мне на 100%. правда смогу ли я ее реализовать это большой вопрос.
    Как прийдут мои сервы попробую подключить их к lpt напрямую, то есть портом буду генерировать управляющий сигнал, если не получится — буду смотреть в сторону контроллера

  6. Alex_EXE пишет 10.01.2012 в 18:36 #

    На сайте есть две готовые конструкции на 4 сервопривода, одна управляется через COM, вторая по Bluetooth, прошивки и программа есть, для обеих версий одинаковые.
    В них МК остается только прошить.

  7. sed пишет 11.01.2012 в 10:43 #

    спасибо за ваши советы, но вариант с com портом не подходит — на нем бдт висеть термометр, да и с lpt программно я уже разобрался, осталось дждаться посылки и экспериментировать, хотя вариант с микроконтроллерами пока слишком сложен: нужно сделать программатор, сделать схему, прошить контроллер, а это мне совершенно незнакомо, если не полуится прямое подключение к lpt тогда буду «мучать» вас вопросами. Еще раз спасибо за ответы и комментарии

  8. Слава пишет 26.01.2012 в 19:22 #

    Здравствуйте! Хочу научится управлять сервоприводом с помощью микроконтроллера. Буду использовать микроконтроллер PIC так как раньше с ним имел дело. Много рылся в инете и зашел на этот сайт. Для решения моей задачи необходим большой выходной момент на валу, купил для этого две сервомашинки Tower Pro MG995. Они будут выполнять разные действия. Хотел спросить по написанию программы.
    Как программно управлять скоростью вращения вала????????

    И второй вопрос. На сколько я понял, чем больше ток тем больше момент на валу. отсюда вопрос почему тогда сечение проводов сервопривода такое маленькое и какой вы использовали источник питания????

    Зарание спасибо!

  9. Alex_EXE пишет 26.01.2012 в 20:29 #

    На часть вопросов ответил сегодня, но в первой теме по сервам — Устройство сервомашинки . Отвечал там, т.к. было утеряно ваше мыло.

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

  10. Alex_EXE пишет 26.01.2012 в 20:42 #

    На видео сервой управляю пошагово, период тоже имеет роль, но при резких перемещениях, как в самом начале при инициализации. В статье управляемая WEB-камера с ПК есть видео с сервами поинтересней.

  11. Слава пишет 27.01.2012 в 11:00 #

    Спасибо за подробный ответ. В моем случаи я хотел использовать не аккомуляторы, а небольшой источник например (P40A-1P2J) на 5В. Так как планируется что это устройство будет использоваться каждый день в теории, если получится собрать. серва должна будет управлять управлять механизмом перемещения штока. Сейчас занимаюсь разработкой алгоритма. Вот у меня возникает тут вопрос, как программно заставить серву узнать что она достигла заданное положение, когда шток будет полностью выдвинут????

  12. Слава пишет 27.01.2012 в 11:17 #

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

  13. Слава пишет 30.01.2012 в 12:06 #

    Здравствуйте!!! В одной из вашей статей я нашел что можно использовать аналоговый компаратор микроконтроллера в качестве АЦП, на сколько я понял устройство сервопривода внутри есть потенциометр которой по сути является энкодером????
    То есть для более менения точного позиционирования сервы можно снимать напряжения питания с потенционтра в разных положениях и использовать его как датчик угла, преобразовав это значение на микроконтроллере в цифровой вид??? Можно ли будет это реализовать на микроконтроллере который описан в этой статье (pic16f628a) или лучше использовать более сложный например (pic18f452) со встроенным АЦП который я изучал в университете?????

  14. Alex_EXE пишет 30.01.2012 в 22:39 #

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

    Можно попробовать замерить ток, когда он значительно возрастёт – серва во что-то упёрлась.
    Ещё как вариант на серву подавать управляющий сигнал не постоянно, а только пару секунд, за это срева уже успеет повернуться, а после прекращения подачи сигнала она останется в последнем положение, если только что-то не будет поворачивать её. Такой вариант снизит потребление тока, так же вы не столкнетесь с эффектом дребезжания сервы, который их изнашивает, и в котором они много кушаю.
    Другие варианты, кнопка/геркон или самим ограничить программно.
    Про внутренний резистор:
    Да он там есть, но его использует драйвер самой сервы, конечно к нему можно подключиться, но тогда вам придётся разбирать серву, так же такая модификация может помешать работе драйверу сервомашинки. Ещё эти резисторы изнашиваются и возможны неточные показания.
    Точности псевдо АЦП полученного на компараторе 628А пика вам должно хватить, то точно сказать не могу, т.к. сам эту конструкцию не видел (которой Вы думаете управлять).
    На счёт выбора контроллера: обычно он выбирается по нужному функционалу и по цене или по тому, что есть в наличие, или с чем есть опыт работы.
    На мой взгляд можно попробовать применить геркон и магнит приклеенный на двухсторонний автомобильный скотч.

  15. Алексей (Beood) пишет 01.06.2012 в 02:02 #

    Доброго времени суток. Сразу скажу что не особо разбираюсь в микроконтроллерах, и вопрос наверно глупый. А почему интервал 5730? Нам же нужно 10(20) мс это 100(50)Гц, при 20 МГц получается 200(400)К тактов на 1 интервал. Получается что функция «delay(х)» тратит по 35(70) тактов*х?

  16. Alex_EXE пишет 01.06.2012 в 10:12 #

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

  17. Андрей пишет 24.09.2012 в 19:39 #

    Добрый день. а возможно из этой схемы сделать так, чтоб серва возвращалась в среднее положение? т.е нажимаешь кнопку влево идет поворот влево, отпустил кнопку и серва сама вернулась в среднее положение, потом к примеру кнопка вправо, повернуласть вправо, отпустил, серва вернулась в среднее положение….весь инет уш перерыл ничего такого нет на пиках=(((

  18. Alex_EXE пишет 25.09.2012 в 18:30 #

    Возможно, нужно только подправить прошивку под свои нужды, исходники приведены в статье.

  19. Андрей пишет 25.09.2012 в 19:12 #

    Alex_EXE не поможите мне, а то в прошивках я вобще дуб..=((

  20. Андрей пишет 27.09.2012 в 19:58 #

    вот нашел, только не понятно почему демка….исходники то есть вроде…http://radioteh.nm.ru/shemes/telemeh/RC2005.htm

  21. Андрей пишет 27.09.2012 в 21:40 #

    или может пойдет вариант такой, к примеру, одна кнопка всегда зажата, например право, а при нажимании левой кнопки серва поварачивается влево, отпустил кнопку и серва т.к. зажата правая кнопка поворачивается вправо до упора?

  22. Магомед пишет 20.10.2012 в 17:03 #

    Хорошая статья, спасибо, прояснили, а то никак не мог найти даташит на мой сервопривод Tower Pro SG91R.

  23. Андрей пишет 22.03.2013 в 19:43 #

    Добрый день Alex_EXE. вы мне как то скидывали на почту прошивку с возвратом в центр. не могли бы вы исходник вот с этим возвратом в центр скинуть? И еще, то что возвращается в центр это класс, только как вот еще сделать чтоб быстрее серва работала? ну скорость увеличить…пробовал к самолету прицепить…тупит караул=((

  24. cybermerlin пишет 25.03.2013 в 02:00 #

    здравствуйте
    тоже вопрос из разряда новичок:
    1- у меня 16f630 покупал очень давно для других целей, но не случилось использовать… к этому времени уже толком все подзабыл… надо управлять 6ью sg90 (в синем корпусе такие).
    помогите, пожалуйста, схемку накидать как подключить их для независимого управления.
    2- и еще вопрос второстепенный — как бы сюда же организовать получение данных от встроенных в этом корпусе приводов потенциометров?
    —-
    с кодом я уж сам думаю разберусь, пока главная проблема схемотехника 🙁

  25. Alex_EXE пишет 25.03.2013 в 09:29 #

    Последнею неделю не мог найти времени, что бы ответить на скопившиеся комментарии и письма, а тут целый проект предлагают, извиняйте.
    Но кое-что разъясню:
    1.6-приводов хоть и потянет 630 (есть старый, к сожалению, не опубликованный проект по точному сервоконтролеру на 8 приводов, на 628А), но только, как ими управлять?
    2.У 630 мало интерфейсов, основных (UART,I2C,SPI) вообще не видно, а на реализацию (пишу на Си,на Ассемблере может и можно) памяти не хватит.
    3.Даже АЦП нет у 630, для подключения резисторов.
    4.Зачем значение с внутреннего потенциометра? (тем более, что без шаманства, связанного с полной переборкой сервы, сигнал с него не получить) Если сервопривод точно выставляется и удерживается в заданном вами положение?
    (Даташит не открывал, могут быть неточности)

  26. Дмитрий пишет 06.06.2013 в 10:24 #

    Здравствуйте уважаемый Alex_EXE.
    С контролерами дела я пока не имел,но возникла необходимость в упрвлении рулевой машинкой дискретно т.е.
    При подаче питания в схему устанавливается средне(как видно из видио) положение>при нажатии на s1 или s2 машинка принимает одно из крайних положений >при отпускании снова среднее положение (т.е. как будто питание сняли и опять подали.)
    Возможно ли как-топодправить прошивку чтоб выполнялся выше из ложенный алгоритм,без прерывания питания схемы?
    Очень нужно!!!!!!!!!

  27. Андрей пишет 03.09.2013 в 08:15 #

    Alex_EXE не могли бы вы мне скинуть прошивку с возвратом в цент про которую Дмитрий пишет. только желательно без задержки на возврат. т.е. нажали повернулась, отпустили сразу вернулась…

  28. илья пишет 15.10.2013 в 02:04 #

    я могу написать такую прошивку

  29. Alex_EXE пишет 16.10.2013 в 00:40 #

    Мои поздравления.

  30. Alex пишет 25.11.2013 в 02:16 #

    ребята, подскажите пожалуйста, пробовал уже и перепрошивать несколько раз, и фьюзы определяются как надо, все четко собрал, мотор Goteck GS-9025MG, но при включении дернется и все, больше на кнопки не реагирует. шью в microbrn на K150.

  31. Alex_EXE пишет 25.11.2013 в 22:49 #

    Схема собрана правильно? Если серва чуток дергается при включении, то это она так срабатывает на подачу питания, а вот от МК сигнала нет.
    Так же возможно микроконтроллер неправильно прошит, с программатором помочь не смогу — не знаком с ним. Другие МК и другие прошивки нормально прошиваются и работают?

  32. Alex пишет 26.11.2013 в 22:28 #

    схема собрана правильно. проверял уже все. микросхемы 3 штуки перепробовал, прошивал разными программаторами и программами. не работает. собрал все на 555 таймере, все работает. прошивку шил что в теме приклеена. может что с прошивкой? ничего не менял. единственное что, так это кварц поставил на 16 вместо 20.

  33. Alex_EXE пишет 27.11.2013 в 00:11 #

    От кварца идёт тактирование, изменяя его частоту Вы меняете все интервалы задержек и опросов внутри программы, с другой стороны: уменьшение тактовой частоты должно исказить работу, а не прекратить. Но луч же бы поставить 20МГц.
    Ещё, как вариант, Ваш программатора не может считать конфигурационные биты, в этом случае их нужно будет прописать вручную — 3D6A (Кварц — HS, Master Clear Enable, Brown Out Detect).

  34. lucifern пишет 29.11.2013 в 09:51 #

    Уважаемый автор,могу я вас попросить дополнить данную схему еще одним выходом для управления второй сервомашинкой? Чтобы по портам rb0 rb1 управление осуществлялось первой серво на rb6, а по портам rb2 rb3 — второй серво. И как вариант сделать управление не кнопками, а уровнями по входу. Например, пришла «1» на rb0 серво начало движение,пока присутствует «1»,серва выполняет те жже функции,что и при нажатой кнопке S1. И так для всех управляющих портов?

  35. lucifern пишет 29.11.2013 в 09:58 #

    Хочу на одном контроллере сделать повротную установку для камеры.Настройки пумть остануться такими же,но уже для двух сервомашинок. Благодарю!

  36. 3bit пишет 25.10.2014 в 00:42 #

    Cобрал схему, прошил при помощи pickit3 при старте двиг дергается но на кнопки не реагирует, прочитал комментарии и сменил перед повторной прошивкой Configuration bit, в итоге получилось (216A), прошил и заработало!!!

  37. Евгений пишет 06.09.2016 в 14:31 #

    Здравствуйте
    а можно добавить еще две сервомашинки с 4 кнопками ?
    и чтобы управление было независимое

  38. Alex_EXE пишет 06.09.2016 в 15:08 #

    Читайте дальше, следующая статья из этого цикла посвящена 4 независимым сервоприводам. А если посмотрите код, то нужное количество кнопок сможете сами задать.

  39. Ильдар пишет 27.01.2017 в 15:13 #

    Здравствуйте, подскажите пожалуйста, загружаю ваш hex файл в протеусе все работает, но если компилирую ваш файл С через Micro C то ничего не работает, в чем может проблема? при компиляции в Micro C ставил все возможные варианты по частоте

  40. Alex_EXE пишет 03.02.2017 в 23:45 #

    В проекте использовал компилятор HITECH 9.7, кажется. Код и макросы актуальны для него. Если использовать другой компилятор то нужно разобраться в его особенностях.
    Так же не все программаторы могут считывать фьюзы из прошивки, на некоторых эти параметры нужно каждый раз выставлять в ручную.

Комментарии RSS

Оставьте отзыв