Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:36

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: измерение частоты с точностью до тысячных
СообщениеДобавлено: 14 сен 2019, 19:28 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 95
Недавно мне была поставлена задача измерять частоту датчика с точностью до чисел после запятой,хотя бы до десятых долей. Для этих целей я использовал систему захвата микроконтроллеров AVR. Суть моего алгоритма заключается в следующем:

Тактирование таймера настраивается так, что каждый его подсчёт это 1 микросекунда. Сделал я это поделив частоту контроллера на 8 и подав на вход таймера. Так как частота таймера 8 Мгц,то таймер тактируется от 1 Мгц, а 1 Мгц это один миллион, а в секунде 1 миллион микросекунд. Как результат таймер может посчитать 65535 микросекунд. Потом я настраиваю срабатывание системы захвата по нарастающему фронту. То есть приходит положительный импульс на ножку, значение из таймера сохраняется и вызывается прерывание. Как результат,то, сколько раз будет вызвано прерывание за секунду - есть количество пришедших импульсов за секунду. Плюс мы знаем период в микросекундах. Проблема была в том, что терялись куски времени после начала секунды и до её окончания.
Ниже на картинке показываю что имею ввиду.
Вложение:
суть.png
суть.png [ 13.25 Кб | Просмотров: 728 ]


и именно в этом месте я долго думал, как эту потерянную часть измерить как дробную часть. Тут у меня и возник один алгоритм, который я и реализовал, но до сих пор не уверен правильно ли сделано. Не упустил ли я чего.
Вложение:
алгоритм.png
алгоритм.png [ 16.32 Кб | Просмотров: 728 ]


Мы измеряем время от начала секунды до следующего импульса и запоминаем его

Код:
//измерился  импульс после начала секунды
   if ((flags&(1<<sec_started)))
   {
      //запоминаем время
      period_after_second_start_and_next_imp = capture_value;
      //сбрасываем флаг того что было начало секунды
      flags &= ~(1<<sec_started);
   } else
         {
           //если это не начало секунды,то увеличиваем считанное количество импульсов
           //считывать первый импульс не имеет смысла, так как он неполный. Лучше измерить его длительность
           //а потом сравнить с временем полного импульса,определить коэффициент и прибавить к
           //реальной частоте
           frequency++;
           sum_of_periods_to_read += capture_value;
        }


если секунда только началась, то просто запоминаем время в переменной period_after_second_start_and_next_imp. Это время Ts
на картинке.
Если условие не выполняется, то мы просто увеличиваем переменную, которая хранит частоту.
Вдобавок к этому мы суммируем время каждого импульса за всю секунду в переменную sum_of_periods_to_read (это сумма времени Tr).

когда секунда кончается вызывается другое прерывание где я запоминаю время от предыдущего импульса до окончания секунды
Код:
      //записываем время между последним импульсом и окончанием секунды
   if (frequency!=0)
   period_before_second_end = TCNT1;

Теперь в переменной period_before_second_end хранится время между последним импульсом и окончанием секунды, то есть время Te.

После окончания секунды я делаю собственно вот это
Код:
      sum_divided_by_freq = sum_of_periods/frequency_on_display;
            
            //складываем значения времени по бокам секунды
            sum_of_two_measures_on_sides = period_before_second_end+period_after_second_start_and_next_imp;
            //сравниваем,превышает ли сумма боковых измерений эталонный период
            if (sum_of_two_measures_on_sides>sum_divided_by_freq)
            {
               //если превышает,то вычитаем и узнаём,сколько остаётся
               the_rest_after_compare_measurements = sum_of_two_measures_on_sides-sum_divided_by_freq;
               frequency_on_display += 1;
            }else
            {
               the_rest_after_compare_measurements = sum_of_two_measures_on_sides;
            }


