FreqMeasure + FreqCount != два частотомера

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Требуется два частотомера на одном МК.

Один канал до 1кГц, вторй до 50кГц. Частота измерения 100 м.сек.

Поотдельности обе библы прекрасно работают, но стоит добавить даже отдельно FreqMeasure.begin(); как COUNT сразу начинает выдавать пургу, в виде:

При этом что ему не подавай, все одно...

Как их пожинить?

#include <FreqCount.h>      // PIN_5 для NANO и UNO
#include <FreqMeasure.h>    // PIN_8 
double sum=0;
int count_a=0;


void setup() {
  Serial.begin(57600);
  FreqCount.begin(1000);   //COUNT = мил.сек измерительного интервала
}

void loop() {
// Для COUNT, более 1 кГц. = B
  if (FreqCount.available()) {      //Возвращает True когда новый замер готов, запоминается одно значение, должно быть считано до получения следующено
    unsigned long count = FreqCount.read();     //Считывание значения.
    Serial.print("B =  ");
    Serial.println(count);
  }

}

 

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Криво вставилось...
FreqMeasure.begin(); добавляется между 9-10 строками.
при этом сериал монитор выдает:

B =  9219
B =  9214
B =  4294910978
B =  9214
B =  9215
B =  9216
B =  9219
B =  9213
B =  9218
B =  4294910975
B =  9216
B =  9215
B =  9219
B =  9214
B =  9215
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kavalsky, одновременно они работать ни при каких условиях не могут. Можно попробовать по очереди. Инициализируйте и завершайте функции перед запуском другой функции.    FreqMeasure.begin() ...опрос....   FreqMeasure.end()  ;   FreqCount.begin() ...опрос....   FreqCount.end()

Kavalsky
Offline
Зарегистрирован: 25.03.2016

dimax, спасибо, посоветуйте каким образов в Он-лайн можно мониторить одновременно два канала ?
Куда копать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kavalsky, я же вам предыдущем посте рассказал как нужно делать.

Kavalsky
Offline
Зарегистрирован: 25.03.2016

dimax пишет:

Kavalsky, я же вам предыдущем посте рассказал как нужно делать.

Проблема с этими библиотеками. Нужно снимать сигнал с двух каналов, хотя бы раз в 1/10 сек= 10Гц.
Канал второй от 0 до 1кГц и первый от 300 до 2кГц.

1. FreqCount - первый
Чтобы получать результаты с частостой 10Гц необходимо задать FreqCount.begin(100);

В таком случае из поданный 1234 Гц мы получим ответ 123. Нужно домножить на 10, но тогда вносим погрешность.... Но самое печальное дальше.

2. FreqMeasure - второй

У него есть коэффициент кол-ва суммирования результатов (К) и вычесления среднего. Но при этом, если мерить до 50гц, и К=2, то замер происходит с частотой примерно 5Гц, если увеличить К, то там 1Гц и менее... т.е. неподходит.

Если подавать с генератора TTL 1кГц при К=2 получаем разброс на верхах 1000-1020. Отлично.

Но если тот же сигнал принимать с Генерирующей Ардуины, разброс получается 1200-1500 !!!
Если же мы установим К=20, то все отлично! 1000-1020.
Как я писал выше, повышать К нельзя, потому как на низах замер будет очень медленно проводится.

Решение 1.
Я ввел переменный К, поделил на три диапазона (<100<350<) и ввел каждому свой К.

В целом стало отлично, НО , на переходе между 99 и 101 получается адовый разброс в 75-125
При изменении К более чем 2-3 единици начинается такой разброс.

Решение 2 - не провереное
Фильтр поставить? Но не уверен и не очень понимаю какой..

Нужен совет или идея ... Заранее благодарен!

Kavalsky
Offline
Зарегистрирован: 25.03.2016

2. FreqMeasure
Для сравнения, при К = 3

на контакттах подключения к Считывающей Ардуине Осцлограф показывает 77-78 Гц
Ардуина 92-108 Гц

