измерение длины импульса
- Войдите на сайт для отправки комментариев
Чт, 25/10/2018 - 13:19
здравствуйте.
пытаюсь решить вопрос с определением скорости uart, с помощу ардуино (16мгц)
я соеденил второй пин с rx ардуино, запустил прерывание по CHANGE , и при получении данных, собираю временные интервалы в масив, а потом в основном цикле их анализирую.
по факту, временные интервалы получаются немного меньше расчетных, например, при получении данных на скорости 57600бод, минимальные импульсы получаются 12 и 16мкс иногда 8мкс (в реалии 17мкс). но проблемма не в этом. просто когда пытыюсь замерять импульсы на скорости 115200бод, то минимальный импульс равен 8мкс и ниже засечь нельзя.
вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?
вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?
А каким способом Вы польуетесь? А то не зная этого, как определить "другой" этоили не "другой"?
То, что Вы описали - ничего не говорит,тоже самое можно сделать миллионом способов.
через прерывание.
функция прерывания выглядит примерно так (скетча сейчас нет под руками, поэтому по памяти):
time[x++] = micros() - timeold;
timeold = micros();
if (x > 99) x = 99; // был обьявлен масив размером [100]
от реальных отличается на 4-8мкс в минус, и ниже 8-10мкс не получается.
Точность функции micros - 4 мкс. Так что для таких маленьких интервалов она неприменима.
Измеряйте таймером. Можно по его (таймера) собственному прерываю по захвату изменения (на 8-ом пине, если у Вас uno/nano), а можно и по внешнему прерыванию, как Вы делали. Первое проще реализовать без потери точности. Второе надо очень аккуратно программировать.
вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?
Конечно. Запрещаете прерывание в цикле вводите отсчеты напрямую с порта и сохраняете в массиве. Затем анализируете. Надо только откалибровать на известных импульсах. Должно получится в раене пол микросекунды.
буду разбераться с таймерами)
вопрос по ходу, как-то можно быстро одмим махом очитить (обнулить) массив?
Можно. На ресет нажать. А неторопливые люди memset() пользуются. Но это не для очистки, а для заполнения.
Можно. На ресет нажать. А неторопливые люди memset() пользуются. Но это не для очистки, а для заполнения.
в моем случае это будет выглядить так?
memset
(time,
0
, 100);
а что вы хотите в байты запихать - 0x48, если '0' предлагаете ему? В любом случае будет веселее memset(time, ..., sizeof(time));
а что вы хотите в байты запихать - 0x48, если '0' предлагаете ему? В любом случае будет веселее memset(time, ..., sizeof(time));
я хочу в мой масив unsigned
long
time[100], при необходимости, записать нули
одинарные кавычки я случайно не убрал в предыдущем посте (просто скопировал и не глянул)
Ну, значит, подойдет, ежели нулями заполнить.
тока sizeof(
time[100]) = 400
Ну... а в чем проблема? sizeof(uint_32) * 100 заполненное нулями - то же самое, что sizeof(uint_8) * 400 заполненное нулями.
У ТС написано так
memset
(time,
0
, 100);
Это пусть исправляет, конечно.
Это пусть исправляет, конечно.
тоесть вот так?
memset
(time,
0
, 400);
Ну чем вам простой sizeof на массив не нравится...
да. чота я туплю под вечер.
memset(time, 0, sizeof(time));
Ну чем вам простой sizeof на массив не нравится...
вобщем писать вот так memset(time, 0, sizeof(time));?
я просто не знаю С++. почитал о данной функции, там вроде третье значение это размер масива, вот и написал 100 (у меня в скетче обьявлен unsigned long time[100];)
помогите разобратся с основной проблемой данной темы.
Первая ссылка в яндексе: http://cppstudio.com/post/673/
Указатель на блок памяти для заполнения.
val
передается в виде целого числа, но функция заполняет блок памяти символом, преобразуя это число в символ.Количество байт, которые необходимо заполнить указанным символом.
Количество байт. Какой размер массива? Ну сделайте вы массив из четырех long, забейте его разными значениями через memset и посмотрите что в Serial вылезает. Два дня простую функцию объяснять что ли?
Первая ссылка в яндексе: http://cppstudio.com/post/673/
Указатель на блок памяти для заполнения.
val
передается в виде целого числа, но функция заполняет блок памяти символом, преобразуя это число в символ.Количество байт, которые необходимо заполнить указанным символом.
Количество байт. Какой размер массива? Ну сделайте вы массив из четырех long, забейте его разными значениями через memset и посмотрите что в Serial вылезает. Два дня простую функцию объяснять что ли?
разобрался уже, посто мильком прочитал и не вник. так и сделал, проверил на практике, что она делает по факту.
помогите с таймерами разобратся.
помогите с таймерами разобратся.
AVR130: "Setup and Use of AVR Timers"
помогите с таймерами разобратся.
AVR130: "Setup and Use of AVR Timers"
Вот, поддался с утреца, посмотрел, мым жеж не грамотные, мы на ём тока разговариваем )))
За ссылку благодарность, сохранил
подскажите, пожалуйста, один момент, способ с таймером, может работать при смене значения на порту, с LOW на HIGH и наоборот одновременно (по аналогии с прерыванием CHANGE)?
или только по смене значения с LOW на HIGH?
или только по смене значения с HIGH на LOW?
Зависит от того, какой именно таймер, какой именно порт, нужен ли этот пин ещё для чего-нибудь и т.п. Вопросов больше, чем ответов. Если, например, таймер 1, то он может работать от любых (какие скажете) изменений на 8-ом пине или на 5-ом пине. Но логика работы при этом разная. На 8-ом запоминается значение, а на 5-ом просто происходит тик. Это есть по той ссылке, что я давал (не конкретные пины, а логика работы, конкретные пины есть в даташите)
задаю вопросы, потому что, перед тем как окунуться в этот АД с таймереми (для меня ад), хочу понимать, что данным способом можно решить мою задачу.