сначала я делю сумму периодов на количество импульсов и получаю средний период, который хранится в переменной sum_divided_by_freq. Далее я складываю время Ts и Te и сумму кладу в sum_of_two_measures_on_sides. Потом сравниваю, является ли сумма больше чем средний период. Если больше,то получается, с моей точки зрения,было потеряно больше чем один импульс, следовательно я увеличиваю количество герц частоты, а потом вырезаю из суммы Ts и Te время одного импульса и как результат, там остаётся мой остаток, который я храню в the_rest_after_compare_measurements.
Если условие не выполняется, то получается что было потеряно меньше чем один импульс и тогда мы просто сохраняем его в той же переменной. Далее я уже могу вычислить дробную часть.
Делаю я это так:

Код:
            the_rest = the_rest_after_compare_measurements;
            the_rest = the_rest*10;
            the_rest = the_rest*10;
            the_rest = the_rest*10;
            the_rest /= sum_divided_by_freq;


Я умножаю остаток на 1000 и потом делю на средний период(сохраняю в the_rest). То есть если у меня средний период 1900 миллисекунд,а остаток 900 миллисекунд, то остаток для частоты будет (900*1000)/1900 = 473
и если частота была,например 525 Гц,то результат будет 525.473

Вот собственно и всё. Вопрос только один, правильно ли я разработал алгоритм,то есть можно ли так измерять остаток частоты?
результат получился вроде хорошим, частота почти совсем не скачет(как это было до реализации алгоритма), только мучают мутные сомнения. Напоследок скажу, что секунда берётся с часов реального времени, которые раз в секунду генерируют импульс, который я завёл на прерывание. А частота датчика варируется между 500 и 1500 герц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 14 сен 2019, 21:38 
Супермодератор
Аватара пользователя

Зарегистрирован: 27 янв 2010, 07:40
Сообщения: 5371
Откуда: Новосибирск
Я бы секунду начинал отсчитывать только после первого захваченного фронта.

_________________
Ищу работу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 14 сен 2019, 22:08 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 230
На практике использовали 2 алгоритма.

1. То, что обозначено как "потерянное время", подавали как сигнал включения источника тока, заряжавшего конденсатор. Напряжение, до которого заряжался конденсатор, пропорционально длительности "потеряшки". Затем с помощью АЦП измеряли это напряжение и учитывали при вычислении частоты. Для компенсации погрешностей (в первую очередь конденсатора и источника тока) периодически подключали на вход сигнал эталонной частоты кварцевого генератора. Ну а правильность измерения частоты эталонного генератора калибровали по прецизионному генератору. Итог: 4 знака после запятой в диапазоне 20..14000 Гц. Больше не проверяли, нужды не было.

2. Другой вариант состоял в том, что "потеряшку" подавали на вход разрешения внешнего счётчика, который считал очень высокую частоту заполнения "потеряшки", примерно, в 1000 раз больше частоты измеряемого сигнала. Нюанс заключался в том, что внешний счётчик выступал предделителем частоты для внутреннего счётчика контроллера. При вычислениях учитывался код как внешнего счётчика, так и внутреннего счётчика контроллера. Результат аналогичен первому способу, только реализовывался полностью "в цифре".

Оба прибора имели сертификат метрологической аттестации. Я бы рекомендовал второй вариант как более просто реализуемый. Кстати, он был реализован в малогабаритном ручном измерителе с батарейным питанием. В первом приборе стоит Интеловский 8044, во втором- ADuC812.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 14 сен 2019, 22:56 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
F3 - частота таймеров 144 MHz. Т.е. по каждому импульсу можно измерять с достаточной точностью, а с усреднением за несколько секунд - ... ещё точнее.
Если F3 дорого, можете взять f030. Низкую частоту таймеров можно компенсировать долгим измерением.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 14 сен 2019, 23:28 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2618
Откуда: Русь, Новороссийск
tonyk писал(а):
На практике использовали...
[...]
2. [...]

Вот "практиков" видно с нескольких строк :)
tonyk, жму пять :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 15 сен 2019, 07:37 
Только пришел
Аватара пользователя

