Comments 35
Это называется "когда мысли сходятся". Мне по работе для пары тестов понадобилось, "слепил на коленке" из ардуинки:
Там правда не только частотомер, но и пара простеньких триггеров.
Собрал когда-то на синей таблетке (и ILI9341) осциллограф. Хорошая штука, жаль у автора кроме схемы соединения и прошивки ничего нет. Даже назначения 5 кнопок не описаны. =(
Вот только это на оф.сайте:
Максимальная частота оцифровки 4.27 мГц (Интерлив, ДМА, 120 мГц тактовая частота)
Синхронизация: фронт, спад, max, min
Входное напряжение 0 ~ 3В
Дисплей SPI TFT 2.2" (2.4")) 320x240
Цифровой люминофор ( 0.1сек/дел ~ 10сек/дел)
FFT спектр сигнала
Заморозка экрана (Freezing)
Генератор прямоугольных импульсов 0.1Гц ~ 20мГц
Пять кнопок управления
В инетах есть такая инфа по управлению:
Две кнопки управления скоростью развертки, третья-выбор фронта синхронизации, четвертая-включение режима спектроанализатор. С нажатой пятой первыми двумя установка выходной частоты генератора.
Оставшиеся две кнопки совместно со "Shiftom" замораживает осциллограмму (появляется символ снежинки) последняя кнопка управляет яркостью - выкл./средняя/высокая.
Так и валяется который год в коробке без дела (собирал чисто поиграться, ну и на вход больше 3В подавать нельзя, я полагаю).
Касаткин А.С. Обработка сигналов частотных датчиков. М.: Энергия, 1966.
Не смотря на то, что книжка старая, там больше десятка способов измерения частоты, которые элементарно реализуются на современных микроконтроллерах, и дают отличную точность.
Вроде в STM есть в таймерах аппаратный захват ШИМ. И частота и скважность.
Частоту тактирования настроил на 64 МГц.
на скриншоте на вход PLL подан клок от внутреннего RC-генератора. он не очень-то точен и температурно стабилен. переключи на HSE (:
а еще у того камня есть аппаратный usb, можно было навернуть usb-cdc и гонять по нему, а не по usb-uart. только не помню вот, пофиксили ли ст тот баг с забытой поддержкой переключения скорости потока в их библиотеке. без этого в линуксе не заработает.
Вы описали довольно типовую и распространённую на просторах интернета задачу. Конечно, неплохая статья, при условии, что вы только начали разбираться с микроконтроллером STM32. В остальном есть более интересные источники для изучения таймер и частотомеров новичками. Однако автор указал сложать статьи "простая", что отметает всякую строгую критику. Единственное что встаёт вопрос "зачем".
Более интересным было бы увидеть измерение частоты не прямоугольного сигнала (что уже ну очень банально), а также синусоидального, треугольного и конечно шумовую состовляющую переменного сигнала. Каждый этот тип сигнала можно сгенерировать как с внешнего генератора, но более интересно выдать их с ЦАПа более навороченной stm. Если вы уже занялись серией F1, возьмите тогда к примеру stm32f103ZE, имеющий два канала ЦАП на борту и уже попробуйте сделать свою задачу более интересной. Такое устройство смогло бы стать хорошим конспектом (шпаргалкой) для множества типовых задач и опорой для более сложных.
В целом из достоинств: статья не является плагиатом на Хабр, может оказать пользу новичкам благодаря оформлению на русском.
Из недостатков: тема статьи является довольно заезженой и уже имеется достаточно сведений на изветсных платформах по STM32, типа istarik, easyelectronics и controller's Tech. К тому же видно, что автор лишь переработал информацию из других статей. Для более "крепкого" содержания хотелось бы видеть ссылки на RM и Datasheet, тогда было бы видно, что автор полностью разобрался в вопросе.
Ну вот вы сами и ответили на мой вопрос;) Это и хорошо было бы поместить в одну статью, начинающим очень удобно было бы добавить такую статью в закладки
Если сигнал чистый, то мало интересно. А на практике чаще требуется преобразование Фурье. И это было бы уже интересней для новичков.
ныне это тайное, почти потерянное знание. Ну чтобы хотя бы примерно знать что происходит и применить готовую библиотеку. для ARm CMSIS существует готовая библиотека от ARM, для arduinщиков есть библиотека от adafruit. Ну и ресурсы контроллера уже совсем другие должны быть, выборку надо делать.
Я не имел ввиду полное преобразование. Для подавляющего большинства применений достаточно рекурсивного алгоритма Кули-Тьюки по основанию 2. А его даже Z80 (ZX Spectrum) у меня осиливал.
Васян, он нас пходу послал ;) Может то может только с какой скоростью
А это уже напрямую зависит от частот и от точности. Z80 в реальном времени осиливал до трёх рекурсией при семплировании на килогерце. Без аппаратного умножения! Так что STM32 на звуковых частотах до 96КГц семплировании легко успеет разложить до десятка частот.
1 канал. 80ый не однобитный звук ли анализировался?
Ну а сейчас вопрос в нескольких каналах. Правда я думаю это актуально скажем обороты движков считать - да там пожалуй фурье перебор, хватит таймера
в зависимости от задачи можно конечно очень сузить диапазон частот - тоже как бы спецрешение. ну и вообще в пределах звуковых частот можно наверное какойнить 1701 от analog d. который чего только не может
8-битный. Но на самом деле это не важно. Сложность быстрого преобразования Фурье по степени 2
Причем мнимая константа вычисляется заранее, так что, по сути, речь идёт только об указанном количестве умножений комплексных чисел.
можно конечно очень сузить диапазон частот
Ну это очень условно. Все же четырехкратное увеличение выборки приводит лишь к двукратному увеличению вычислений. Если речь о звуковом диапазоне, то при дискретизации на 96 КГц и диапазоне от 16 Гц до 24 КГц, требуется всего 13 итераций.
Погуглил и нашел пример https://www.chipdip.ru/product/tm10pa
На слабеньком STM32F030F4P6 (48 МГц) сделан пятиполосный анализатор спектра через БПФ с частотой дискретизации 40 КГц.
Весьма любопытно, но некислое количество математики на основе тех готовых библиотек от ARM. Для контроллера вентиляторов явно перебор.
Откуда "некислое количество математики"? Там совершенно школьная арифметика комплексных чисел. Я же не авторегрессию предлагаю считать )
Берете готовый код из https://github.com/marlonValerio/microFFT и все. Для старших STM32 (F4 или F7 с DSP) есть готовая HAL библиотека https://stm32f4-discovery.net/2015/07/hal-library-14-fast-fourier-transform-for-stm32fxxx/
Ну и в качестве вишенки на торт https://www.st.com/resource/en/application_note/an4841-digital-signal-processing-for-stm32-microcontrollers-using-cmsis-stmicroelectronics.pdf
Для контроллера вентиляторов явно перебор.
Для контроллера вентилятора, по уму, требуется ПИД регулирование. Что ничуть не проще БПФ, если коэффициенты подбираются автоматически, а не задаются константами вручную.
а зачем и вообще регулировать - на минимальные обороты поставить и пусть не воет. ЗЫ я ка кто думал исключительно о компьтерных, нда..
Ну вот пущай вычислительно он ПИД и считает, а для числа оборотов есть таймеры...
Даже компьютерный регулируется в зависимости от температуры. Инертность там может быть очень приличная.
ага я как послушаю эти зывания то громче то тише - сразу лезу в bios.
мы отклонились от темы. я в любом случае поглядываю на фурье для своих задач, оно там вполне просматривается, но пока стараюсь обойтись таймером и контроллером попроще
ага я как послушаю эти зывания то громче то тише - сразу лезу в bios.
Это как раз когда контроллер без ПИД регулирования. Послушайте, как эти вентиляторы плавно адаптируют обороты на нормальных серверах. Или на малинке ) https://www.instructables.com/PID-Control-for-CPU-Temperature-of-Raspberry-Pi/
мы отклонились от темы
Ссылку на microFFT я Вам дал. Для начала уже кое-что. Ну а на старших STM32 БПФ предоставляет производитель в библиотеке HAL.
Думаю, плашка "Tutorial" тут ещё неуместна.
Максимальная частота оцифровки 4.27 мГц (Интерлив, ДМА, 120 мГц тактовая частота)
Автор путает миллигерцы и мегагерцы.
Делал в своё время частотомер на AT90S2313. Контроллер, дешифратор (ИД7, если не изменяет склероз), светодиодный индикатор на 8 разрядов. Программу писал на ASM'е в AVRStudio. Измерял частоту, период, длину положительного и отрицательного импульсов до 1 MHz (режим измерения переключался последовательно нажатием одной кнопки). Вроде даже плата до сих пор в кладовке где-то лежит.
все это неплохо, но подскажите мне stm32 у которых хотя бы 4 близких по тиипу таймера куда можно завести внешний вход. а то таймеров полно, все разные а что и куда повести - непонятно.
вот в atmel таймеров одинаковых много: до 4-5 каналов на несколько мегагерц сделать можно
а еще в ESP32 есть ажно восемь (8) модулей pulse counter
Измерение частоты на STM32