Простой частотомер

Buldakov
Offline
Зарегистрирован: 17.01.2016

ua6em пишет:

а если мне надо мерить от 200Кгц до 400Кгц что изменить в коде

Для измерения таких частот надо изменить F_min на значение 1000, Хотя в принципе ничего можете не менять. Работать будет и так.

Другое дело, если измерять надо частоты от нескольких Гц. В таком случае F_min  должна быть в несколько раз меньше минимальной измеряемой частоты. Но не меньше 1.

F_min            =   100;  //Минимальная измеряемая частота

 

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

Оживлю немного тему, как добавить в код из поста #3 показания коэффициента заполнения ("скважности")?

Buldakov
Offline
Зарегистрирован: 17.01.2016

Данный частотомер не может измерять скважность. Что бы это сделать необходимо полностью менять принцип работы. Вместо таймера считающего входную частоту необходимо использовать два прерывания. По одному прерыванию считается длительность импульса. По другому - паузы. При этом максимальная частота будет ограничена значением около 120 кгц.

b707
Онлайн
Зарегистрирован: 26.05.2017

Buldakov пишет:

Точность измерения на 100 Гц и на 4500000 Гц одинаковая и составляет 4/16000000 - это программная точность.

Количество знаков зависит от частоты: При времени измерения 1 сек.

от 100000 Гц и выше 0.1 Гц

от 10000 до 100000 Гц - 0.01 Гц

от 1000 до 10000 Гц - 0.001 Гц

от 100 до 1000 Гц - 0.0001 Гц

Касательно этих цифр - рекомендую подтянуть теорию и ознакомится с теоремой Найквиста-Котельникова, из которой следует, что точность измерения реального частотного сигнала не может быть лучше единицы деленной на время измерения. Таким образом, при времени измерения 1 сек - точность теоретически не может быть лучше 1 Гц. При 10 сек - 0.1 Гц Это в теории. На практике точность может быть только хуже.

Так что все цифры после запятой рекомендую убрать. Профессионалы засмеют.

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

b707 пишет:

Buldakov пишет:

Точность измерения на 100 Гц и на 4500000 Гц одинаковая и составляет 4/16000000 - это программная точность.

Количество знаков зависит от частоты: При времени измерения 1 сек.

от 100000 Гц и выше 0.1 Гц

от 10000 до 100000 Гц - 0.01 Гц

от 1000 до 10000 Гц - 0.001 Гц

от 100 до 1000 Гц - 0.0001 Гц

Касательно этих цифр - рекомендую подтянуть теорию и ознакомится с теоремой Найквиста-Котельникова, из которой следует, что точность измерения реального частотного сигнала не может быть лучше единицы деленной на время измерения. Таким образом, при времени измерения 1 сек - точность теоретически не может быть лучше 1 Гц. При 10 сек - 0.1 Гц Это в теории. На практике точность может быть только хуже.

Так что все цифры после запятой рекомендую убрать. Профессионалы засмеют.

ну так это и без теоремы понятно, чисто с позиций здравой логики )))

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

b707 пишет:

Касательно этих цифр - рекомендую подтянуть теорию и ознакомится с теоремой Найквиста-Котельникова, из которой следует, что точность измерения реального частотного сигнала не может быть лучше единицы деленной на время измерения. Таким образом, при времени измерения 1 сек - точность теоретически не может быть лучше 1 Гц. При 10 сек - 0.1 Гц Это в теории. На практике точность может быть только хуже.

Так что все цифры после запятой рекомендую убрать. Профессионалы засмеют.

Профессионалы конечно смеются, но и над вами тоже. При reciprocal counter получаем 7 цифр точности при 10000000 МГц тактовой независимо от входной частоты. Т.е. 1 Гц входной с точностью +-0,000001 при времени измерения 1 сек. померять реально. Не на голой меге конечно, Леонид Иванович CPLD ещё к меге цеплял. На СТМ8 и СТМ32 можно и без CPLD сделать, там таймера более продвинутые.

b707
Онлайн
Зарегистрирован: 26.05.2017

ssss пишет:

Профессионалы конечно смеются, но и над вами тоже. При reciprocal counter получаем 7 цифр точности при 10000000 МГц тактовой независимо от входной частоты. Т.е. 1 Гц входной с точностью +-0,000001 при времени измерения 1 сек. померять реально.

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

Так же и с частотой. Физически невозможно различить два сигнала с разницей частоты df за время, меньшее чем 1/df .

 

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

b707 пишет:

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

Так же и с частотой. Физически невозможно различить два сигнала с разницей частоты df за время, меньшее чем 1/df .

Теперь над вами можно смело смеяться во весь голос! )))))))))))))))))))))))))))))))

А мужики ведущих фирм частотомеростроения то и не знали! )))))))))))))))))))))

Да на сранном СТМ8 это легко и непринуждённо делается, в железе, уже проверено. А вы тут со своей геморройной авр-теорией надрываетесь. ))))))))))))))))))))))))))

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

ssss пишет:

При reciprocal counter получаем 7 цифр точности при 10000000 МГц тактовой независимо от входной частоты.

Запятая сцуко затерялась. Должно быть так.

Цитата:

При reciprocal counter получаем 7 цифр точности при 10,000000 МГц тактовой независимо от входной частоты.

Далее по тексту.

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

b707 пишет:

Это так называемая "точность вычисления" - и к реальной точности измерения она никаким боком. 

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

Buldakov
Offline
Зарегистрирован: 17.01.2016

Ну сдесь конечно и расписали все прелести. Проект первоначально разрабатывался для изменения относительного измерения малых значений частоты. Надо было измереть точно разность между 7899.25 и между 7899.26 Гц. При этом нужна была только разница. Значение самой частоты не нужно было.Частотомер получился как побочный эффект. Цена нужна была до 200 руб и размером со спичечный коробок.

А если кому то надо мерить точно частоту - пусть покупает фабричную штуковину.

b707
Онлайн
Зарегистрирован: 26.05.2017

ssss пишет:

Запятая сцуко затерялась. Должно быть так.

При reciprocal counter получаем 7 цифр точности при 10,000000 МГц тактовой независимо от входной частоты.

Ну да, и в точности тоже запятая затерялась - должно быть 0.000001 Мгц, а не 0.000001 Гц - тогда верно.

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

b707 пишет:

должно быть 0.000001 Мгц, а не 0.000001 Гц - тогда верно.

Для 1 Гц - 0.000001 Гц, для 1МГц - 0.000001 Мгц. Кароче, 7 знаков и в африке 7 знаков. Гуглите сначала, просвещайтесь, потом уже и в спор влазьте.

demyan2
Offline
Зарегистрирован: 10.12.2014

А можно  увидеть  схему  подключения дисплея ?

b707
Онлайн
Зарегистрирован: 26.05.2017

ssss пишет:

 Гуглите сначала, просвещайтесь, потом уже и в спор влазьте.

Ага, почитал. Интересная техника. Как я понял, частота отсчетов исходного сигнала совмещается с самим сигналом, что дает возможность обойти математические ограничения последовательных измерений.

Да, вероятно был неправ.

Buldakov
Offline
Зарегистрирован: 17.01.2016

Алгоритм примерно такой:

С приходом фронта очередного входного импульса запускается счет тактов частоты 16 мгц. По истечении времени 1 сек. и с приходом очередного фронта импульса счетчик тактов останавливается. Затем одно целое число делится на другое и получаем частоту. В обычных частотомерах используется подсчет входных импульсов за 1 сек. с обрезанием входного импульса по времени равному 1 сек. (Для больших частот это не принципиально.)

Да и еще замечание: Частотомер работает только при наличии входной частоты. Если на вход ничего не подавать он не будет показывать нулевую частоту. Экран при этом обновляться так же не будет.

А по поводу теоремы Котельникова. Вы сами то ее хорошо знаете?  Она применяется для аналоговых сигналов. Хотя если брать ее в общем виде - то для сигналов любой формы включая и прямоугольный сигнал. Что то типа если у нас есть синус частотой 1000 Гц. то для правильного восстановления аналогового сигнала оцифровывать сигнал надо хотя бы с частотой 10000 Гц.

Только не надо здесь говорить, что достаточно частоты оцифровки 2000 Гц. Кто не верит пусть попробует проделать такой опыт: Берем листочек в клеточку и рисуем какой нибудь сигнал. Затем делаем отсчеты с частотой в 2 раза больше частоты сигнала. Переносим эти отсчеты на другой листочек и по точкам не глядя на первый листок восстанавливаем сигнал. А потом сравниваем две картинки. И если вы рисовали произвольный сигнал - то восстановить первоначальный сигнал не получится.

https://blog.amartynov.ru/%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0-%D0...

 

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

Buldakov пишет:

С приходом фронта очередного входного импульса запускается счет тактов частоты 16 мгц. По истечении времени 1 сек. и с приходом очередного фронта импульса счетчик тактов останавливается. Затем одно целое число делится на другое и получаем частоту.

А частоту тактовой где потеряли?

freq = (Fclk * cnt_input) / cnt_ref;

Цитата:

Да и еще замечание: Частотомер работает только при наличии входной частоты. Если на вход ничего не подавать он не будет показывать нулевую частоту. Экран при этом обновляться так же не будет.

Ну это уже ваши недоделки. Тупо проверяем на ноль счётчик тактовых. Да делить на ноль как бы нельзя.

Buldakov
Offline
Зарегистрирован: 17.01.2016

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

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

Buldakov пишет:

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

Всё равно это ваша недоработка. Защитный интервал ещё никто не отменял.

Buldakov
Offline
Зарегистрирован: 17.01.2016

А никто и не спорит с этим. Другое дело, что я незнаю пока как это решить.

Ihor
Offline
Зарегистрирован: 10.11.2017

А мне частотомер понравился очень. Автору благодарность. Работает на ардуинке про мини.

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

Ihor пишет:

А мне частотомер понравился очень. Автору благодарность. Работает на ардуинке про мини.

Этот прибор будет частотомером когда в ардуине кварц будет заменен на кварцевый генератор с PPT 0,5 и лучше, но как образец реализации устройства на ардуино и показометр отличная вещь

SieOK
Offline
Зарегистрирован: 29.03.2018

Вопрос такого плана: нужно выводить частоту инвертора регулировки оборотов двигателя (пределы частоты 1-500Гц), то есть не большие значения.

Ставить двухстрочный экран 16х2 накладно, проще 3-х разрядный семисегментник (может быть со сдвиговыми регистрами)

Да и ардуину для этого жалко, лучше Tiny13 (ардуиновский код в нее заливается)

Есть ли готовый для допиливания код? Ткните пожалуйста ссылку

Может ли кто поопытнее чтобы переделать Ваш код под эту задачу?