Сдвиговые регистры и ШИМ
- Войдите на сайт для отправки комментариев
Пт, 18/01/2013 - 09:24
Здравствуйте! У меня есть глупый вопрос - при использовании сдвиговых регистров, возможно организовать ШИМ на выводах регистра? Ну например, светодиодная RGB матрица 8х8, используем регистры для экономии выводов МК. Можно ли организовать ШИМ для каждого светодиода?
Теоретически - да, практически - нет.
С какой-то частотой дергать выводами сдвигового - можно. Но гиморойно и частота выйдет такой низкой, что, опят-таки чисто формальному определению (под него может попасть и переключение ноги раз в минуту) это все равно будет ШИМ, но вот в обычно-бытовом смысле, это ШИМ-мом никак нельзя уже назвать будет.
Регулировать яркость на матрице - можно. Если вы используете динамическую индикацию (это когда вы не "светите все сразу", а бегаете зажигаете строки по очереди), то если для каких-то колонок вы будете "пропускать проходы" или время "свечения строки" уменьшите - у вас выйдет пониженная яркость..... но опять-таки грань между "светит тускло" и "уже видно мерцания" - будет очень тонка и зависима от индивидуальных свойст зрения и внешнего освещения.
Итого: на сдвиговых толком не сделаешь.
Есть специальный микрухи "расширители портов" (Port Extender). Вот они (не все, есть которые тоже без шима). Умеют, к примеру по I2C принять команду "включи PWM на таком-то выходе". И держать там PWM самостоятельно.
А есть подвид этих "расширителей", которые именно для руления LED-ами предназначен (google: i2c led driver)
Первое что нагуглилось http://www.nxp.com/documents/data_sheet/PCA9685.pdf
Вообщем "просто и удобно", но... боюсь по цене или сложность достать может оказатся не гуманно (хотя может и недорогие есть, не исследовал эту тему).
И третий вариант (не знаю хорош ли он, но лично мне по душе): поставить еще одну atmega8, возможно даже без кварца. Именно для руления матрицей. Вариант "по душе", потому что и по цене сопоставимо с расширителями (или даже дешевле) и простор для "кастомной логики" - шире. Можно на ней как и логику расширитиля воспроизвести (команды вида: включи PWM на ноге N), так и более высоукровневые команды реализовать (включи диод в строке X, колонке Y, на яркость B). Что позволит снять часть нагрузки с основного контроллера, упростить основную логику.
Ух ты) Спасибо за такой развернутый ответ) То есть проще взять две atmega8, одна управляет матрицей, другая - посылает комманды на включение светодиодов. Я так понимаю компактность сохраняется))(я про SMD версии) Тогда чуть немного другой вопрос- получится ли в этом случае управлять светодиодами "ловко"(другое на ум не приходит). Ну например - волна из плавно изменющися rgb цветов. Или еще смайлик, который плавно переливается цветами.
Если нужен 1 ШИМ на все ноги регистра, то можно извернуться достаточно просто - взять ногу с ШИМом и подклють ее к выводу OE (выбор, включение выходов...) регистра. Тогда все ноги регистра будут переходить в высокоомное состояние вместе с ШИМом на выбранной ноге контроллера. Если же нужны независимые ШИМы, то придется организовывать ШИМ программно в буфере и при каждом изменении любого бита буфера "выплевывать" этот буфер через SPI во внешний регистр. Процентов 50 вычислительных ресурсов процессора убъете гарантировано! Еще сильно зависит от частоты ШИМа. Если занизить, то проц разгрузится, но управлять можно будет только нагревателями :)
Так что "программный ШИМ на внешнем регистре" можно рассматривать чисто как "спортивную" или "образовательную" задачу.
По поводу последнего вопроса - если на это нагрузить отдельный проц, то можно. Желательно без внешних регистров - ногами процессора. Кроме того, если возмете мегу, то там много ног с ШИМами - можно обойтись аппаратными даже с динамической индикацией.
Не знаю, хватит или нет) Там в матрице 64 светодиода. И подключение хитрое. 32 пина на выходе.
Не знаю, какой atmega хватит)) Готовится маленький проект))
Если поверить автору на слово, то его поделка (http://www.elcojacobs.com/shiftpwm/) позволяет управлять 4 сдвиговыми регистрами (32 канала?), обеспечивая частоту ШИМ 200 Гц и разрешение 256 уровней. Плата за это - 86% процессорного времени.
А ведь можно и проверить...
86 % процессорного времени - это в каком смысле? Приведите простой пример. А то не получается понять))
Я развлекался ШИМом на сдвиговом регистре с одним RGB светодиодом. Мне не понравилось - частоты не хватает.
http://arduino.ru/forum/programmirovanie/programmnyi-shim-na-sdvigovom-registre
100-86=14
На все остальные нужды остается 14% процессорного времени (около одной седьмой). Микроконтроллер, работающий на частоте 16 МГц, по своим возможностям примерно равен микроконтроллеру, работающему на частоте 2 МГц.
интерено,а если взять декодер(не помню как точно называеться) который делает 1->8 при помощи 3-ех ног control.эту единственную ножку подцепить на ШИМ микроконтроллера,3-мя упрявлять какая из 8-выходов будет получать ШИМ от микрухи.а 8 выходов,скажем, к катодам матрицы.а к анодам матрицы подключить 74959,толк будет?
AlexFisher, "По поводу последнего вопроса - если на это нагрузить отдельный проц, то можно. Желательно без внешних регистров - ногами процессора. Кроме того, если возмете мегу, то там много ног с ШИМами - можно обойтись аппаратными даже с динамической индикацией."
C помощью каких МК организовать? Сколько их примерно нужно? Например ATMEGA8 имеет всего то 3 вывода с ШИМ. Какие atmega взять?
Я имел в виду Arduino MEGA 2560
Там 14 выходов с ШИМ., у Leonardo их 7
Вам нужно 8 (для строк), столбцы "уходят" на динамическую индикацию. Иначе говоря, 8ШИМ+24=32 выхода. На МЕГЕ можно сделать без регистров. Иначе - только программный ШИМ
Кстати, на Leonardo есть таймер 2 и еще две ноги для ШИМа. В старых даташитах нарылось как то (в новых уже нет), плюс это еще и работает, правда я сам не пробовал. Понятно, что это недокументированная фича, но, кто знает, может кому не хватает одного или двух пинов с ШИМом.
У Леонардо именно за счет дополнительных таймеров больше выходов с ШИМом, чем у УНО
http://www.youtube.com/watch?v=lsxbQ1sCM9A
Вроде шим есть. На каждый элемент или нет, сказать не могу.