Зарегистрирован: 15 сен 2019, 06:45
Сообщения: 14
Откуда: Москва
николай19971997, похоже вы пытаетесь программными средствами реализовать метод "Reciprocal counting" , возможно для таких низких частот точность и получится приемлемой, но лучше это делать аппаратно, например как тут https://radiokot.ru/konkursCatDay2017/16/
Ну и к сожалению 8-битный AVR -не лучший выбор для таких задач.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 15 сен 2019, 14:09 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 95
Melted Metal писал(а):
Я бы секунду начинал отсчитывать только после первого захваченного фронта.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 15 сен 2019, 14:13 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 95
dimax писал(а):
николай19971997, похоже вы пытаетесь программными средствами реализовать метод "Reciprocal counting" , возможно для таких низких частот точность и получится приемлемой, но лучше это делать аппаратно, например как тут https://radiokot.ru/konkursCatDay2017/16/
Ну и к сожалению 8-битный AVR -не лучший выбор для таких задач.
Спасибо за ссылку. Я гуглик везде эти алгоритмы измерения частоты но нигде не мог найти что то похожее. Спасибо за ссылку. К сожалению, стм32 я ещё не изучил, в процессе, так сказать, так что приходится довольствоваться авр. Мне просто повезло что частота датчика достаточно низкая для таких контроллеров. Проблема просто в том, что микроконтроллер всё равно придётся использовать, так как данные нужно записывать на носитель.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 15 сен 2019, 14:14 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 95
tonyk писал(а):
На практике использовали 2 алгоритма.

1. То, что обозначено как "потерянное время", подавали как сигнал включения источника тока, заряжавшего конденсатор. Напряжение, до которого заряжался конденсатор, пропорционально длительности "потеряшки". Затем с помощью АЦП измеряли это напряжение и учитывали при вычислении частоты. Для компенсации погрешностей (в первую очередь конденсатора и источника тока) периодически подключали на вход сигнал эталонной частоты кварцевого генератора. Ну а правильность измерения частоты эталонного генератора калибровали по прецизионному генератору. Итог: 4 знака после запятой в диапазоне 20..14000 Гц. Больше не проверяли, нужды не было.

2. Другой вариант состоял в том, что "потеряшку" подавали на вход разрешения внешнего счётчика, который считал очень высокую частоту заполнения "потеряшки", примерно, в 1000 раз больше частоты измеряемого сигнала. Нюанс заключался в том, что внешний счётчик выступал предделителем частоты для внутреннего счётчика контроллера. При вычислениях учитывался код как внешнего счётчика, так и внутреннего счётчика контроллера. Результат аналогичен первому способу, только реализовывался полностью "в цифре".

Оба прибора имели сертификат метрологической аттестации. Я бы рекомендовал второй вариант как более просто реализуемый. Кстати, он был реализован в малогабаритном ручном измерителе с батарейным питанием. В первом приборе стоит Интеловский 8044, во втором- ADuC812.


спасибо за подсказки. Буду разбираться


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 15 сен 2019, 14:30 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4335
Откуда: Кемеровская область, Киселевск
http://we.easyelectronics.ru/STM32/chas ... 2f10x.html

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 16 сен 2019, 22:59 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Reciprocal counter, это уже мем на радиокоте.
Спасибо Стасу!
Реализация на стм32 практически полностью аппаратная.
По всем приведенным здесь ссылкам -все совсем не то...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 16 сен 2019, 23:47 
Только пришел
Аватара пользователя

