Технический форум по робототехнике.
avr123.nm.ru » 16 авг 2006, 21:23
Эх.... придется задачу в курс крапать по управлению SERVO !
Lirzman » 16 авг 2006, 21:37
Чему равна длительность '0', если переод равен 20мс, а длительность '1' равна 1,5 мс?
20-1.5=18.5
aesok » 17 авг 2006, 00:21
Lirzman писал(а):Чему равна длительность '0', если переод равен 20мс, а длительность '1' равна 1,5 мс?
20-1.5=18.5
Добавте это пожалуйста в программу.
Анатолий.
Lirzman » 17 авг 2006, 00:23
Я наконец въехал, неполучалось из-за подмены понятий.
Через 5 минут выложу псевдокод
Lirzman » 17 авг 2006, 00:39
Вот псевдокод, взята за основу ваша(aesok) картинка(2 стр назад)
Для кратости привожу в примере только 3 сервы
- Код: Выделить всё • Развернуть
cur_servo;//серва на которую подаём сигнал в данный момент
if(cur_servo=1)
{clear_bit(3);
set_bit(1);
cur_servo=2;
wait(servo_time_1);
}
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)
{clear_bit(2);
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}
Вот так всё просто, если не сказать элементарно.
!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?
Может сложением?
:shock: :shock:
Последний раз редактировалось
Lirzman 17 авг 2006, 01:03, всего редактировалось 1 раз.
Сергей » 17 авг 2006, 01:01
Во-первых можно не писать else, пиши подряд if, так тоже работает.
Во-вторых у тебя есть маленькая опечатка:
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)
{clear_bit(1); <<<<<<< Здесь должен быть бит 2. Ну сказал на всяк случай чтоб другие не путались.
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}
Lirzman » 17 авг 2006, 01:02
Спасибо, исправил
Lirzman » 17 авг 2006, 01:05
Так что мне с последней проблемой делать?
Не писать же таблицу соответствий для углов поворота/тиков таймера???
Во-первых можно не писать else, пиши подряд if, так тоже работает.
А что в псевдокоде строгие правиля синтаксиса тоже есть?
:D :D
Последний раз редактировалось
Lirzman 17 авг 2006, 01:06, всего редактировалось 1 раз.
Lirzman » 17 авг 2006, 01:07
Какая разница?
Главное что-б людям понятнее было.
Lirzman » 17 авг 2006, 01:13
Слушай, а зачем делатьэто все на таймере1, ведь вроде это может и с таймером0 уместиться.
Страницы на 3-4 назад отмотай и все поймешь
Сергей » 17 авг 2006, 01:13
Да, главное чтоб понятней =) ну по-крайней мере псевдо код нужно писать покороче, ну а потом уже расписывать как нужно.., я так считаю.)
Lirzman » 17 авг 2006, 01:16
ну по-крайней мере псевдо код нужно писать покороче
Ладно проехали(уже написал).
Сергей » 17 авг 2006, 01:20
Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?
Здесь объясни пожалуйста, как период может быть равен 1, если он должен быть равен 20мс? или я не в том направлении мыслю?
aesok » 17 авг 2006, 01:22
Lirzman писал(а):Вот псевдокод, взята за основу ваша(aesok) картинка(2 стр назад)
Для кратости привожу в примере только 3 сервы
- Код: Выделить всё • Развернуть
cur_servo;//серва на которую подаём сигнал в данный момент
if(cur_servo=1)
{clear_bit(3);
set_bit(1);
cur_servo=2;
wait(servo_time_1);
}
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)
{clear_bit(2);
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}
Вот так всё просто, если не сказать элементарно.
Отлично 4 с 2 плюсами!!!!!
!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?
Может сложением?
:shock: :shock:
Еще один плюс!!!! Да сложением. Еще раз проанализируйте как работает таймер, и попытайтесь понять почему именно сложением.
wait(servo_time_X); - это TCNT1=servo_time_X;
И у вас практически готовый код обработчика прерывыний таймера!!!
Анатолий.
Сергей » 17 авг 2006, 01:27
Сергей писал(а):Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?
Здесь объясни пожалуйста, как период может быть равен 1, если он должен быть равен 20мс? или я не в том направлении мыслю?
Фу, блин, дошло=)