roboforum.ru

Технический форум по робототехнике.

Управление Сервами в WinAvr

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Сообщение avr123.nm.ru » 16 авг 2006, 21:23

Эх.... придется задачу в курс крапать по управлению SERVO !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Lirzman » 16 авг 2006, 21:37

Чему равна длительность '0', если переод равен 20мс, а длительность '1'  равна 1,5 мс?

20-1.5=18.5
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение aesok » 17 авг 2006, 00:21

Lirzman писал(а):
Чему равна длительность '0', если переод равен 20мс, а длительность '1'  равна 1,5 мс?

20-1.5=18.5


Добавте это пожалуйста в программу.

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение Lirzman » 17 авг 2006, 00:23

Я наконец въехал, неполучалось из-за подмены понятий. :D
Через 5 минут выложу псевдокод
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение 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:  :shock:
Последний раз редактировалось Lirzman 17 авг 2006, 01:03, всего редактировалось 1 раз.
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Сергей » 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);
}
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Сообщение Lirzman » 17 авг 2006, 01:02

Спасибо, исправил :D
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Lirzman » 17 авг 2006, 01:05

Так что мне с последней проблемой делать?

Не писать же таблицу соответствий для углов поворота/тиков таймера??? :shock:

Во-первых можно не писать else, пиши подряд if, так тоже работает.

А что в псевдокоде строгие правиля синтаксиса тоже есть? :D  :D  :D
Последний раз редактировалось Lirzman 17 авг 2006, 01:06, всего редактировалось 1 раз.
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Lirzman » 17 авг 2006, 01:07

Какая разница?
Главное что-б людям понятнее было.
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Lirzman » 17 авг 2006, 01:13

Слушай, а зачем делатьэто все на таймере1, ведь вроде это может и с таймером0 уместиться.

Страницы на 3-4 назад отмотай и все поймешь
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Сергей » 17 авг 2006, 01:13

Да, главное чтоб понятней =) ну по-крайней мере псевдо код нужно писать покороче, ну а потом уже расписывать как нужно.., я так считаю.)
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Сообщение Lirzman » 17 авг 2006, 01:16

ну по-крайней мере псевдо код нужно писать покороче

Ладно проехали(уже написал). :D
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Сергей » 17 авг 2006, 01:20

Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Здесь объясни пожалуйста, как период может быть равен 1,  если он должен быть равен 20мс? или я не в том направлении мыслю?
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Сообщение 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:  :shock:


Еще один плюс!!!! Да сложением. Еще раз проанализируйте как работает таймер, и попытайтесь понять почему именно сложением.

wait(servo_time_X); - это TCNT1=servo_time_X;
И у вас практически готовый код обработчика прерывыний таймера!!!

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение Сергей » 17 авг 2006, 01:27

Сергей писал(а):
Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Здесь объясни пожалуйста, как период может быть равен 1,  если он должен быть равен 20мс? или я не в том направлении мыслю?

Фу, блин, дошло=)
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17