Генератор с заданной длительностью импульса

Тема в разделе "Arduino & Shields", создана пользователем Karabas, 11 сен 2016.

  1. Karabas

    Karabas Гик

    Приветствую всех!
    Очередная проблемма из серии "Ща соберу на коленке" превратилась в "А как это его..."
    Итак, опишу проблемму:
    Для тестирования Устройства необходимо подавать импульсы, и простой ШИМ-генератор на Ардуино справлялся с поставленной задачей. Но вскоре возникла трудность, поскольку скваженность импульса идет в процентах, то и его длительность (при снижении частоты растет).
    Проще говоря нужны, к примеру, импульсы по 5мск, но с разной частотой.
    Видемо пришло время вплотную изучать таймеры и прочие...

    Конечно, если подобный скетч уже был написан- будет здорово, но я буду благодарен и мощному пинку в нужном направлении:)

    ps С разными millis и micros уже наигрался, ничего путнего не выходит.
     
  2. Alex19

    Alex19 Гуру

    Длина импульса постоянна 5мск (0,000005с), частота меняется в каком-то диапазоне, который поддерживает контролер. Интересно, какие частоты Вас интересуют?

    Если правильно понял, и у Вас UNO, Nano, Mega (Arduino на базе AVR), то Вас интересует таймер 1, режим CTC top = ICR1 (сброс при совпадении с top = ICR1). Смена частоты ICR1, длина OCR1A, OCR1B соответственно для канала A и B.

    Ваша задача похожа на задачу формирования PDM (там только частота сигнала одинаковая, а длина разная). Вот пример таймер 1, режим CTC top = ICR1 (PDM, частота 20Khz, длина 0,6ms) - https://github.com/SimpleRov/AVR/blob/master/Servo/Atmega328pOnT1/Atmega328pOnT1.ino.

    Что почитать о таймерах, в сети написано не мало, тут, что легче будет читаться. В идеале pdf от соответствующего чипа, или общее описание таймеров. К примеру ссылки, на мой вкус:), базовые знания http://chipenable.ru/index.php/programming-avr/item/171-avr-timer-t0-ch1.html, http://chipenable.ru/index.php/prog...vr-taymer-schetchik-t0-rezhim-normal-ch2.html, http://chipenable.ru/index.php/prog...s-avr-taymer-schetchik-t0-rezhim-ctc-ch2.html и описание регистров на рус. под Вашу задачу - http://avrprog.blogspot.com.by/2013/03/t1-16.html.
     
    Последнее редактирование: 12 сен 2016
    InterestedStudent и Karabas нравится это.
  3. dimax

    dimax Нерд

    Karabas нравится это.
  4. Karabas

    Karabas Гик

    Большое спасибо, буду изучать.

    Да, похоже на мой случай, видимо я не первый:)
     
  5. Alex19

    Alex19 Гуру

    Это код, первого таймера в режиме CTC top = ICR1, о котором говорил, он почти идентичен. Но было бы не плохо, если бы Вы понимали как выставляется диапазон, частоты, шаг и т.д.

    К примеру длительность импульса 5мкс, нам подойдет предделитель 1 и 8 (или внешний источник тактирования, он нем не говорим).

    В первом случае (предделитель 1) мы получаем шаг 0,0625 мкс, как в примере на arduino.ru (1<<CS10)), в таком случае точные 5мкс равны 80 тикам. С предделителем 8, шаг 0,5 мкс, интервал 5мкс равен 10 тикам. То есть OCR1A, OCR1B соответственно для канала A и B, будет всегда равно 80 или 10 в зависимости от предделителя.

    С предделителем 1 минимальная частота около 250Hz, c 8 около 33Hz и т.д., максимальная и так понятна длина импульса + промежуток между.
     
  6. leviafan

    leviafan Нуб

    Ребята, у меня такая проблема. Нужно сделать генератор прямоугольных импульсов с регулируемой частотой от 1 до 300 (или более) Гц и скважностью (длительностью импульса). Чтобы частоту и скважность задавать через сириал. Мои знания в программировании слабые для этого. Может у кого есть готовый скейтч или сылка на пример?
     
  7. Alex19

    Alex19 Гуру

    Готового кода у меня нет, как и ссылок.

    Если надумаете сделать сами, пишите в этой теме, подскажу (безвозмездно - то есть даром:)).
     
  8. rkit

    rkit Гуру

    digitalWrite(pin, millis() / (1000 / freq) < (1000 / pulseWidth));
    Для таких мелких частот пойдет.
     
  9. ANV

    ANV Гуру

    Ого, наконец-то лабы и курсачи начали до декабря сдавать :D
     
  10. leviafan

    leviafan Нуб

    Не не курсач, хочу проектик запелить. Прогать просто не умею, только проектировать и паять)))
     
  11. rkit

    rkit Гуру

    Спаять такой простой генератор будет гораздо проще и дешевле страданий с ардуино.
     
  12. Luk-men

    Luk-men Нуб