- Чисто программная генерация импульсов, по одному за раз - наихудший вариант, отброшен сразу
- Чисто аппаратная генерация импульсов -- с точки зрения точности , отличный вариант, но можно получить не более 6 каналов с чипа
- Задание длительности импульса с помощью одного таймера для всех каналов, с последовательным перебором ( см. SERVO - управление по i2c через ATmega8). Недостаток тот же - ограниченное число каналов.
- Чисто программная генерация импульсов, с предварительным заполнением таблицы, и затем с выводом из нее в порт. Преимущество метода в том, что за один проход можно обработать до 8 каналов. Недостаток - сильная загрузка контроллера, остается очень мало времени для общения с "внешним миром".
Получилось вот что: при тактовой частоте 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 -- двухбайтный значения, сначала младший байт.
В планах -- добавить команды для перехода на управление в градусах, и установки индивидуальных характеристик серв (длительность импульса в центральном положении, соответствие между углом поворота и длительностью импульса и т.п.)