analogWrite() на любом выводе
- Войдите на сайт для отправки комментариев
Втр, 05/02/2013 - 06:37
Не раз уже поднималась тема о генерации ШИМа на любом из выводов или на всех выводах сразу. Написал простенькую библиотеку, которая позволяет Ардуино программно генерить 8-ми битный ШИМ на любом из выводов. Библиотека использует TIMER2, тестировалась только на Atmega48/88/168/328, то есть Uno, Duemilanove, Nano и т.п.
И так. Качаем архив, распаковываем его как обычно в ...\arduino-1.х\libraries\ , запускаем IDE, в примерах должна появиться вкладка PWM и в ней 3 примера.
Описание функций:
Пример:
Видео
Понятненько. Интересная библиотечка.
Для леонардо и меги редактируем файл pins.h согласно пин-маппингу.
В итоге все пришло к тому, что как таковая библиотека не нужна.
Создайте в своем проекте новую вкладку с именем PWM:
и копируйте туда это содержимое:
пример кода:
P.S. #define ALL задействует все 20 выводов дуины.
У меги и так шимов много. Для меги имеет смысл применять только на выходы больше 20.
С другой стороны, либа позволяет высвободить таймер1 для себя :)
На 8 меге гугаетсо
А так хочется ещё пару ножек с ШИМ"мом :(
Потому что на меге8 отсутстует таймер2.
Можно немного глупый вопрос, а первый можно задействовать?
Конечно можно. По аналогии можете сделать, только лучше делать сразу для конкретных выводов ,тогда работать будет быстрее.
Тоесть все что имеет в тексте TCCR2A, TCCR2B, OCR2A, TIMSK2, TCCR2B, TIMER2_COMPA_vect изменить на 1 или как?
Вот бы как в дуинки уно... тоесть как в меги 328 были все ноги что поддерживают ШИМ имели поддержку у меги 8-й.
Почти, только таймер1 16битный, а следовательно некоторые регистры состоят из младшего и старшего реистров.
Например на OCR1A компилятор ругнтся так как он 16-битный и состоит из OCR1AH и OCR1AL.
Понятно... что ничего непонятно...
Просто сменить 2-ки на 1-ки неполучилось.
Понятно... что ничего непонятно...
Просто сменить 2-ки на 1-ки неполучилось.
atmega88 - не?
Я пользуюсь ATmega8A-PU.
Я пользуюсь ATmega8A-PU.
Можно ведь постепенно переползать на более современные камни - по сравнению с мега8-й разницы не заметите, но присутсвуют плюшки аппаратной и программной совместимости с фирменными дуино.
Можно, но пока будут современные камни плыть из Китая перебиваться буду тем что есть.
Не плохо ! На меге мне удалось максимум задействовать 14 пинов! А реально их все задействовать под "ШИМ" имея в виду 54 пина? Тут в ...\PWM\PINS изменения сделал, надеясь хотя б 32 зажечь
для экперимента, без успешно! (( Или я не там прописал !??
Еще нужно файл PWM.cpp подправить:
Если процессорного времени хватит, то можно и все 54 задействовать, если же нет то нужно разрядность ШИМа понижать.
Большое спасибо за быструю реакцию! Попробывал предварительно : сменил в PWM.cpp начинку на предложенную, дополнив сразу до 54 пинов! и в ...\PWM\PINS не забыл . И все тоже самое работают в ШИМе только PB4-PB7(10-13),PD0-PD3(18-21)! ( И ещё, если делаю в скетче доп.ю инициализацию в
void setup()
{pinMode(0, OUTPUT);pinMode(1, OUTPUT);........pinMode(54, OUTPUT);
analog.Mode(0, OUTPUT);analog.Mode(1, OUTPUT);..........analog.Mode(54, OUTPUT);}
то начинает работать и PC0-PC4,PD7(33-38)! ( Вроде правильно вычислил..) А остальные молчат !(( А хотелось бы научиться,надеюсь это возможно, на всех портах(пинах) МЕГИ... Может что ещё мы не сделали??
Выводы на выход в этом случае можно настраивать целыми портами:
попробуйте снизить частоту:
и уменьшить разрядность:
СПАСИБО Максим!
И так. Качаем архив, распаковываем его как обычно в ...\arduino-1.х\libraries\ , запускаем IDE, в примерах должна появиться вкладка PWM и в ней 3 примера.
Перезалейте пожалуйста архив.
Перезалейте пожалуйста архив, по Вашей сылке битый.
http://webfile.ru/7d24c4665bbe34036aad195a00b72bdc
Тоже хочу использовать составной 2-х монитор, но есть информация о 4-х или 6-х рамочном + контроллерном объединителе.
Какая у вас модель?
Спасибо.
а вот частоту следования шим, можно изменить, повысить до 3кгц?
Нет.
А какая частота программного ШИМа? На глаз мерцание не заметно, понятно что больше 24 герц.
Да фиг его знает какая, измерьте. А насчет не видно... я например и 3 кГц вижу - когда взгляд отводишь в сторону видны шлейфы.
Может чуть позже выложу данную либу с возможностью задавать выводы до компиляции кода (через директивы препроцессора), а управление выводами через asm-вставки будут организованы, что сэкономит "пару" тактов на обработку кажного вывода. В результате можно будет при небольшом количестве выводов значительно увеличить частоту.
Как обещал - новая версия либы. Старую удалить. Как таковая библиотека отсутствует, все находится в файле PWM.ino, который вложен в примеры.
Пример:
PWM.ino:
P.S. #define ALL задействует все 20 выводов дуины.
Спасибо :)
то есть выше 490гц нельзя? синусоиду с частотой 400гц на ноги вывести невозможно?
Почему 490? Как увеличить частоту аппаратного ШИМа читайте тут. Здесвь же программный ШИМ и частота зависит от предделителя и количества задействованых выводов.
4 вывода. один с опорнойй синусоидой а 3 - фазные смещенные относ друг друга на 120. как это грамотно описать?
У меня данная библиотека конфликтует IRRemote на UNO (обе используют TIMER2)
Можно ктото задействовал TIMER1 ?
Или проще IRremote перенастроить ?
Можно сделать как хотите. Как изменить эту любу обсуждалось, а в IRremote есть возможность поменять таймер.
Можно сделать как хотите. Как изменить эту любу обсуждалось, а в IRremote есть возможность поменять таймер.
Спасибо. Таймер поменял в IRremote. Все заработало с пол-пинка
Почему 490? Как увеличить частоту аппаратного ШИМа читайте тут. Здесвь же программный ШИМ и частота зависит от предделителя и количества задействованых выводов.
я о том, можно ли в analogwrite записывать чаще чем 490гц?
суть моей проблемы в том что в analogwrite пишутся значения из массива (256 значений описывающих один период синусоиды). генерируется несущая у которой должна быть частота 400гц на выходе. с частотой шима в 490 я никак не смогу записать 400*256=102400значений в секунду. какие есть варианты?
Не получилось скачать архив. Было интересно посмотреть что там.
Использую эту библиотеку на Arduino Nano. Подключены 1.8 inch TFT color display (HY-1.8 SPI), часы DS1302, датчик температуры и влажности DHT11, энкодер, кнопка и блютуз. На дисплей вывод время/температура, уровень яркости RGB светодиодов. Светодиоды подключены к аналоговым выходам ( analog.Mode(17, OUTPUT); // R и дальше...)
Все это работает, но при опросе датчика температуры (раз в минуту) светодиоды мигают.
Я проверял, именно в этом месте светодиоды тухнут. Где-то было написано, что опрос происходит медленно, 250мс. Без подключения библиотеки PWM.h такого не происходит. А мне нехватает ШИМ выходов. Пробовал разные библиотеки DHT11, заработала только одна.
Подскажите, пожалуйста, как с этим бороться? Менять датчик на DHT22?
Я проверял, именно в этом месте светодиоды тухнут. Где-то было написано, что опрос происходит медленно, 250мс. Без подключения библиотеки PWM.h такого не происходит. А мне нехватает ШИМ выходов. Пробовал разные библиотеки DHT11, заработала только одна.
Подскажите, пожалуйста, как с этим бороться? Менять датчик на DHT22?
DHT22 быстрее работать не будет, только точнее. Протокол у него тот же. Можно датчик пореже опрашивать. Но программный PWM все равно будет в это время тормозить. Лучше всего поменять датчик на i2C или аналоговый типа LM335. Тогда опрос будет быстрее.
При стоимости Arduino Pro Micro 3$ может дешевле отдельный контроллер на PWM поставить?
DHT22 быстрее работать не будет, только точнее. Протокол у него тот же. Можно датчик пореже опрашивать. Но программный PWM все равно будет в это время тормозить. Лучше всего поменять датчик на i2C или аналоговый типа LM335. Тогда опрос будет быстрее.
При стоимости Arduino Pro Micro 3$ может дешевле отдельный контроллер на PWM поставить?
Да, скорее всего, буду пробовать отдельный контроллер...
Использую эту библиотеку на Arduino Nano. Подключены 1.8 inch TFT color display (HY-1.8 SPI), часы DS1302, датчик температуры и влажности DHT11, энкодер, кнопка и блютуз. На дисплей вывод время/температура, уровень яркости RGB светодиодов. Светодиоды подключены к аналоговым выходам ( analog.Mode(17, OUTPUT); // R и дальше...)
Все это работает, но при опросе датчика температуры (раз в минуту) светодиоды мигают.
Я проверял, именно в этом месте светодиоды тухнут. Где-то было написано, что опрос происходит медленно, 250мс. Без подключения библиотеки PWM.h такого не происходит. А мне нехватает ШИМ выходов. Пробовал разные библиотеки DHT11, заработала только одна.
Подскажите, пожалуйста, как с этим бороться? Менять датчик на DHT22?
Спасибо, maksim! Я понял источник проблемы. Главное, что вся связка у меня работает. Теперь до ума доводить буду.
Поделитесь библиотекой плиииз с первого поста. а то файла больше нет.
Берите эту #30, той уже нет.
Берите эту #30, той уже нет.
Кстати на Leonardo не компилируется.
Потому что у ATmega32U4 отсутствует второй таймер, а единственный 8-ми битный таймер это TIMER0. В теории если замените двойки на нули должно завестись.
Есть готовый пульт на NANO. Свободны только пины 0 и 1. Можно ли на них генерить шим для управления драйвером шагового двигателя? С помощью библиотеки maksima вроде можно, но не будут ли какие то подводные камни.
Вот так код компилится под мегу 8-ю:
Но ничего не происходит :(