Наносекундные импульсы

andrey3824
Offline
Зарегистрирован: 17.03.2020

Komandir пишет:

Да я вообще не программист, но нужда появилась, делаю как могу.
Да, есть фриланс, знаю...

andrey3824
Offline
Зарегистрирован: 17.03.2020

andrey3824 пишет:

Да я вообще не программист, но нужда появилась, делаю как могу.

Ну и научиться уже хочу..

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...

приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

Komandir пишет:

По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...

приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))

IMHO некрасиво сравнивать аппаратные решения с программными.

Но, с другой стороны, если с одной стороны, ТС нужно решит конкретную задачу, а с другой - он в схемотехнике чувствует себя более уверенно, чем в программировании, предложение заменить программный подход на программно-аппаратный либо аппаратный - дельная мысль.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em пишет:

приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))

Я про отладку код-результат (в доступной форме).

andrey3824
Offline
Зарегистрирован: 17.03.2020

Мне хватило бы примера единичного импульса с заданной длительностью,
я понимаю, что всё к кварцу привязывается и получить точные интервалы не получится.
Можно с частотой поиграть немного. В примере выше все идет по кругу.

herzdp
Offline
Зарегистрирован: 30.11.2021

Нашел код в интернетах, слегка модифицировал, тоже очень нужны были такие импульсы. Первый цикл задает длину импульса, второй расстояние между ними. Выдает что-то около 2.6 МГц или ~60 нс/шаг на минимальных значениях. Видел еще код, который дает 8 МГц прямоугольники со скважностью 50%, но там не получилось регулировать параметры импульса.

Также вопрос знатокам, в этом коде при выставлении значений length и delay более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? Выставлял разные типы переменных, выходил в восьмеричную и тд системы, но ничего не помогло. При этом, если накопировать в лоб строки с 1 и 0 условные 10 раз, то такого не наблюдается, идет линейный набор. Пробовал загонять в while и тп, ситуация как с for.

Спасибо, если кто-то подскажет.

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
   }

}

 


 

rkit
Offline
Зарегистрирован: 23.11.2016

Возьми esp32, там есть специальный блок генерации последовательностей импульсов разной длины - RMT, с разрешением 2.5нс, если не ошибаюсь. Работает тупо от массива длин импульсов и пауз. С AVR это сплошной геморой, да еще и разрешение так себе. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

herzdp пишет:

...около 2.6 МГц или ~60 нс/шаг на минимальных значениях...

Вы с порядком ошиблись ...

herzdp пишет:

...более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? ...

скачок легко объяснить ...

если включена оптимизация, то компилятор несколько циклов заменяет повтором

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

приращение счетчика,

сравнение (задействован тип int, а это 16 бит на 8 битном процессоре - опять лишние команды),

переход ...

 

это и приводит к скачку...

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

andrey3824
Offline
Зарегистрирован: 17.03.2020

Другая задача теперь. 
Допустим, есть два массива в коде
 

byte d1[] = {10, 10, 10, 10, 10}; //длительность импульса, мкс
byte d2[] = {   15, 15, 15, 15 }; //длительность паузы, мкс

и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?

andrey3824
Offline
Зарегистрирован: 17.03.2020

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andrey3824 пишет:

Другая задача теперь. 
Допустим, есть два массива в коде
 

byte d1[] = {10, 10, 10, 10, 10}; //длительность импульса, мкс
byte d2[] = {   15, 15, 15, 15 }; //длительность паузы, мкс

и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?

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

Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.

nik182
Offline
Зарегистрирован: 04.05.2015

У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.

Настройка таймера в кубе:

andrey3824
Offline
Зарегистрирован: 17.03.2020

andriano пишет:

andrey3824 пишет:

Другая задача теперь. 
Допустим, есть два массива в коде
 

byte d1[] = {10, 10, 10, 10, 10}; //длительность импульса, мкс
byte d2[] = {   15, 15, 15, 15 }; //длительность паузы, мкс

и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?

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

Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.


Да, всё верно, с недавних пор так и стал делать.

andrey3824
Offline
Зарегистрирован: 17.03.2020

nik182 пишет:

У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.

Настройка таймера в кубе:


Не раз уже к STM отправляли

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так не надо отвёрткой гвозди заворачивать, а молотком шурупы забивать. Под каждую задачу нужен свой инструмент. А пытаться решить задачи тем что есть под рукой, это как стоя в гамаке - спасибо микаде за напоминание анекдота.

andrey3824
Offline
Зарегистрирован: 17.03.2020

nik182 пишет:
Ну так не надо отвёрткой гвозди заворачивать, а молотком шурупы забивать. Под каждую задачу нужен свой инструмент. А пытаться решить задачи тем что есть под рукой, это как стоя в гамаке - спасибо микаде за напоминание анекдота.

Верно. А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andrey3824 пишет:

А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)

Не факт.

А потом - ты еще закрути его - гвоздь отверткой.

andrey3824
Offline
Зарегистрирован: 17.03.2020

andriano пишет:

andrey3824 пишет:

А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)

Не факт.

А потом - ты еще закрути его - гвоздь отверткой.

Это шутка такая))