Замечательно, в каком-то своем устройстве можно использовать более продвинутые методы когда нужно производить измерения достаточно быстро, но точность то упадет все равно, потому в частотомере, как приборе, никто так измерять частоты не будет.
С какого перепуга должна упасть точность? И с какого перепуга методы измерения в приборах и в оборудовании должны отличаться? Откуда Вы все это взяли?
С какого перепуга должна упасть точность? И с какого перепуга методы измерения в приборах и в оборудовании должны отличаться? Откуда Вы все это взяли?
Смотрим на график
При длительности измерения 1 сек и опорной частоте 10MHz получим 7 значащих цифр, а если, как ты предлагаешь, производить измерения за очень малый измерительный интервал, например, за 1ms, то их будет всего 4, а частоты меньше 1KHz мы таким образом нормально и не измерим, т.к. не будет хотя бы одного целого периода. Такой подход может быть полезен если в любом случае измерения необходимо провести быстро, но для чего торопиться частотомеру? Чтобы 1000 раз в сек вывести в 1000 раз менее точный результат? Типичный любительский частотомер редко опускает время измерения ниже 0.1 сек, исключения есть, но это скорее режимы для галочки, которые остаются невостребованными.
О арифметике частотомеров Л.И. и FC-510 - живехонький форум с участием самого http://www.diod.club/forum/topic.php?fo ... pic=25&p=7 оттуда: СпойлерA: Леонид Иванович, а вы используете в своей программе управления FC-510 - расчеты с плавающей запятой?
B: Нет, плавающую запятую не использую. Точности 32-разрядных float недостаточно, требуются 64-разрядные double. Но в этом случае не хватает памяти ATmega8.
A: Частота 9Мгц в режиме 10с измеряется так - если меняются младшие разряды в процессе измерения- то последний девятый всегда - 0
B: Да, такое наблюдается. Можно даже подать 9 кГц - будет то же самое. Но я не понимаю, почему так происходит. Скорее всего, дело в строке 325 модуля Count.c, для переменной Nx не хватает 64 бит. Для исправления ситуации, похоже, придется переходить на плавающую арифметику, а это большой кусок работы. Думаю, что для любительских целей 9 знаков результата получать не очень нужно.
Попробовал использовать плавающую запятую - памяти не хватает безнадежно.
Когда интервал 10 сек. при опорной 12.8 МГц, то с учетом интерполятора (к = 100) значение Mx = 12800000000. Значение Nx в худшем случае (зависит от входной частоты) может быть 0x7FFFFFFFFFFFFFFF / 10 = 922337203685477580. Целочисленное деление даст 72057594, что меньше 9 знаков. Не знаю, как выйти из ситуации. Может деление делать в два этапа с промежуточным масштабированием?
Присоединил v3.2, где попытался ошибку округления исправить. Теперь надо тестировать.
A: Ура работает! К нашим баранам: Хобийному чисто частотомеру, как вырисовалось, точность сильная не надо, можно на низких частотах один метод - обратный, на высоких - прямой. Минимум деталей и обычный кварц очень хорошо тоже, пока для хобби. Потом хоббист может применить полученные знания профессионально с повышением точности - знать целых два метода это зачет при приеме на работу. Теория прямого/обратного счета и аналоговый интерполятор доступным языком в документации от Л.И.: http://www.leoniv.diod.club/projects/me ... fc-510.pdf
Тут нашел еще: Вот теория, от GM: Измерение частоты с помощью авр микроконтроллера
Спойлер1) Введём определения Fо - сигнал опорной частоты, То - период опорной частоты, То=1/Fо, Fx - входной сигнал (меандр) неизвестной частоты, подлежащей измерению, Тх - период входной частоты, Тх=1/Fx, Тизм - период измерения входной частоты, N - количество импульсов опорной частоты за время измерения, M - количество импульсов входной частоты за время измерения.
2) Формула вычисления частоты Fx = Fо*М/N (поскольку очевидно, что То*N=Тх*М за Тизм).
3) Формула для Fx применима как к варианту с "воротами", так и к варианту со схемой захвата. При использовании схемы захвата М является точным числом, а N "гуляет" в пределах (-1,+1). При использовании "ворот" N является точным числом, а М "гуляет" в пределах (-1,+1).
Вот всё, что нам нужно знать из теории для измерения частоты.
4) Применим наши знания на практике. Выберем период измерения Тизм примерно равным одной секунде. (Примерно потому, что Тизм должен быть ТОЧНО кратен М*Тх). Пусть Fx=170 кГц, а Fо=16МГц. Тогда М=170000, а N=16000000.
Вычислим частоту по нашей формуле Fxвыч = Fо*М/N=16000000*170000/16000000=170000 Гц. Вычислим погрешность метода. Не буду вас мучить выводом соответствующей формулы с помощью частных дифференциалов, кто захочет пусть сам потренируется, скажу только, что относительная погрешность будет суммой модулей относительных погрешностей отдельных составляющих. Ну и ещё упростим задачу, приняв Fo/Fo =0 (На самом деле, кратковременная нестабильность кварцевой опоры порядка 10^(-8) или лучше).
Итак, Fx = Fо*М/(N±1)=170000±0.010625 Гц. Что нам и требовалось показать. Относительная погрешность составит 6*10^(-8). Можно добавить 10^(-8) нестабильности опоры, если требуется уточнить погрешность. Кстати, для варианта с "воротами" Fx = Fо*(М±1)/N=170000±1 Гц, как и было сказано.
5) Перейдём теперь к реализации алгоритма на микроконтроллере. В принципе, всё и так уже ясно, просто поставим точки над и чёрточки на t(. Сколько нам нужно захватов таймера, чтобы вычислить частоту? Два - один для захвата начала секундного интервала, и второй для захвата конца того же интервала. Пусть захват работает по прерыванию. При захвате, т.е. при положительном фронте импульса входной частоты, содержимое таймера перепишется в регистр ICR. Прекрасно, в этом же прерывании запомним в регистрах или в памяти два числа – количество импульсов Мнач и Nнач, запрещаем прерывание и выходим из него (замечу в скобках, схема захвата "молотит" по-прежнему, но прерывания запрещены), оно нам понадобится только через секунду, займёмся другими делами, скажем, расчетом частоты предыдущего цикла. Через примерно секунду работы (или вынужденного безделья, можно по таймеру) ОПЯТЬ разрешаем прерывания от схемы захвата. Как только оно произойдёт, опять запоминаем два числа – количество импульсов Мкон и Nкон, запрещаем прерывание по захвату и выходим из него, вычисляем М=Мкон-Мнач, N=Nкон-Nнач.
Вот так это всё и работает. Я, конечно многого не упомянул. Все переменные для расчета должны быть соответствующей разрядности, как минимум 32, умножение надо делать до деления, чтобы не потерять точность, вычисление частоты можно вести непрерывно, достаточно просто после вычисления частоты переписать переменные Мнач=Мкон, Nнач=Nкон. Обязателен учёт переполнения таймеров.
На самом деле мой первый проект на STM32, если его можно таковым назвать, был ЛА на 20-ти ногом F030. 8 цифровых каналов, 19.2 MSPS, один аналоговый, ~4.4 MSPS, генератор(PWM) до 48MHz, частотомер до 48MHz и программатор AVR Частотомер конечно не такой точный, но там и кварц обычный, для большинства применений его достаточно. И все это без экрана, подключалось к компу через USB, общая стоимость деталей ~1.5$. Подарил товарищу, собрал более продвинутую модель на F303, подарил другому товарищу, хотя чистый F303 мне вернули, переписал часть кода под F4, убедился, что 130 MSPS действительно достижимы и отложил до лучших времен. А надо было собрать и где-то выложить, чтобы с кем-то конкурировать?
заинтересовали Ваши разработки как можно со всем этим ознакомиться?
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
если, как ты предлагаешь, производить измерения за очень малый измерительный интервал, например, за 1ms, то их будет всего 4
Числа высосаны из пальца. Ничего такого я не предлагал. У меня (например) есть задача измерять резонансную частоту некоего контура при ударном возбуждении, когда имеем всего около 15...20 периодов измеряемой частоты. Частота около 60 кГц, значит время измерения составит примерно 300 мкс, а разрешение/точность требуется 1 Гц. Опорная частота - 40МГц (25 нс), сиречь 12000 попугаев (5 Гц)- это предел без интерполятора. ЗЫ. К слову, измеритель является контрольным при изготовлении некоей продукции. То есть на основе его измерений происходит подстройка станка и отбраковка продукции в автоматическом режиме. Измерение резонансной частоты контуров ударным методом - распространенная задача. И нехватка разрешения из-за ограниченного числа периодов сигнала при невысокой добротности - тоже типично.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Теории частотомерной чуть подчитали, можно потихоньку переходить к практике. Некогда пока макет паять - посмотрел Протеус стал поддерживать STM32, правда пока серию F1. Попробуем посимулировать частотомер в Протеусе, неизвестно нормально симулирует ли таймеры, захваты и пр. - ну может хоть мигать светодиодом сможем. Намалевал схемку с индикатором: Аналоговое питание пришлось так подсоединить ибо ругалось. Далее блинкающую программку по свободе напишу, с F1 практически дела не имел - очень давно на отладочной платке запускал чужие примерчики для F1, все абсолютно забылось, будем опять учиться.
Вот, кстати, типичнейший подход не новичка, но ламера (сорри, это не к вам лично). Вместо того, чтобы взять теплый ламповый МК в DIP40 (ну, или модуль с распаянным крохой-STM и тем же самым DIP40 на выходе), воткнуть его в макетку и начать работать с реальным железом, вы сходу обрекаете себя на героическую возню с "ибо ругалось", "правда пока серию F1" и прочими багами/ограничениями симулятора, до которых вы пока не добралмсь.
дык лежит передо мной такой модуль: STM32F103C8T6 было US $1.68 / шт. сейчас недоступно - разгребли https://ru.aliexpress.com/store/product ... 85935.html просто интересно что новый протеус смогет, перенести в реал запросто можно Планировалось вообще все сделать на самом дешевом STM32F030F4P6. Заказал уже подобный модуль на STM32F030F4P6: https://ru.aliexpress.com/item/48MHz-ST ... 21744.html Паять на мотажках обленился - всяки дискавери и нуклео разбаловали + беспаечные макетки. з.ы. протеус, уже выяснил, могет порты настраивать, дрыгать ногой, систик тож симулируется: софтик мигания: Спойлер
а я уже дрожу: неужели мир увидит любительский проект, использующий всю мощь ARM?! и это будет нечто реально полезное без блэкджека и девушек с низкой социальной ответственностью?!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
увы, не порадую - специально добавлю MP3 декодирование - будет частотомер проигрывать музычку в паузах между измерениями, голосом результаты измерений сообщать. Ну и конечно по интернету можно будет получать результаты и настраивать и перегружать - будет полный IoT.
а я уже дрожу: неужели мир увидит любительский проект, использующий всю мощь ARM?! и это будет нечто реально полезное без блэкджека и девушек с низкой социальной ответственностью?!
Гавно вопрос - смотри любой любительский опенсоурсный летный контроллер для квадрокоптера
Добавлено after 8 minutes 12 seconds: Еще со "всей мощь", еще лет 8 назад, тогда мне не особо хватало топового AVR32, а кортексы только только выходили, а 7TDMI был очень уныл... Вобщем, если кто помнит, когда не было считай смартфонов, а гуглмап был только в на настольниках, было такое решение для для любителей полазить с оффлайн картами вне дорого - OziExplorer. Под WinCE работал, но уж очень эти чтуки меееедленно грузились, долго GPS ловили и очень шустро батарею кушали. Сделал я тогда на 3.5" TFT, паре батарей от айфона с ебея и, если правильно помню, AT32UC3C256 'аппаратный' Ози в корпусе тоненькой мылницы с картами на SD-card, с выносным USB GPS-mouse с хорошей антеной -)) Выключенный мог годами без зарядки валяться, старт за десятую долю секунды, хотя первичная ловля GPS была, конечно, больше минуты из холодного.
Отрисовка была нормально, но о плавном попиксельном скроле, а уж тем более о скроле с инерцией речь не шла -))
Числа высосаны из пальца. Ничего такого я не предлагал. У меня (например) есть задача измерять резонансную частоту некоего контура при ударном возбуждении, когда имеем всего около 15...20 периодов измеряемой частоты. Частота около 60 кГц, значит время измерения составит примерно 300 мкс, а разрешение/точность требуется 1 Гц. Опорная частота - 40МГц (25 нс), сиречь 12000 попугаев (5 Гц)- это предел без интерполятора. ЗЫ. К слову, измеритель является контрольным при изготовлении некоей продукции. То есть на основе его измерений происходит подстройка станка и отбраковка продукции в автоматическом режиме. Измерение резонансной частоты контуров ударным методом - распространенная задача. И нехватка разрешения из-за ограниченного числа периодов сигнала при невысокой добротности - тоже типично.
Числа и не было, был "очень малый измерительный интервал", потому я взял 1ms, в реальном проекте оказалось 300us, ошибся всего в 3 раза выбирая наугад. И ты опять приводишь пример проекта в котором приходится проводить измерения достаточно быстро, а я сразу сказал, что именно в подобных случаях более продвинутые техники и могут быть востребованы... Реальные частотомеры, может за редким исключением, не измеряют частоту за произвольные и относительно небольшие промежутки времени, они просто для этого не предназначены, а другие задачи могут диктовать и другие решения, в том числе и более простые. У меня была хорошая точность на больших частотах, меня устраивала точность +-1Hz на малых, не нужно мне рассказывать о преимуществах reciprocal counter, я о них прекрасно осведомлен
Теории частотомерной чуть подчитали, можно потихоньку переходить к практике. Некогда пока макет паять - посмотрел Протеус стал поддерживать STM32, правда пока серию F1.
У F1 больше частоты, в этом плане он даже предпочтительнее, тут уже нужно смотреть хватит ли четырех 16-ти битных таймеров для реализации reciprocal counting, но как минимум их хватит для одновременных прямого счета и измерения периода, с последующим выбором более подходящего метода в зависимости от полученной частоты.
это не совсем для IoT (для любителей хоббистов пойдет) - надо модуль чтоб от батарейки 10 лет работал и своя специфика, вот например: https://www.u-blox.com/en/product/sara-n2-series пока со совместимостью разных компаний плохо, но держать ухо востро и любитель - хоббист имхо должен
2 Reflector 20 ног F0 более любительский, пока можно попробовать обкатать прямой счет в протеусе - польза мож кому будет, студентам например
порядок цен меньше, вроде рассматривали: http://worldiot.ru/2017/04/umnaya-kvart ... 20000-rub/ по частотомеру: для прямого счета и 3 хватит, а если протеус с внешней ноги считать таймером вообще не смогет - на железку перейдем, у меня еще на F051 таке лежит:
upd: попробовал индикатор с первой попавшей завалящей библиотекой от восьмибитников, тоже заработало сам проектик:
и так Протеус ногодрыг нормально симулирует, индикатор жки ногодрыгом работает, пока все несложно, как и с восьмибитниками. Проверим симуляцию протеусом таймера. Таймеров в выбранном микроконтроллере действительно три да и еще все 16 битные. В первую очередь для прямого счета нам нужен секундный интервал - возьмем TIM3. Есть у таймеров STM32 удобный режим одного прохода (OPM) и еще таймера могут запускать/разрешать счет других таймеров. Все это нам очень даже пригодится для частотомера, но надо чуть напрячься и почитать матчасть. Пробуем мигать светодиодом (оказывается это очень важное занятие) с помощью TIM3 в режиме OPM, интервал секунда. Заодно разрешим тактирование всего нам нужного и настроим запускающую ногу для будущего но уже счетного таймера. Все мигает, значит таймера как то протеус тоже умеет. программка: Спойлер
void InitTimers() { TIM3->ARR = 1000; //1000 TIM3->PSC = 8000; //8000000/8000 = 1000 TIM3->CR2 |= TIM_CR2_MMS_0; //Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is //useful to start several timers at the same time or to control a window in which a slave timer is //enabled. The Counter Enable signal is generated by a logic OR between CEN control bit //and the trigger input when configured in gated mode. //When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO, //except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR register).
// TIM3->DIER |= TIM_DIER_UIE; // Update interrupt enabled TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_OPM; //Counter used as downcounter //Counter stops counting at the next update event (clearing the bit CEN) //Counter enabled }
Есть у таймеров STM32 удобный режим одного прохода (OPM) и еще таймера могут запускать/разрешать счет других таймеров. Все это нам очень даже пригодится для частотомера, но надо чуть напрячься и почитать матчасть. Пробуем мигать светодиодом (оказывается это очень важное занятие) с помощью TIM3 в режиме OPM, интервал секунда.
Для прямого счета теперь нужно этот TIM3 сделать мастером(TIM_CR2_MMS = Enable) разрешающим счет другому таймеру, а TIM2 будет слейвом(TIM_SMCR_SMS = GatedMode, TIM_SMCR_TS = ITR2) и еще нужно разрешить считать импульсы со входа ETR(TIM_SMCR_ECE = 1). Если ничего критичного фоном выполняться не будет, то объединять два таймера для получения 32-х битного особого смысла нет, можно обойтись и прерываниями, а на третьем собрать измеритель периода.
Сейчас этот форум просматривают: Fajustov, Google [Bot] и гости: 49
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения