roboforum.ru

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

 

Засадка: Куча серв +I2C +UART (ну конечно я про шлюз-МК-ПК)

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

Засадка: Куча серв +I2C +UART (ну конечно я про шлюз-МК-ПК)

Сообщение =DeaD= » 04 окт 2006, 19:36

Итак имеем:
0. АТМега16, ну пусть 16МГц;
1. I2C на 100КБит/с;
2. UART скажем на 57600КБит/с;
3. 24 сервы которыми хочется поуправлять не теряя пакетов с I2C и UART'a.

Слабонервным выйти из темы :)

Попробуем решить:
1. I2C будет хавать байты через TWI с частотой не более 11Кбайт/сек;
2. UART соответственно не более 7.2Кбайт/сек;

Получается чтобы не терять байтики мы должны забирать их с частотой не менее 20'000 раз в секунду. То есть спокойно что-то делать мы можем только в течение 16'000'000/20'000=800 тактов.

После чего надо будет вернуть управление.

Теперь про сервы - их надо рефрешить с частотой 50Гц импульсами от 0.9 до 2.1 мс.

В 1 мс помещается 16'000 тактов.

То есть если сделать там 120 делений, то при помещении их в 1.2мс это будет 160 тактов на 1 деление.

Получается оптимальный вариант - повешать таймер, чтобы он каждые 10мкс выставлял на всех портах нужные значения за не более чем 50 тактов, а затем давал поработать остальным.

Я нигде не ошибся?
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение =DeaD= » 06 окт 2006, 20:58

Пришла в голову такая интересная мысль - если ШИМ надо выдавать длиной не более 2.1 мс, но в то же время частота больше 50Гц (20мс на период) не нужна, то получается в каждый момент времени по прерыванию таймера можно заниматься не более чем 3 сервами - тогда мы сможем спокойно укладываться в короткое время обработки по таймеру и остальное время выполнять основную программу.
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение =DeaD= » 07 окт 2006, 21:35

Задачка решена :) (разумеется на основе "мысли" в предыдущем сообщении)

Собран прототип:

Могу рулить 24 сервами одновременно (нет, разумеется я проверял только ограниченно это :)) на Меге16 на 1МГц с 10 делениями по углу поворота.

Соответственно на 16МГц кварце спокойно смогу рулить 24 сервами со 100 делениями по углу поворота.
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение EIN_ENGEL » 10 окт 2006, 00:32

а что за сервы? У меня хайтек управляются импульсами 1.1-1.8, с 1.5 в середине.
Я делал на контроллере - заигается весь порт, а потом по одному выключаются биты. Получается одновременное управление. Но при этом никакой основной программы на контроллер не возлагалось, только передатчик от компа к сервам, через РС-232.
Аватара пользователя
EIN_ENGEL
 
Сообщения: 495
Зарегистрирован: 06 янв 2006, 03:02
Откуда: Москва
прог. языки: VHDL, C++, Matlab

Сообщение =DeaD= » 10 окт 2006, 07:21

EIN_ENGEL писал(а):а что за сервы? У меня хайтек управляются импульсами 1.1-1.8, с 1.5 в середине.
Я делал на контроллере - заигается весь порт, а потом по одному выключаются биты. Получается одновременное управление. Но при этом никакой основной программы на контроллер не возлагалось, только передатчик от компа к сервам, через РС-232.

Так все сервы управляются импульсами ориентировочно от 1 до 2мс с центром в 1.5мс.

Что значит на контроллер не возлагалось ничего? А зачем он у вас тогда вообще был? Или может я не правильно понял ваше "основной программы"? :)
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов


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

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

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

Mail.ru counter