Автор статьи:
Predator
В предыдущей статье было описано,
как создать проект на ПЛИС, получить и отладить прошивку и зашить её в микросхему. Теперь перейдем ближе к робототехническим делам. Самым распространенным робототехническим делом является получение информации от сенсоров и управление механизмами. Вот управлению механизмами эта статья и посвящена. Обычно робототехнические механизмы построены на основе электродвигателей, шаговых двигателей, соленоидов, сервомашинок. Управлению двигателями и соленоидами ПЛИС сильно не помогут (об этом писать не будем), а вот сервомашинки - великолепное поле деятельности для ПЛИС. Сервомашинки бывают "аналоговые" и "цифровые", аналоговым на вход нужно подать напряжение; цифровым - поток ШИМ-импульсов. В принципе это несложно сделать с помощью контроллера, особенно того, у которого есть встроенный модуль ШИМ, но при применении цифровых сервомашинок возникает нюанс: для большинства машинок скважность должна быть от 20 и более. То есть от 256 шагов модуля ШИМ контроллера остается порядка 16 шагов, что не всегда приемлемо. Кроме того, для построения, например, шагающего робота приходится применять несколько сервомашинок (иногда до десятка и более). Все эти казусы приводят к тому, что приходится делать программную ШИМ, и котроллер только и занимается её генерацией (не говоря уже о сложности кода). Вот для решения этих проблем я и предлагаю применить ПЛИС.
О создании проекта и схемы уже написано, перейдем сразу к делу: ядром системы является счетчик импульсов и компаратор (рис. 1).

Рис. 1
(рисунок кликабелен для увеличения, откроется в новом окне)
Сия система работает следующим образом: счетчик считает (неожиданно, не так ли?) импульсы clk, досчитывает до константы, поданной на порт "B" компаратора (в нашем случае она равна 0000 1010 0000 0000 =2560), сбрасывается в 0, и так по кругу. Одновременно со сбросом счетчика взводится в 1 один из выходов ШИМ и стоит в 1, пока счетчик не досчитает до значения, записанного в регистр, после этого сбрасывается в 0. Регистр у нас 8-битный, поэтому записать туда можно от 0 до 255 - получаем модуль ШИМ - на диапазон от 1/2560 до 256/2560. Осталось, собственно, положить значение в регистр. Значение мы планируем получать извне, посредством, например, SPI-интерфейса (рис. 2).

Рис. 2
(рисунок кликабелен для увеличения, откроется в новом окне)
Здесь простой регистр сдвига на 12 бит и 4-битный дешифратор канала ШИМ (не ради одного канала мы это затеяли). 4 старших разряда, первыми попавшие в SPI- канал, представляют собой адрес канала ШИМ, куда прописываются младшие 8 разрядов. Разрешение на запись в канал выставляется после снятия сигнала SPI_CE, а если вернемся на рис. 1, то можем заметить, что запись в регистр выполняется по такту SPI_CLK - это потребует еще одного такта SPI_CLK, но нам это несложно. Можно, конечно, записать по такту CLK, но, во-первых, это заставит переписывать значение каждый такт (в принципе ничего страшного, просто электричество дополнительно будет кушать), а во-вторых, приведет к соревнованию фронтов сигнала WE(x), генерируемого на тактовой SPI_CLK и самого CLK.
Симулируем 1 канал (рис. 3). Чтобы убедиться, что он в принципе работает, прописываем через SPI нужное значение (я прописал 255), смотрим на тайминги ШИМ и видим необходимую скважность (с точностью до установки курсоров).

Рис. 3
(рисунок кликабелен для увеличения, откроется в новом окне)
Пришло время добавить каналов в схему. Для этого придется увеличить размер страницы: Edit -> Change Sheet Size. Берем группу из регистра, компаратора и выходного триггера и клонируем (с помощью копи-паста), поправляем наименования цепей - 16-ти канальный ШИМ-контроллер готов (рис. 4).

Рис. 4
(рисунок кликабелен для увеличения, откроется в новом окне)
Исходники:
plis_pwm.zip - исходные файлы проекта
Автор:
Predator
13.01.2013