Генерация наносекундных импульсов на Arduino
- Войдите на сайт для отправки комментариев
Всем доброго времени суток.
Нашел код в интернетах, слегка модифицировал, очень нужны были субмикросекундные импульсы.
1. Первый цикл задает длину импульса, второй расстояние между ними.
В коде при выставлении значений length и delay более 8 происходит резкий скачок во времени и изменение шага в 6 раз. Измерял на осциле, см. зависимость на картинке. По оси x - количество итераций цикла, по y - длина/расстояние между импульсами. С чем это может быть связано? Выставлял разные типы переменных, выходил в восьмеричную и тд системы, но ничего не помогло. При этом, если накопировать в лоб строки с 1 и 0 условные 10 раз вместо цикла, то такого не наблюдается, идет линейный рост без скачков. Пробовал загонять в while и тп, ситуация как с for.
Спасибо, если кто-то подскажет, как это лечится. Проблема не критичная, но принципиальная.
2. Можно ли организовать подобные импульсы на двух независимых каналах, например, на Arduino Mega?
p.s. Использую Arduino Uno.
void setup() { DDRD = B11111111; // set PORTD (digital 7~0) to outputs } void loop() { int length = 1; int delay = 1; for (int i = 1; i <= length; i++) { PORTD = B11111111; // set PORTD pins (digital 7~0) high } for (int j = 1; j <= 1; j++) { PORTD = B00000000; // set PORTD pins (digital 7~0) low } }
В коде при выставлении значений length и delay более 8 происходит резкий скачок во времени и изменение шага в 6 раз.
Количество проходов цикла известно заранее (на этапе компиляции), поэтому компилятор оптимизирует так, как ему кажется наиболее оптимально: если количество повторений не превышает 8, цикл не организуется, а "тело цикла" включается в код непосредственно нужное число раз (до 8), если количество повторений превышает 8, организуется настоящий цикл, со всеми накладными расходами на него.
Переменная delay не используется, второй цикл выполняется один раз только... Как то кривенько, не?
код не соответвует описанию
upd. Код копировал черновой, не рабочий. Прикладываю реальный. Задаю разные delay и length.
Далее картинки с разными случаями.
1. length = 1, delay = 1
2. length = 4, delay = 1
3. length = 7, delay = 1
4. length = 8, delay = 1
5. length = 9, delay = 1 (масштаб изменился)
6. length = 4, delay = 8
7. length = 4, delay = 9
Спасибо за ответ.
То есть единственным вариантом тут будет избавиться от цикла и просто устроить копипасту?
Код копировал черновой, не рабочий. Прикладываю реальный.
А люди, которые хотели Вам помочь, тратили время на то, чтобы в нём разбираться. Признаёте, что смудачили?
То есть единственным вариантом тут будет избавиться от цикла и просто устроить копипасту?
А почему ШИМом не воспользоваться? С ним что-то не так?
Тут http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/nanosekundnye-impulsy?page=1#comment-632430 ответил.
ТС чем вы компилируете и какой уровень оптимизации выставлен ? Хорошо бы листинги обоих версий увидеть.
Признаю, мой косяк. Приношу извинения.
Пытался работать со стандартным кодом, но на нем у меня не вышло получить длину импульсов порядка 200 нс с большой скважностью (>10000). Ставил еще библиотеку TimerOne.h, но там не хватало скважности.
Тут http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/nanosekundnye-impulsy?page=1#comment-632430 ответил.
ТС чем вы компилируете и какой уровень оптимизации выставлен ? Хорошо бы листинги обоих версий увидеть.
Спасибо за ответ в той ветке. Ваше объяснение проблемы выглядит исчерпывающе.
Я использую Arduino IDE 1.8.13. Все на стандартных настройках. Если честно, то разбираюсь только в базовых вещах на уровне школьной программы. Не подскажете, как выгрузить листинги?
При компиляции в логе видно путь к временной папке - в ней есть файл .lst
Ещё раз спрошу: ШИМ-то чем не устроил?
И второй вопрос, уже второй десяток постов пошёл, может пора, наконец, внятно сказать что нужно? А именно, укажите максимальные и минимальные требуемые частоты и скважности, а то разговор как-то ни о чём.
Ещё раз спрошу: ШИМ-то чем не устроил?
И второй вопрос, уже второй десяток постов пошёл, может пора, наконец, внятно сказать что нужно? А именно, укажите максимальные и минимальные требуемые частоты и скважности, а то разговор как-то ни о чём.
Минимальная длительность импульса - 100 нс, максимальная - 5 мкс, шаг изменения <=100 нс. Частота от 25 Гц до 300 кГц. Программой нужно выставить фиксированный режим работы, но должна быть возможность просто изменить его в коде.
При компиляции в логе видно путь к временной папке - в ней есть файл .lst
Файла не нашел, как понимаю, все то же самое пишется просто в окне снизу. Все переменные заменил на byte.
При length = 8, delay = 1 :
При length = 9, delay = 1 :
Там нет lst
http://arduino.ru/forum/obshchii/nastroika-kompilyatsii-v-arduino-ide#co...
В папке нет .lst файлов.
Дополнительно в настройках надо Файл Настройки поставить галочку Подробного вывода компиляции
Дополнено позже. Про файлы lst написал выше.
Вариант без встраивания в IDE описан например здесь https://tsibrov.blogspot.com/2019/06/ide-arduino-disassembling.html
Речь идёт именно о стандартной ардуине типа Uno/Nano/Mega и т.п.?
Тогда
Минимальная длительность импульса - 100 нс,
Неразрешимо. Длительность импульса всегда кратна 62,5 нс. Т.е. 62,5нс, 125нс, 187,5нс - пожалуйста. А 100нс без переделок - хренушки
шаг изменения <=100 нс.
Неконкретно, но в целом ответ тот же - 62,5нс, 125нс, 187,5нс и далее.
Частота от 25 Гц до 300 кГц.
Я Вас спрашивал о скважности. Вы не ответили. Из-за этого тут же возникают дополнительные вопросы. Например, минимальную длительность импульса необходимо обеспечить для любой из этих частот? Или для маленьких минимальный импульс подлиннее будет? Например, простыми средствами (совсем простыми) импульсы длительности 62,5нс можно получать для частот не меньше 244 Герц. Для меньших частот минимальный импульс будет длиннее (это, если просто делать).
Если Вам реально нужна помощь, то потрудитесь внятно задать вопрос. Не расписывать же мне все возможные варианты.
IDE 1.8.13 ничего не менял - lst есть
Там нет lst
http://arduino.ru/forum/obshchii/nastroika-kompilyatsii-v-arduino-ide#co...
Попробовал сделать по этому треду, тупо вываливает ошибку.
В настройках установил галочку на компиляции, но в %temp%/папка ардуино... все еще нет .lst файла, код на плату прогрузил.
Речь идёт именно о стандартной ардуине типа Uno/Nano/Mega и т.п.?
Да, arduino uno.
Неразрешимо. Длительность импульса всегда кратна 62,5 нс. Т.е. 62,5нс, 125нс, 187,5нс - пожалуйста.
Я Вас спрашивал о скважности. Вы не ответили. Из-за этого тут же возникают дополнительные вопросы. Например, минимальную длительность импульса необходимо обеспечить для любой из этих частот? Или для маленьких минимальный импульс подлиннее будет? Например, простыми средствами (совсем простыми) импульсы длительности 62,5нс можно получать для частот не меньше 244 Герц. Для меньших частот минимальный импульс будет длиннее (это, если просто делать).
В таком случае, раз есть ограничения платформы, придется поработать с такой кратностью времени. 62.5 нс, так 62.5 нс. Вообще возможность выставить минимальную частоту ~25-30 Гц нужно обеспечить на любой длине импульса, даже минимальной (62.5 нс).
Возможно ли организовать такой режим работы в принципе?
При
При
Возможно ли организовать такой режим работы в принципе?
Для самого импульса:
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/nanosekundnye-impulsy#comment-632193
А частоту можете задать хоть через delay() ...
Если надо кратность 50нс - надо кварц с 16 поменять на 20 МГш (со всеми вытекающими ...)
Возможно ли организовать такой режим работы в принципе?
В принципе, возможно, но не так просто как для частот 245 и больше Герц.
А как же блак пил? Любая длительность от 10 нс с шагом 10 нс при любой частоте повторений, пока не упрёшься в период повторений > 2^32. Или это не наш метод на нужную задачу 600 руб. потратить? Или 15 нс за 300 руб.?
А как же блак пил?
Я так понимаю, речь про esp32? Уже видел в другом топике ее упоминание, думаю приобрести. Просто ардуина была под рукой, досталась от коллеги.
Про stm32f411
P.S. разобрался почему у меня есть .lst файлы по умолчанию - у меня установлен пакет MiniCore и в нем свой platform.txt.