Зарегистрирован: 15 сен 2019, 06:45
Сообщения: 14
Откуда: Москва
dosikus_2, мем мемом, но реальный проект под stm32 (по человечески оформленный) так никто и не выложил. Есть что-то помимо того исходника, что выкладывал Галицин ? (тут https://radiokot.ru/forum/viewtopic.php ... 5#p2498295 )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 00:29 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
dimax, если вы 'серьезно' хотите измерять частоту на STM32, то первым пунктом задайте на нее нормальный clock. Т.к. встроенный PLL только для свистелок и пойдет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 13:39 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
dimax, есть и чЁ ? Это собственность Стаса(HHIMERA)...
Хотя, читай в той же ветке он все расписал от и до...

u37, до 180МГц на 103ьем тебе мало?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 13:54 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 323
Если малосерийка, можно к АВР прикрутить CPLD а в ней уже reciprocal counter реализовать. И выплевывать результат измерения по SPI. EPM240 в малоопте рублей 150 будет стоить а проект в разработке простейший.

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 14:01 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
45893569365, оно работает даже на стм8L и без FPGA и всего -то пара таймеров+дма


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 14:10 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 323
Ага, я делал на STM32. Но если архитектуру нет желания менять (основной софт уже написан) то прикрутить CPLD вполне возможно.

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 14:17 
Только пришел
Аватара пользователя

Зарегистрирован: 15 сен 2019, 06:45
Сообщения: 14
Откуда: Москва
dosikus_2 писал(а):
dimax, есть и чЁ ? Это собственность Стаса(HHIMERA)...
Хотя, читай в той же ветке он все расписал от и до...


dosikus_2, при всём уважении, такое ощущение , что вы отвечаете не читая вопрос.
Я поинтересовался, есть ли готовый, опубликованный проект, аналогичный тому, что выложен на коте https://radiokot.ru/konkursCatDay2017/16/ или проекту FC-510 от Леонид Иваныча ? С подробным описанием, с техническими характеристиками, схемами, и со всеми исходниками конечно?
Да, Himera в кратце описал метод , Галицын в конце топика выложил свой вариант. Но никаких реальных воплощённых проектов, никаких тестирований , -ничего из этого за прошедшие 5 лет так и не появилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 14:41 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
dimax, что вам в моем сообщении не понятно?
Хорошо подробней.
Есть рабочие исходники , работает изумительно , схема там не нужна, у Галицына совершенно не то.
Исходники приватные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 15:48 
Старожил

Зарегистрирован: 26 авг 2014, 10:34
Сообщения: 767
может пригодится
на AVR:
http://www.mshopf.de/proj/avr/freq_meter.html
потуги на STM32 (надо допиливать):
https://radiokot.ru/forum/viewtopic.php ... 7#p3189687


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 16:09 
Только пришел
Аватара пользователя

Зарегистрирован: 15 сен 2019, 06:45
Сообщения: 14
Откуда: Москва
oleg110592, пригодится, спасибо. Тот, что на avr очень неплохо задокументирован по характеристикам, + схема, исходники, в общем всё как я люблю :)
А что не так в stm варианте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 16:53 
Старожил

Зарегистрирован: 26 авг 2014, 10:34
Сообщения: 767
смутно помню что начинать счет надо с началом фронта входного сигнала, а там начинается когда попало - на низких частотах погрешность больше


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 17 сен 2019, 18:25 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 323
Можно использовать внешние триггеры для синхронизации окна.

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 18 сен 2019, 08:43 
Заглядывает иногда

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 71
В описании к прибору FC-510 есть отличный документ, в котором описываются методы повышения точности измерения частоты.

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: измерение частоты с точностью до тысячных
СообщениеДобавлено: 25 сен 2019, 00:38 
Старожил

Зарегистрирован: 02 июл 2010, 23:41
Сообщения: 437
Как всё сложно, сложные алгоритмы, частоты 180 МГц, CPLD…
В предлагаемые варианты не вникал, слишком сложно, может, что-то не понял, но почему бы не использовать самый простой лобовой вариант.
На 8-битный таймер подавать на счёт импульсы до переполнения, 16-битный таймер использовать для отсчёта времени до переполнения первого таймера.
Затем разделить 256 на показания таймера – и вот он результат.
Пример.
Таймер сделать с отсчётом 1 мксек.
Запустили процесс, скажем, таймер сделал 250001 отсчёт.
Для деления числитель придётся умножить на миллиард.
Получаем, частота f равна:
f = 256 000 000 000 / 250 001 = 1 023 995
Погрешность вроде как получается около 0,01 Гц.
Отсчётов у таймера много, придётся «прикрутить» к аппаратному таймеру один или пару байтов из регистров RON.
Программа будет небольшой, наверно, в пределах 1 килобайта.
Можно использовать простенький МК AVR с кварцем на несколько мегагерц, скажем, расхожую Atmega8.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB