Проектирую двунога на сервах. На первом этапе хочу сделать только ноги с 4 степенями свободы, потом добавить руки (3-4 DOF), и, возможно, увеличить число степеней свободы ног до 5-6. Встал вопрос, как всем этим хозяйством управлять, с помощью AVR -- по причине доступности, распространенности, да и просто потому, что нет сейчас желания изучать что-то еще. Рассмотрел варианты:
- Чисто программная генерация импульсов, по одному за раз - наихудший вариант, отброшен сразу
- Чисто аппаратная генерация импульсов -- с точки зрения точности , отличный вариант, но можно получить не более 6 каналов с чипа
- Задание длительности импульса с помощью одного таймера для всех каналов, с последовательным перебором ( см. SERVO - управление по i2c через ATmega8). Недостаток тот же - ограниченное число каналов.
- Чисто программная генерация импульсов, с предварительным заполнением таблицы, и затем с выводом из нее в порт. Преимущество метода в том, что за один проход можно обработать до 8 каналов. Недостаток - сильная загрузка контроллера, остается очень мало времени для общения с "внешним миром".
Победителем был признан последний метод

. Осталось решить проблему - как дать процессору достаточно времени для приема команд. Решил использовать второй контроллер, который будет принимать команды с шины I2C и сохранять их в буфере, а когда у первого контроллера есть время, он будет получать информацию через SPI. При частоте внешней шины I2C 100 КГц нагрузка на нее будет небольшой.
Получилось вот что: при тактовой частоте 16 МГц и 1МГц на SPI, можно получить до 40 каналов (если конешно у контроллера хватит ног

). Если же увеличить период импульсов до 25мс, то можно на ATMEGA128 сделать 48 каналов. Зачем так много? ну, просто потому что это круто

. Хотя, может пригодиться для кокой-нибудь гусеницы.
Для моих целей, для рук и ног хватит 20 каналов на руки и ноги. Если использовать AtMega32, получается 28 каналов (32 минус 4 для SPI) - остается запас для головы и кистей рук.
Выкладываю файлы в формате протеуса (схема + плата) и AVR studio (прошивки для 2 контроллеров). Хотелось бы услышать:
- предложения по оптимизации кода
- замечания по разводке платы. Опыта у меня очень мало. Не уверен насчет разводки SPI.
В настоящий момент, реализован простой протокол для управления по I2C:
[ S addr command number (position speed ) + P ]S - старт-состояние
command - код комманды. В настоящее время поддерживается только 0x01 - задание порядкового номера сервы.
number - порядковый номер сервы
position - положение, в которое установить серву. Задается в микросекундах.
speed - скорость, с которой двигаться к заданному положению. Задается в микросекундах за период (20 мс). Ноль - немедленное изменение положения
P - стоп-состояние
position и speed могут повторяться, при этом каждая последующая комбинация соответствует следующей по порядку серве
position и speed -- двухбайтный значения, сначала младший байт.
В планах -- добавить команды для перехода на управление в градусах, и установки индивидуальных характеристик серв (длительность импульса в центральном положении, соответствие между углом поворота и длительностью импульса и т.п.)
_________________
Проект
[[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине
shop.roboforum.ru
Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!