Тоже самое при К=15
Ардуина 82-83 = это удобоваримо, но это 3 измерения в секунду а не 10, а будет ниже частота, вообще хлам....
 

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

При низких частотах нужно не считать периоды за фиксированный интервал времени, а измерять длительность одного периода.

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

andriano пишет:

При низких частотах нужно не считать периоды за фиксированный интервал времени, а измерять длительность одного периода.

Это да, через детектор нуля для синуса, для меандра всё проще

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Сигнал - Меандр.
частота плавает от 30 до 1000 Гц
Или 1кГц это тоже низкая?

Ткните в ветку или поисковый запрос. Я не очень в теме "детектора нуля"

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

Kavalsky пишет:

Сигнал - Меандр.
частота плавает от 30 до 1000 Гц
Или 1кГц это тоже низкая?

Ткните в ветку или поисковый запрос. Я не очень в теме "детектора нуля"

Если меандр, то детектор нуля Вам не нужен.

А вот низкая или высокая... это зависит от того, что Вы можете точнее измерить:

- количество импульсов измеряемой частоты за фиксированный (не безобразно большой) интервал времени,

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

В принципе, можно измерить и точнее:

- сколько импульсов высокой частоты укладывается в некоторое количество периодов измеряемой частоты так, чтобы это измерение происходило за разумное время. Так при наличии точного кварца, скажем, на 16 МГц, можно получить за 0.1с 6 достоверных знаков.

Kavalsky
Offline
Зарегистрирован: 25.03.2016

andriano пишет:

- сколько импульсов высокой частоты укладывается в некоторое количество периодов измеряемой частоты так, чтобы это измерение происходило за разумное время. Так при наличии точного кварца, скажем, на 16 МГц, можно получить за 0.1с 6 достоверных знаков.

Ок, спасибо, беру! именно 0.1 сек. и нужно.

Как оформить, через micros и HIGH\LOW ?
Или есть более эргономичный способ?

ssss
Offline
Зарегистрирован: 01.07.2016

Вас только что пнули теорией... Слышал что типа на голой Меге это кому-то удавалось... типа на АСМе... но реализаций этого никто так и не видел...

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Ребята, а чтож все замерли, все в лицах участвовали в ветке :)
http://arduino.ru/forum/programmirovanie/prostoi-chastotomer

Еще нашел вот такуую библу http://playground.arduino.cc/Main/PinChangeInt
Если скрестить ее с TimerOne то должно что-то получится.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kavalsky, вы ставите себе задачу не "по-плечам". И помощи вряд ли дождётесь, т.к.  по-уму тут не нужно никакие библиотеки скрещивать, а нужно взять и написать весь алгоритм двух счётчиков с ноля, только так можно учесть все нюансы и получить желаемое. 

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Все, отбой, заработало.
Прерывания наше все.

satelit 2
Offline
Зарегистрирован: 04.12.2016

запишусь на уведомления, надо собрать

bwn
Offline
Зарегистрирован: 25.08.2014

satelit 2 пишет:

запишусь на уведомления, надо собрать

Прошел всего год и месяц))))

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

Gino
Offline
Зарегистрирован: 01.11.2017

Добрый день! Может кто подскажет как удобнее поправить билиотеку FreqCount под себя.

Задача такая что есть разные сигналы от 1 кГц до 100кГц меандр. И мне нужно в некоторы случаях фиксировать когда 2 контакта с разными сигналами соприкоснулись, например 78кГц и 10кГц. библиотека их отлично резала и выдавала в этом случае 48кГц(что-то около этого, точно не помню). Мне по сути не обязательно знать какие частоты есть и тд. мне надо знать что видит кабель"1" или "1+2" или "2". 

Может есть какие идеи?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Gino, возможно будут идеи если приведёте фактическую осцилограмму смешанных сигналов. Т.е. именно в том месте, в котором планируется подключение.  Ибо соединение двух импульсных сигналов  без специального сумматора - это короткое замыкание, и что у вас будет в реальной цепи совершенно неведомо.