Библиотека TimerOne
- Войдите на сайт для отправки комментариев
Вс, 06/07/2014 - 11:13
Существует такая библиотека 16-ти разрядного таймера
http://www.pjrc.com/teensy/td_libs_TimerOne.html
Использовал, работает хорошо
Обнаружил в ней функцию pwm ( pin, duty, microseconds)
Пытался запустить, результатов не обнаружил, а главное не понял почему
P.S. для сторонников analogWrite() сразу сообщаю, что надеюсь получить 16-ти разрядный PWM
P.S.
Обращаю внимание, функция pwm работает с пинами 1,2 или 9,10
Нашел такой вот пример у испанцев кажется
не работает
Нашел ещё такую фигню.
Each timer controls PWM pins. While uses these libraries,
analogWrite() to those pins will not work normally, but you can use the library pwm() function.
Если очень нужно, то можно и на других пинах получить PWM этой либой, только уже программно.
Делаете attachInterrupt на интервал поменьше, и уже в обработчике, делаете что-то типа
Для скорости-точности можно digitalWrite заменить прямым управление портом.
Возможно, давно неактуально, но не смог запустить на Arduino Mega2560, начал разбираться.
Ещё один момент — можно указывать в качестве номера пина 1 и 2 вместо 9 и 10, но здесь тоже нужно быть внимательным: если указать 1 или 2, то это сработает и на Arduino Mega (пины 11 и 12), и на простой Arduino (пины 9 и 10), но если указать 9 или 10, то сработает только на Arduino… Брр, и что только автор библиотеки курил?
Казалось бы, все ясно, но не тут то было. Я нигде не увидел, что для использования библиотекой пины нужно предварительно инициализировать на выход.
В общем, заработало так:
Запустить на 13м выводе не удалось.
Для выводов 11 и 12 их нужно инициализировать на выход, а библиотеке передавать 1 или 2 соответственно.
Вопрос только один - а зачем весь этот огород ?
Какой?
ну, зачем добиваться того, что аппаратно не поддерживается изначально, ведь всё равно это будет только эмуляция 16 разрядов, зато это уже есть в arduino due ?
Аппаратно не поддерживается что? 16 разрядный таймер-счетчик? Т.е. документация на контроллеры врет? Даже в Atmega8 заявлено:
И что делать? Всем срочно переходить на arduino due ?
Что касается самой библиотеки - да, с ней проблем хватает, во всяком случае у меня таймер нормально не заработал. При установке тика на 100мс получил тик в 120мс.
а, точно, 16 разрядов.
Не могу разобраться с библиотекой TimerOne. Я новичок в Arduino. Собрал самодельную плату на Atmega 8. Установил Arduino IDE 1.6.5 (OS XP). Прошил bootloader, загружал скетчи, все работает. Столкнулся с необходимостью использования библиотеки TimerOne. Скачал последнюю версию, распаковал в папку libraries. Запустил IDE, проверил, библиотека добавилась. Решил посмотреть работу библиотеки из примеров. Открыл ISRBlink из папки. Запустил компилятор и получил в ответ ошибку. Нашел более старую версию библиотеки, заменил - результат тот же. вычитал, что может глючить новый компилятор. откатился на версию Arduino IDE 1.5.5 - результат ошибка.
Текст ошибки: Arduino: 1.5.5-r2 (Windows XP), Board: "Arduino NG or older, ATmega8"
s1292oia, этой библой не пользуюсь, но могу прокмментировать по ошибкам - в меге8 нет перечисленных регистров. Там есть аналогичные, но они по другому называются. Соответссно можно предположить что библа не поддерживает мегу8.
Спасибо за подсказку. Для проверки поменял плату в Arduino IDE на Arduino UNO и все скомпилировалось! Сейчас начну крючить библиотеку под atmega 8.
Запустил библиотеку для atmega 8 добавив в файл TimerOne.cpp строки:
Источник:http://forum.arduino.cc/index.php?topic=244553.0
Уважаемые форумчена подскажите. Нужно реализовать нормальный ШИМ на Arduino, решил сделать на данной библиотеке. Покопавшись в интерете, почитал форумы статьи, вроде бы все просто. Но не тут то было, набросал тестовую програмку и понял что ничего не понял
Подскажите, пожалуйста, как переделать в библиотеку TimerOne так, чтобы на его выходных выходах (Ардуино МЕГА) можно было менять вместо скважинных импульсов, фазных импульсов в пределах 0-1023 значения должны быть не изменены 50%. Ввод TimerOne.h, но сам не могу мало опыта.
Что сдесь нужно изменить?
Подскажите плз как заставить эту библу генерировать шим на D5 и/или D6?
Что поправить в библиотеке?
"Может в консерватории что надо подправить?"
Хорошо давай в консерватории. Напиши как.
Хорошо давай в консерватории. Напиши как.
Хорошо давай в консерватории. Напиши как.
Если вы про сообщение №4, то я ничего не понял, что надо сделать.
Если не сложно, растолкуйте для менее опытных.
Форум - не учебное заведение. Здесь никто не будет поднимать уровень новичка с нуля. Если новичок заинтересован чего-то достичь, то должен сам проявить некоторую активность, чтобы иметь представление хотя бы об основах.
Вот какие именно слова Вы не понимаете в сообщении №4?
Например: "Делаете attachInterrupt на интервал поменьше," - Меньше чего? На какой интервал?
Например: "Делаете attachInterrupt на интервал поменьше," - Меньше чего? На какой интервал?
Высокий уровень некой продолжительности, повторяющейся с некой частотой.
Ладно, тогда именно этими терминами (продолжительность и частота) и будем пользоваться.
Для ШИМ, вообще-то, характерно две частоты: одна характеризует частоту повторения импульсов, другая имеет как бы второстепенное значение, но на самом деле именно она является главной частотой с точки зрения реализации. Так вот, "продолжительность" должна представлять собой целое число периодов этой самой "второстепенной" частоты. Собственно, 1 период - это единица измерения "продолжительности". Если мы хотим, чтобы ШИМ имела 100 градаций (т.е. описывалась целым количеством процентов), то "второстепенная" частота должна быть в 100 раз выше частоты ШИМ. Именно на нее мы и настраиваем наш ТаймерОдин. А внутри прерывания смотрим, пора переключать уровень или еще нет. Ну и, поскольку код "приблизительный", в нем еще забыли обнулять счетчик по достижении им числа 100.
Т.е. "интервал" - это интервал между вызовами прерывания, в данном случае период "второстепенной частоты", и он должен быть во столько раз меньше частоты ШИМ, сколько мы хотим получить градаций.
С чем связан именно этот путь решения проблемы, в самой библиотеке переназначить пины нет возможности?
Возможно, я ошибаюсь, из-за поверхностных знаний, но мне кажется, что метод, предложенный в 4 сообщении, не позволит мне получать sweep сигнал. От 0 до 20кгц.
Это единственная библиотека, которую я нашел, позволяет получить sweep сигнал, не используя дополнительные покупные модули-генераторы. Но 9 и 10 заняты...
В 328 МК к таймеру жёстко привязаны пины. На хардварном уровне на других пинах генерацию получить возможности нет.
Это единственная библиотека, которую я нашел, позволяет получить sweep сигнал, не используя дополнительные покупные модули-генераторы. Но 9 и 10 заняты...
А какие параметры ШИм вам нужны? На 5 и 6 можно получить ШИМ вплоть до 62 КГц вообще без библиотек
Это единственная библиотека, которую я нашел, позволяет получить sweep сигнал, не используя дополнительные покупные модули-генераторы. Но 9 и 10 заняты...
А какие параметры ШИм вам нужны? На 5 и 6 можно получить ШИМ вплоть до 62 КГц вообще без библиотек
Научите пожалуйста. Мне надо меандр т.е ШИМ с 50% скважностью. Частоту которого можно менять о 1 до 20000гц. Делаю это просто, по средствам: Hz ++;
ps: Желательно с хорошей точностью. У TimerOne точность хорошая если написано 4кГц, так и получается +- пару герц.
Как тогда правильно понимать эту картинку? Шим вроде как на 3,5,6,9,10,11
Научите пожалуйста. Мне надо меандр т.е ШИМ с 50% скважностью. Частоту которого можно менять о 1 до 20000гц. Делаю это просто, по средствам: Hz ++;
Какой же это ШИМ? Главное свойство ШИМ сигнала - переменное заполнение при постоянной частоте. Аппаратный ШИМ на пинах 5 и 6 может иметь только фиксированную частоту - 62 Кгц, 31, 8, 4, 1 КГц и дальше вниз
А то что вы хотите - это никакой не ШИМ, а генератор частоты. Такое можно сделать только программно, по методике , описанной andriano на пару сообщений выше.
И, кстати. библиотека ТаймерOne для этого совершенно необязательна, на регистрах таймера будет быстрее и проще
Как тогда правильно понимать эту картинку? Шим вроде как на 3,5,6,9,10,11
Timer1 - это только 9 и 10
D5 D6 - это Timer0
D3 D11 - это Timer2
Но таймер0 и таймер2 - 8 битные, на них хорошую точность не получить
Похоже я всех запутал, извиняюсь.
Без примеров я думаю не разберусь с генерацией сигнала на регистрах. Наберусь наглости попросить пример, похоже у гугла я тоже как-то не верно спрашиваю. (Плавное изменение частоты шим arduino)
ЗЫ: Как дергать ноги регистрами знаю, но что там с таймерами делать не осилю пока.
Это единственная библиотека, которую я нашел, позволяет получить sweep сигнал, не используя дополнительные покупные модули-генераторы. Но 9 и 10 заняты...
Если на этой библиотеке вы получаете то, что нужно - самое правильное решение будет освободить 9 и 10 пины. Все остальные варианты сложнее и хуже.
Да, меня полностью устраивает. Ок, буду думать как освободить...
Без примеров я думаю не разберусь с генерацией сигнала на регистрах. Наберусь наглости попросить пример, похоже у гугла я тоже как-то не верно спрашиваю. (Плавное изменение частоты шим arduino)
"Плавное изменение частоты ШИМ" - это неверный запрос. Плавно изменять частоту ШИМ довольно сложно и это возможно только в небольших пределах. Но вам это и не нужно.
Для того чтобы просто генерить прямоугольный сигнал, достаточно настроить прерывание по совпадению и в обработчике инвертировать уровень на пине. Тогда меняя регистр сравнения - вы будете плано менять частоту. Это все описано в любом руковдстве по таймерам.
Вот, например, статья самого базового уровня для начала https://habr.com/ru/post/453276/
Но если вы хотите менять частоту в таком широком диапазоне - 0- 20 КГц, да еще и иметь хорошую точность во всех частях диапазона - задача усложняется. Для каждой частоты надо сначала подбирать оптимальный делитесь.
так что идея освбождения пинов 9 и 10, наверно, самая правильная
Мне надо меандр т.е ШИМ с 50% скважностью. Частоту которого можно менять о 1 до 20000гц. Делаю это просто, по средствам: Hz ++;
ps: Желательно с хорошей точностью. У TimerOne точность хорошая если написано 4кГц, так и получается +- пару герц.
Судя по всему, ШИМ Вам вообще не нужен, а нужен исключительно меандр. Точнее, генератор меандра с регулируемой частотой. ШИМ как бы подразумевает, что частоту мы не меняем, а меняем только скважность.
Меандр присутствует в генераторе от Димакса, промежду прочим. И частота вполне в нем регулируется.
как заставить эту библу генерировать шим на D5 и/или D6?
Как обычно - добрым словом и пистолетом.