Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать. Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил. Робот своими руками. Самодельный робот.
Кратко: нада чтобы вытащили именно все то что относится к сервам. Я хочу просто к примеру потом в МК прошить програмку содержащую Этот блок для у правления сервами. Тоесть не скомпа рулить а так, програмно. Просто я прочитал код и чото не во что не врубился тк не мой уровень еще. Ваш курс я прочитал, и мне все понятно и все записываю как и говорили. Я просто не про именно функции говорил которые исп компилятор АВР, а про всякие остальные ф-ции в коде. Сорри если коряво написал.
*Серва работает так: каждые 20мс делается прерывание от 1 до 2мс. Чтобы сделать прерывания нужен таймер. Помойму таймер1 нужен. Расчитать таймер исходя из того что у мя внешний кварц на 16мГц. Как я знаю, таймер тикает постоянно независимо от остальных процесов. (если его включить) Чтобы включить серву нада подать на нее сигнал. *Чтобы подать нее сигнал нада нада сделать функцию которая будет выставлять значение задержек(от 1 до 2мс) и подвать сигнал таймера на какуюто опр ногу МК. (Дело в том, что некоторые говорят что можно управлять несколькими сервами одновременно на любых портах, а некоторые говорят что это не так ибо есть спец ноги для ШИМ). *К примеру, нужно сделать механическую руку на сервах. Для хорошего позиционирования нужно чтобы сервы могли двигаться одновременно и в разных направлениях. (Вообще, я оч много слышал что когда делают позиционирование серв, значения позиции могут быть от 0 до 255 те 256 позиций сервы) Ну первое что мне приходило в голову это вот типа такого кода: set_position(PORTB, 0xff, 175) set_position(PORTD, 0xff, 234) и тд В Си насколько я знаю, код читается сверху вниз. Значит МК читает функции сверху вниз НЕ задерживаясь на какойлибо ф-ции ожидая ее выполнения, а команды читаются просто сверху вниз и выполняются таймером который тикает постоянно. ---- Ну вот примерно так. Я наверно еще чтото упустил, но Вы задайте вопросы если что.
.... блин, щас чото задумался. Если таймер один, то тогда можно удет управлять только одной сервой? Как один и тотже таймер сможет делатть столько прерываний? причем разных... Или ему пофигу?
Сергей писал(а): *Серва работает так: каждые 20мс делается прерывание от 1 до 2мс.
сразу старайся точно и грамотно формулировать свои мысли! 1-я стр. курса
я б сформулировал так:
avr123.nm.ru писал(а):- для управления положением вала servo необходимо ножкой МК каждые 20 мС создавать управляющий положительный импульс, длительность которого оределяет положение вала сервы и может находится в пределах от 800 до 2200 мкС при этом длительность ипульса 1500 мкС соответвует среднему положению вала сервы.
сразу чувствуется что нужны прерывания хотябы каждые 20 мС
Сергей писал(а):Чтобы сделать прерывания нужен таймер. Помойму таймер1 нужен.
Расчитать таймер исходя из того что у мя внешний кварц на 16мГц.
Как я знаю, таймер тикает постоянно независимо от остальных процесов. (если его включить)
лучше 8 битный таймер_0 задействовать.
и ГЛАВНОЕ в задачах моего курса есть пример как это сделать с таймером_0 - в задачах 1, 3, 3new и по моему 8. Посмотри там сам.
НО !
Кварц лучше ВСЕГДА брать UART'овский (см таблицу в ДШ на МК) - потому как потом захочется связать свою штуку с ПК например иль с другим устройством на стандартной скорости COM порта - а попрут ошибки.
Сергей писал(а):Чтобы включить серву нада подать на нее сигнал.
опять не точность - а она повлечет за собой ошибки...
Чтобы включить серву надо подать на нее ПИТАНИЕ ! от 4.8 до 6 вольт обычно.
Сергей писал(а):*Чтобы подать нее сигнал нада нада сделать функцию которая будет выставлять значение задержек(от 1 до 2мс) и подвать сигнал таймера на какуюто опр ногу МК.
я предлагаю чуть иначе - прямее, "в лоб"
пусть серв 4, тогда будем прерваться по переполнению Timer_0 каждые 5 мС а в обработчике прервания поствим счетчик для номера текущей сервы
// в этом месте программы номер сервы может быть от 0 до 3
........
// после выдачи импульса servo_ctr++; // увеличить номер сервы на 1
if (servo_ctr > 3) { // если номер сервы уже 4 servo_ctr = 0; // сделаем его 0 }; // Я СПЕЦИАЛЬНО НЕ ПИШУ if В ОДНУ СТРОЧКУ !!! // и ученикам не советую !
// и в этом месте программы номер сервы может быть от 0 до 3
между прерываниями мы вычисляем или задаем нужные положения серв, и храним их в глобальном (т.е. доступном в любом месте программы - значит объявленом вне {} скобок какой либо функции программы !) массиве из 4 переменных, например:
unsigned int servo_pos[3] = {1500,1500,1500,1500}; // требуемая длительность импульса в мкС для servo номер servo_ctr
======= дальше:
Что думаешь? что делать?
Есть у нас нужное время импульса и есть 4 прерывания по числу серв, каждые 5 мС
Сергей писал(а):некоторые говорят что можно управлять несколькими сервами одновременно на любых портах
Конечно.
Сергей писал(а):а некоторые говорят что это не так ибо есть спец ноги для ШИМ
для ШИМ АППАРАТНОГО есть спец ноги, а для софтверного любая нога подойдет,
но в наем случае ШИМ не нужен, хотя сигнал и похож на ШИМ с очень большой скважностью.
Сергей писал(а):В Си насколько я знаю, код читается сверху вниз.
Значит МК читает функции сверху вниз НЕ задерживаясь на какойлибо ф-ции ожидая ее выполнения, а команды читаются просто сверху вниз и выполняются таймером который тикает постоянно.
НЕТ ! а говоришь мой курс читал .......
Код можно читать как угодно и как удобно.
А выполняется он согласно его содержанию.
Функция, после вызова в программе, исполняется до конца и затем происходит возврат к месту после знака ; за местом вызова функции.
Однако выполнении функции может быть прервано: - прерыванием - сбросом МК (не с высоты!) по нескольким причинам - вызовом другой функции из исполняемой щас функции, тогда возможен возврат обратно - безусловным или условным переходом в место программы вне этой функции
Сергей писал(а):.... блин, щас чото задумался.
Это круто! я мыслю - я живу...
Сергей писал(а):Если таймер один, то тогда можно удет управлять только одной сервой?
Как один и тотже таймер сможет делатть столько прерываний? причем разных...
Или ему пофигу?
Ему и правда пофигу - он же "железный"
А может то он может, но мы не будем на него наваливаться скопом, есть ведб и другие таймеры в МК
я на ATmega16 намекаю например...
===============
Напоминаю - "согласно традициям гостеприимства" и стр. 1 курса
у тебя не должно остаться чего либо не ясного из того что я написал, читай записывай что не ясно,
Ох трудное это дело, шим для начинающих, впору уже учебник писать... :wink: avr123.nm.ru респект! Я б столько не выдержал, сам бы написал и отдал в готовом виде... :roll:
avr123.nm.ru, замечательно и подробно написал! Поддерживаю Александра в плане респекта! Только сдержаннее надо быть, коли учить взялись, ИМХО. Это я о вот этом: Сергей: .... блин, щас чото задумался Вы: Это круто! я мыслю - я живу...
Поддерживаю всех насчет респекта))) --- КодВизион у меня есть, я на нем пишу. Еще пишу в АВРСтудио. ВМлаб у меня тоже есть, только я его не юзал. Почему? Както он мне не приглянулся, винить меня за это не надо. Я все делаю вживую. Все паяю и не жалею. --- На днях прочитаю курс заного. --- Русский язык у мя точно хромает))) --- До меня чото всетаки не доперает... щас еще посижу подумаю.