Библиотека ардуино timer one

RoboCraft

Когда программируешь для Arduino, иногда бывает нужно периодически выполнять какие-либо действия через определённые интервалы времени — скажем, 100 раз в секунду; или хочется иметь ШИМ с большим разрешением или другой частотой, чем позволяет стандартная функция analogWrite(), или вдруг хочется выполнять какую-то работу параллельно, а вездесущий delay() всё портит. Вот тут-то может пригодиться библиотека TimerOne, которую я вам в двух словах опишу.

Эта библиотека позволяет использовать в своих целях один из таймеров в МК AVR, установленных на платах Arduino. Аппаратных таймеров в ATmega168 и ATmega328 имеется 3 штуки (в ATmega1280 и ATmega2560 их 6), и называются они Timer0, Timer1 и Timer2. Все они используются для ШИМ в функции analogWrite(), но разрядность такой ШИМ ограничена наименьшей разрядностью таймеров, а Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает analogWrite() — 255. Но Timer1-то 16-разрядный! Чтобы задействовать мощь этого таймера, один добрый человек и написал библиотеку TimerOne. Скачаем библиотеку отсюда, установим и посмотрим, какие методы доступны в библиотеке:

Этот метод нужно вызвать для инициализации таймера, прежде чем вызывать какие-либо другие. По умолчанию задаётся интервал срабатывания в 1 секунду, но можно указать свой в микросекундах. Минимальный доступный интервал — 1 микросекунда.
После инициализации пины 9 и 10 на Arduino (11 и 12 на Arduino Mega) смогут использоваться библиотекой для ШИМ, но остановится analogWrite()’овская ШИМ на этих пинах, если таковая была задействована до вызова initialize(). Пока работаете с библиотекой TimerOne, для перечисленных выше пинов analogWrite() не вызывайте, и наоборот.

Устанавливает интервал срабатывания таймера в микросекундах. Минимальный интервал равен 1 мкс (соответственно, максимальная частота — 1 МГц), максимальный — 8388480 мкс (около 8.4 с).

Включает ШИМ на указанном пине. Параметр duty указывает заполнение ШИМ, которое может меняться от 0 до 1023. Да-да, не вся «16-битность» таймера задействована, увы. Параметр period позволяет задать интервал срабатывания, но учтите, что период задаётся не для отдельного пина, а вообще для таймера. То есть, если вы укажете период для 9го пина, то повлияет и на 10й. Неочевидно, да.
Ещё один момент — можно указывать в качестве номера пина 1 и 2 вместо 9 и 10, но здесь тоже нужно быть внимательным: если указать 1 или 2, то это сработает и на Arduino Mega (пины 11 и 12), и на простой Arduino (пины 9 и 10), но если указать 9 или 10, то сработает только на Arduino… Брр, и что только автор библиотеки курил?

Устанавливает заполнение ШИМ для указанного пина, если ШИМ на нём уже включена.

Выключает ШИМ на выбранном пине.

Устанавливает функцию (обработчик прерывания), которая будет вызываться по завершении установленного интервала таймера. Такая функция должна иметь вид:

