Смысл понятен. Спасибо за ответ.
ЭТО ГЕНИАЛЬНО!!! ))) Если придётся усреднять, то именно так и сделаю!
Пытаюсь родить что то иное. Спс за подсказку. Пока, получается, что через раз я должен наблюдать измеренное значение = 1. Надо конечно исправить.
По самым грубым подсчётам, 37 команд. То есть примерно 185нСек. (я, правда, да же близко не представляю сколько м.ц. занимают используемые мной команды)
Но тут до 1000 нСек как до луны. Должен уложиться.
Упаковать проект и выложить сюда конечно нет проблем. Но надо ли это...
Насчёт обмена понял. С учётом моих частот у меня да же длительность импульса закончится не успеет.
Минимальная частота примерно 700 Гц. То есть по расчётам не более 1428 импульсов.
Максимальная частота 10100 герц. То есть моя программа теоретически пройдёт почти 100 оборотов между импульсами.
Так что ни о каких мкСек речи не идёт))
Не понял юмора? что не так? (без сарказма. Действительно не понимаю что не так)
Неее...))) 10КГц макс.
И ещё один ламерский вопрос))) Надо ли заморачиваться делать защиту от дребезга? или это уже встроено по умолчанию? На харделла.ком вижу 1 строчку что fast_inputs учитывает настройку фильтрации. А где эти настройки по смотреть или\и поменять не нахожу...
(осцилом я вижу не большие помехи на входе... вот и болит голова)
Последний раз редактировалось TV13M; 26.07.2020 в 16:28.
Владимир здравствуйте!
Можете глянуть сколько времени занимает программа?
Что то с усреднением выходит медленно(
На после усреднения я получаю значение 104 импульса. (примерная частота 3КГц)
Последний раз редактировалось TV13M; 02.08.2020 в 12:02.
Вроде, программа-то простая.
Что значит "с усреднением выходит медленно"?
Ещё вспомнил: в program configuration есть галочка "report statistics". Её пробовали?
Тогда в генерируемых Pru0MemoryRead будет возвращаться статистика:
Можно прямо в КСД открыть и смотреть сколько времени работает PRU программа.Код:output maxCycleTimeMicros : REAL; (* maximum time it took to perform PRU cycle, microseconds *) output lastCycleTimeMicros : REAL; (* last duration of the PRU cycle, microseconds *) output maxOutputWriteTimeMicros : REAL; (* max timestamp of the output write time, microseconds *) output lastOutputWriteTimeMicros : REAL; (* last timestamp when outputs were written, microseconds *)
CycleTimeMicros -- это длительность работы PRU программы (вроде, общая)
OutputWriteTimeMicros -- это длительность обмена из PRU в КДС
max... сейчас вычисляется на КДС стороне, поэтому, да, если иногда циклы долгие, то можно не заметить.
Медленно: - осцилограф говорит что время паузы между импульсами ~285мкСек. А ПРУ программа при добавлении усреднения выводит значение 105.
За совет, спасибо. Попробую.
Пока буду искать косяк в своей программе.
А что всё-таки должна делать программа?
Измерять частоту? И что потом?
Как-никак, если указан цикл 0.5мкс, то программа 570 раз прокрутится за 28
Ещё наблюдение: есть блок PRU_CURRENT_TIME с помощью которого можно получать "количество тактов, пройденных PRU процессором" -- totalCycles
С его помощью можно относительно измерять интервалы времени.
Например:FUNCTION_BLOCK PRU_CURRENT_TIME
output totalCycles : DWORD; (* Total CPU ticks elapsed *)
output prevOutputWriteTime : DWORD; (* Absolute time when previous outputs were written (in CPU ticks) *)
output cycleLength : DWORD; (* PRU cycle length in CPU ticks *)
Тогда detla и будет интервалом между передними фронтами импульсов (единица измерения -- 1 такт, который равен 5нс).Код:FUNCTION_BLOCK FREQ variables: input in : BOOL; output cnt : WORD; output delta : DWORD; totalCycles : DWORD; prevRtrigTime : DWORD; timer : PRU_CURRENT_TIME; body: IF R_TRIG(CLK := in).Q THEN cnt := cnt + 1; totalCycles := timer.totalCycles; delta := totalCycles - prevRtrigTime; prevRtrigTime := totalCycles; END_IF;
Подал на in1 1..0..1..0 -- программа выполняется за 21..48 тактов (==0.25мкс).
Честно говоря, не понял зачем такие case, у которых все ветки одинаковые (у case всегда выполняется только одна ветка).
По bool команде вкл. выход. Частота начнёт расти. По достижении заданного значения программа выключает выход.
Проблемма в том что оказыватся частота моя очень (за короткий промежуток времени) не стабильна. Как раз ~70 Гц. (судя по осциллографу)
А требуется точность огого (( По расчётам точность получается 37 импульсов. А требуется 56. Теоретически конечно укладываюсь, но практически... пока не получается.
Пока пишу разные варианты. В пн. буду пробовать.
По изменению AverCount измеренное значение пишется в разные регистры. Потом это дело складывается и сдвигается(делим на 16)...
Но потом я понял что проще сразу складывать...
А теперь я понял что и действительно не нужены эти CASE))
Вроде стабилизировалось значение.
Пришёл к выводу что мне 2 канала всё равно не надо. Сложил и их, да усреднил как принято)
В покое, - только 1 единица скачет.
Но при этом чувствует зараза))) Рядом станок зашевелился, показания "в пляс"
Дискретность не наращивал. Т.к. по данным с осциллографа точность измерения слабо увеличится (достаточно низкая частота и довольно большие периоды). А вот разброс из за плавания частоты, прямопропорционально.