Наносекундные импульсы
- Войдите на сайт для отправки комментариев
Пт, 26/11/2021 - 18:33
Можно ли на ардуино организовать импульсы с задаваемой длительностью порядка нескольких сотен наносекунд?
Отправляют к таймерам, но везде одни и те же (не те) примеры. С прямым доступом к портам получалось сделать довольно точные импульсы в пределах нескольких микросекунд. В распоряжении Nano, Uno, Mega, Due.
На таймере можно меандр с частотой равной половине частоты тактирования. Для 100 МГц блакпила на stm32f411 это импульс длиной 10 нс. Шаг прироста эти 10 нс. Т.е. можно сделать импульс от 10 нс и повтор через те же 10 нс или бошьше с шагом 10 мс. Как программировать описано в мануале на чип. Для stm есть куб, который генерит код по заданным параметрам и этот код можно использовать в среде ардуино.
Что за куб?
10 нс это перебор.
Несколько сотен, как и отметил в начале.
Про куб прочитал немного, вникать нужно.
16 МГц - 125 наносекунд - меньше не получится
16 МГц - 125 наносекунд - меньше не получится
А не 62,5 нс?
Jeka_M это один такт - можно либо установить либо сбросить бит. Что бы был импульс надо установить и сбросить.
SBI
SBI
125 наносекунд
SBI
NOP
SBI
187.5 наносекунд
SBI
NOP
NOP
SBI
250 наносекунд
...
Мы уже на форуме проходили как из программы минимальный длины импульс на ноге получить. Если нужны наносекунды - только hardware - только таймеры.
16 МГц - 125 наносекунд - меньше не получится
А не 62,5 нс?
А вот 72Мгц
чем не устраивают "не те примеры" для таймеров?
чем не устраивают "не те примеры" для таймеров?
Может я их (примеры) не так понимаю.
Нашел кое-что здесь же на форуме, буду переделывать под себя.
Мне вроде понятен смысл таймеров. Такты кварца идут всегда, независимо от выполняемых задач.
Таймерами отсчитываются нужное количество тактов и дергаются ноги или внутренние процессы.
Пока все это не стало для меня наглядным. Буду изучать матчасть.
Можете в этих примерах покопаться: http://arduino.ru/forum/obshchii/diving-pwm
Поразбирался с таймерами, вроде ничего сверхсложного нет.
Вернусь к импульсам.
По ходу "учебы" возник вопрос. Возьмём 16-битный таймер. Небольшой код, проверял на Меге.
На 42 ноге меандр. Код по сравнению регистров. OCR1A = 100; - это количество тактов до сброса регистра счета в ноль.
Прескалер выключил, вернее оставил прямые такты. Максимум частоты получается примерно 150 кГц. На определенном значении регистра сравнения уменьшение периода заканчивается. Почему?
О чем я еще не знаю?
О чем я еще не знаю?
О прерываниях, вестимо. Они ж тоже занимают вычислительные мощности. Порядка ~25 тактов МК на каждый вход и выход нужно. Итого что-б дёрнуть портом туда-сюда нужно 2 раза войти, и 2 раза выйти. Итого на круг выходят те самые 100 тактов, в которые вы и упёрлись.
О чем я еще не знаю?
О прерываниях, вестимо. Они ж тоже занимают вычислительные мощности. Порядка ~25 тактов МК на каждый вход и выход нужно. Итого что-б дёрнуть портом туда-сюда нужно 2 раза войти, и 2 раза выйти. Итого на круг выходят те самые 100 тактов, в которые вы и упёрлись.
То есть получить 4-5 тактов нереально при 16М?
Или есть способ это обойти?
andrey3824, можно получить хоть 8MHz, но без прерываний. Вы кстати, уже определитесь, что нужно -периодический сигнал или одиночный импульс.
andrey3824, можно получить хоть 8MHz, но без прерываний. Вы кстати, уже определитесь, что нужно -периодический сигнал или одиночный импульс.
В итоге будет нужна пачка импульсов с разной длительностью.
Поэтому подумал, что без прерываний не обойтись.
Еще подумал использовать Due. Там тактовая выше.
Или внешнее тактирование, но наверное проблему с прерываниями это не решит.
Комплексно надо. Таймер имеет выходную ногу. На ней можно получить даже одиночный импульс длительностью в половину тактовой частоты. Если нужен ещё один импульс, то в прерывании таймера можно перепрограмировать таймер на нужный импульс, который может случится ещё до выхода из прерывания. Можно услышать параметры импульсов? А то рассуждать о сферических конях в вакууме не очень хочется.
andrey3824, на AVR сделать пачку разных коротких импульсов - только ассемблер. Due тоже не фонтан. Про прерывания забудьте. Следующий шаг удобства -stm32, на таймере и DMA можно сделать любую пачку.
Ого, это как?? У меня таймером получалось сделать импульс не короче 5 толи 6 тактов МК.
Снимал данные анализатором и потом уже выяснил, что частоты дискретизации не хватило.
Позже точнее данные сниму,но пока то, что есть.
Длительность на скрине в 2 такта дискретизации (12МГц), нужно больше.
Это минимальный импульс в пачке
Есть еще меньше.
andrey3824, надо опираться на минимальный. 83nS -это надо что-б МК работал на 12МГц, т.е. заменить кварц. И на голом ассемблере выписать все задержки. По другому, IMHO, на AVR невозможно. Это если задержки реальны, а то может они и снялись некорректно. Такие вещи надо снимать с дискретизацией хотя б 1ГГц
Код предъявите ?
andrey3824, надо опираться на минимальный. 83nS -это надо что-б МК работал на 12МГц, т.е. заменить кварц. И на голом ассемблере выписать все задержки. По другому, IMHO, на AVR невозможно. Это если задержки реальны, а то может они и снялись некорректно. Такие вещи надо снимать с дискретизацией хотя б 1ГГц
Мне максимум доступно 108МГц на анализаторе. На камне, с которого читаю, кварц на 25. Если отталкиваться от этого, то, возможно, 80ns - это 2 такта. Не дока в процессорах, но думаю, что длительность принимаемых импульсов не должна быть меньше такта.
Про ассемблер почитал, сложновато пока для меня. С подходящими примерами, возможно, справлюсь.
Мне часто собрать на железе проще, чем программно.
andrey3824, ну если что, ардуину на 25МГц можно разогнать. Но ассемблер не обойти никак. Либо сразу переходите на stm32.
andrey3824, ну если что, ардуину на 25МГц можно разогнать. Но ассемблер не обойти никак. Либо сразу переходите на stm32.
Ассемблер попробую освоить.
Посоветуйте что-нибудь для начала.
DUE на 84 работает, её можно использовать?
andrey3824, моё личное мнение -не стоит терять время на её изучение. Обычный блюпилл/блэкпилл stm32 по функционалу периферии на голову выше Due и при желании ещё и разгоняется . По stm32 масса различных примеров программ в интернете -по Due сущие крохи.
andrey3824 Полностью на ASM переходить не обязательно.
Шаг сетки 500 наносекунд...
Листинг самих функций:
andrey3824, моё личное мнение -не стоит терять время на её изучение. Обычный блюпилл/блэкпилл stm32 по функционалу периферии на голову выше Due и при желании ещё и разгоняется . По stm32 масса различных примеров программ в интернете -по Due сущие крохи.
Да, по Due мало что есть.
Код предъявите ?
Если очень надо код, то чуть позже, когда проверю в железе, но общая идея таймер в режиме однократного импульса PWM c единичкой в регистре канала и двойкой в регистре периода.
А половина тактовой откуда ?
Шаг сетки 500 наносекунд...
Дык в том и дело. Каждый вызов функции и возврат забирают по 4 такта, итого 8 тактов. + 2 такта нужно ожидать исполнения следующей команды. Выходит 10 тактов минимальная пауза между импульсами. А у ТС речь идёт о 80nS паузах, т.е. один такт максимум при 12МГц.
dimax Можно и без вызовов:
На старте ТС ничего не писал про паузы !!!
Ардуина для этого не очень подходит, уже осознал.
Нужно двигаться в сторону STM
Можно и без вызовов:
Да, теперь другое дело :) 2 такта между импульсами. Если sbi поменять на out, то будет 1 такт.
На старте ТС ничего не писал про паузы !!!
Позже отметил, что нужна пачка импульсов с разной длительностью.
Там всё будет важно, и импульсы и паузы.
andrey3824 то есть 125 наносекунд Вас не устраивают ???
Да, теперь другое дело :) 2 такта между импульсами. Если sbi поменять на out, то будет 1 такт.
OUT может задеть другие биты ... плюс надо занять один регистр и запретить компилятору его портить ...
Вот 62.5 импульсы и 62.5 паузы ...
Шаг сетки 500 наносекунд при 16Мгц...
Листинг самих функций:
andrey3824 то есть 125 наносекунд Вас не устраивают ???
Выше есть скрин, на котором 1 имп 83ns. Это учитывая то, что данные снимались при частоте дискретизации всего 12МГц.
andrey3824, вот если разгоните дуню на 25МГц то 125nS аккурат превратятся в 80 :)Komandir дал вам фактически готовое решение для малых импульсов, осталось только для больших что-то простое придумать.
andrey3824, вот если разгоните дуню на 25МГц то 125nS аккурат превратятся в 80 :)Komandir дал вам фактически готовое решение для малых импульсов, осталось только для больших что-то простое придумать.
Понял, попробую.
Еще раз про Due спрошу, её можно в таком случае использовать, или там свои заморочки?
andrey3824, я не настолько хорошо знаю Due, что б заявлять что на ней не получится. Лучше взять плату, где точно получится. Stm32f401 цена вопроса около 300руб
В #42 сделал 62.5 нс импульсы и 62.5 нс паузы.
на основе этого можно через NOP нарисовать что угодно с шагом 62.5 нс для 16 МГщ
при 20 Мгц будут более красивые 50 нс
В #42 сделал 62.5 нс импульсы и 62.5 паузы.
на основе этого можно через NOP нарисовать что угодно с шагом 62.5 для 16 МГщ
при 20 Мгц будут более красивые 50 нс
Мне для начала нужно с Нопами, Аутами и прочими познакомиться.
Чтобы проще было, поясню. Кнопку жмакаем (или команда) - пачка улетела.
Чтобы не было это по бесконечному кругу.
Я постепенно все познаю.
До недавнего времени прямой доступ к портам тоже был чем-то необъятным.
Поизучал, вроде ближе к этому стал.
В #42 сделал 62.5 нс импульсы и 62.5 паузы.
на основе этого можно через NOP нарисовать что угодно с шагом 62.5 для 16 МГщ
при 20 Мгц будут более красивые 50 нс
Мне для начала нужно с Нопами, Аутами и прочими познакомиться.
Чтобы проще было, поясню. Кнопку жмакаем (или команда) - пачка улетела.
Чтобы не было это по бесконечному кругу.
По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...
Вы видимо не видели документацию про программированию STM, раз AVR для Вас сложно ... :-)))