Параметр period, как обычно, задаёт интервал срабатывания (и, как всегда, для всего таймера). Нужно быть осторожным, и не выполнять слишком много кода в обработчике, иначе главный цикл (loop) может вообще никогда не получить управления. Если задать период в 1 мкс, то такой исход практически гарантирован, т.к. за это время AVR с кварцем в 16 МГц (как на Arduino) успеет выполнить инструкций где-то на десяток тактов — то есть, сложить пару-тройку чисел, и даже на один digitalWrite() этого времени не хватит. В общем, не советую устанавливать обработчик для периодов меньше 100 мкс (0.1 мс), если вы не рассчитали по тактам время выполнения обработчика и не уверены на 100%, что времени хватит (:

Отключает обработчик прерывания.

Запускает таймер, если он был остановлен.

Применение всему этому придумать несложно: первое, что пришло в голову — мигалка двумя светодиодами не то что без delay(), а вообще без нашего участия. Светодиоды будут на пинах 9 и 10:

Ну, а что ещё можно сделать, используя TimerOne, зависит уже от вашей фантазии.

Источник

PaulStoffregen/TimerOne

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Paul Stoffregen’s modified TimerOne. This version provides 2 main benefits:

1: Optimized inline functions — much faster for the most common usage
2: Support for more boards (including ATTiny85 except for the PWM functionality)

Open Source License

TimerOne is free software. You can redistribute it and/or modify it under the terms of Creative Commons Attribution 3.0 United States License. To view a copy of this license, visit

Paul Stoffregen forked this version from an early copy of TimerOne/TimerThree which was licensed «Creative Commons Attribution 3.0» and has maintained the original «CC BY 3.0 US» license terms.

Other, separately developed updates to TimerOne have been released by other authors under the GNU GPLv2 license. Multiple copies of this library, bearing the same name but distributed under different license terms, is unfortunately confusing. This copy, with nearly all the code redesigned as inline functions, is provided under the «CC BY 3.0 US» license terms.

About

TimerOne Library with optimization and expanded hardware support

Источник

Библиотеки TimerOne и TimerThree для Arduino

Timer1

Данная библиотека представляет собой набор функций для настройки аппаратного 16-битного таймера Timer1 в ATMega168/328. В микроконтроллере доступно 3 аппаратных таймера, которые могут быть настроены различными способами для получения различных функциональных возможностей. Начало разработки данной библиотеки было вызвано необходимостью быстро и легко установить период или частоту ШИМ сигнала, но позже она разраслась, включив в себя обработку прерываний по переполнению таймера и другие функции. Она может быть легко расширена или портирована для работы с другими таймерами.

Точность таймера зависит от тактовой частоты процессора. Тактовая частота таймера Timer1 определяется установкой предварительного делителя частоты. Этот делитель может быть установлен в значения 1, 8, 64, 256 или 1024.

для тактовой частоты 16 МГц

Делитель Длительность одного отсчета, мкс Максимальный период, мс
1 0,0625 8,192
8 0,5 65,536
64 4 524,288
256 16 2097,152
1024 64 8388,608
  • Максимальный период = (Делитель / Частота) × 2 17
  • Длительность одного отсчета = (Делитель / Частота)

Для установки просто распакуйте и поместите файлы в каталог Arduino/hardware/libraries/Timer1/ .

Timer3

Обратите внимание, что библиотека Timer1 может использоваться на Arduino Mega, но она не поддерживает все три выходных вывода OCR1A , OCR1B и OCR1C . Поддерживаются только A и B . OCR1A подключен к выводу 11 на Mega, а OCR1B – к выводу 12. С помощью одного из трех вызовов, которые задают вывод, значение 1 задаст вывод 11 на Mega, а 2 – задаст вывод 12. Библиотека Timer3 была протестирована только на Mega.

Библиотеку для таймера Timer3 можно здесь (TimerThree.zip)

Для установки просто распакуйте и поместите файлы в каталог Arduino/hardware/libraries/Timer3/ .

Методы библиотек TimerOne и TimerThree

Настройка

Управление запуском

Управление выходным ШИМ сигналом

Прерывания

Остальные

Пример 1

В примере ШИМ сигнал с коэффициентом заполнения 50% подается на вывод 9, а прикрепленный обработчик прерывания переключает состояние цифрового вывода 10 каждые полсекунды.

Модифицированные библиотеки от Paul Stoffregen

Также доступны отдельно поддерживаемые и обновляемые копии TimerOne и TimerThree, которые отличается поддержкой большего количества оборудования и оптимизацией для получения более эффективного кода.

Плата ШИМ выводы TimerOne ШИМ выводы TimerThree
Teensy 3.1 3, 4 25, 32
Teensy 3.0 3, 4
Teensy 2.0 4, 14, 15 9
Teensy++ 2.0 25, 26, 27 14, 15, 16
Arduino Uno 9, 10
Arduino Leonardo 9, 10, 11 5
Arduino Mega 11, 12, 13 2, 3, 5
Wiring-S 4, 5
Sanguino 12, 13

Методы модифицированных библиотек аналогичны описанным выше, но добавлен еще один метод управления запуском таймера:

void resume(); Возобновляет работу остановленного таймера. Новый период не начинается.

Пример 2

Проблемы с контекстом прерываний

Для обмена данными между кодом обработчика прерывания и остальной частью вашей программы необходимо принять дополнительные меры.

Переменные обычно должны быть типа volatile . Volatile говорит компилятору о необходимости избегать оптимизаций, которые предполагают, что переменная не может спонтанно измениться. Поскольку ваша функция может изменять переменные, пока ваша программа использует их, компилятор нуждается в этой подсказке. Но одного volatile часто не хватает.

При доступе к общим переменным прерывания, как правило, должны быть отключены. Даже с volatile , если обработчик прерывания изменит многобайтную переменную между последовательностью команд, эта переменная может быть прочитана неправильно. Если данные состоят из нескольких переменных, например, массив и счетчик, прерывания, как правило, должны быть отключены на протяжении всего кода, который получает доступ к данным.

Источник

Arduino.ru

Библиотека TimerOne

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Существует такая библиотека 16-ти разрядного таймера

Использовал, работает хорошо

Обнаружил в ней функцию 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, начал разбираться.

Казалось бы, все ясно, но не тут то было. Я нигде не увидел, что для использования библиотекой пины нужно предварительно инициализировать на выход.

В общем, заработало так:

Запустить на 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 строки:

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Уважаемые форумчена подскажите. Нужно реализовать нормальный ШИМ на Arduino, решил сделать на данной библиотеке. Покопавшись в интерете, почитал форумы статьи, вроде бы все просто. Но не тут то было, набросал тестовую програмку и понял что ничего не понял

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подскажите, пожалуйста, как переделать в библиотеку TimerOne так, чтобы на его выходных выходах (Ардуино МЕГА) можно было менять вместо скважинных импульсов, фазных импульсов в пределах 0-1023 значения должны быть не изменены 50%. Ввод TimerOne.h, но сам не могу мало опыта.

Что сдесь нужно изменить?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подскажите плз как заставить эту библу генерировать шим на D5 и/или D6?

Что поправить в библиотеке?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

«Может в консерватории что надо подправить?»

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Хорошо давай в консерватории. Напиши как.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Хорошо давай в консерватории. Напиши как.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Хорошо давай в консерватории. Напиши как.

Если вы про сообщение №4, то я ничего не понял, что надо сделать.

Если не сложно, растолкуйте для менее опытных.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Форум — не учебное заведение. Здесь никто не будет поднимать уровень новичка с нуля. Если новичок заинтересован чего-то достичь, то должен сам проявить некоторую активность, чтобы иметь представление хотя бы об основах.

Вот какие именно слова Вы не понимаете в сообщении №4?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Например: «Делаете attachInterrupt на интервал поменьше,» — Меньше чего? На какой интервал?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Например: «Делаете attachInterrupt на интервал поменьше,» — Меньше чего? На какой интервал?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Высокий уровень некой продолжительности, повторяющейся с некой частотой.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ладно, тогда именно этими терминами (продолжительность и частота) и будем пользоваться.

Для ШИМ, вообще-то, характерно две частоты: одна характеризует частоту повторения импульсов, другая имеет как бы второстепенное значение, но на самом деле именно она является главной частотой с точки зрения реализации. Так вот, «продолжительность» должна представлять собой целое число периодов этой самой «второстепенной» частоты. Собственно, 1 период — это единица измерения «продолжительности». Если мы хотим, чтобы ШИМ имела 100 градаций (т.е. описывалась целым количеством процентов), то «второстепенная» частота должна быть в 100 раз выше частоты ШИМ. Именно на нее мы и настраиваем наш ТаймерОдин. А внутри прерывания смотрим, пора переключать уровень или еще нет. Ну и, поскольку код «приблизительный», в нем еще забыли обнулять счетчик по достижении им числа 100.

Т.е. «интервал» — это интервал между вызовами прерывания, в данном случае период «второстепенной частоты», и он должен быть во столько раз меньше частоты ШИМ, сколько мы хотим получить градаций.

Источник

Adblock
detector