Цифровые фильтры на stm32

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

Внутренности брелока (1987 год ):

Решил сделать подобное устройство на микроконтроллере, заодно попрактиковаться c цифровой обработкой сигнала. В интернете много хороших статей по цифровой обработки сигнала, я лишь в краце коснусь способа реализации в моём варианте. Программа в микроконтроллере сама рассчитывает требуемые коэффициенты фильтра, основываясь на длине фильтра, частоте дискретизации, начальной и конечной частоте пропускания фильтра. Получаемые значения коэффициентов имеют вещественное значения, и с многими цифрами после запятой. А так как в микроконтроллере нет блока для работы вещественными числами, и программная обработка таких чисел занимает гораздо больше времени, чем работа с целыми числами, то перенесём значения коэффициентов в целочисленные дроби. К примеру, вещественное число 0,12345 можно представить в виде дроби 505/4096, чей результат, не сильно отличается от исходного, но может значительно уменьшить время, затрачиваемое на арифметические операции. Можно конечно и все отнормированные значения коэффициентов фильтра умножить хоть на миллион, и потом делить на него же. Но если для ускорения работы программы придётся переходить на ассемблер, неправильные дроби предпочтительнее, так как позволят операции деления заменить сдвигами вправо. Хотя данный микроконтроллер затрачивает один такт на целочисленное умножение и от 2 до 12 тактов на деление, меньшие значения в знаменателе позволяют использовать меньше тактов для деления.

Для предварительной оценки работы цифрового фильтра написал программу на C#, которая производит расчёт коэффициентов фильтра, моделирует работу цифрового фильтра, позволяет визуально наблюдать результат обработки сигнала. На рисунках ниже представлены формы сигналов. К примеру, синим цветом, отображён входной сигнал, частота его меняется плавно от минимальной до максимальной из заданных частот. Красным отображён обработанный фильтром сигнал, зелёным отображены коэффициенты фильтра. Салатовым, форма весового окна Блекмена (если используется). Её используют для получения требуемой формы амплитудно-частотной характеристики фильтра в полосе пропускания и подавления всплесков сигнала за пределами её. В нижних текстовых окнах программы выводятся коэффициенты фильтра как вещественных, так и в целых числах. На рисунках видно, что если просуммировать все отсчёты входного сигнала, перемноженные с соответствующими отсчётами гармонического сигнала функции синуса определённой частоты (операция свёртки), то выходной сигнал будет содержать синусную составляющую от входного сигнала с такой же частотой.

Свёртка сигнала с синусоидой:

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

Свёртка сигнала с косинусоидой:

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

Получились такие картинки:

Фильтр низких частот:

Фильтр высоких частот:

Полосовой пропускающий фильтр:

Полосовой пропускающий с окном Блекмена:

Полосовой заграждающий фильтр:

Алгоритмы для для расчёта фильтров, основаны на канонических формулах, которые умные математики давно придумали и они есть в соответствующих учебниках. Расчёт их выглядит так:

Читайте также:  Что такое ремонт оборудования

Коэффициенты фильтра низких частот:

Коэффициенты фильтра высоких частот:

Коэффициенты фильтра полосового пропускающего:

Коэффициенты фильтра полосового заградительного:

где, Fc — частота среза фильтра высоких или низких частот, Fp1, Fp2 частота задержки и пропускания полосового фильтра, Fd — частота дискретизации, nm — половина длинны фильтра m, j=mn;

Источник формул:

И по просьбе, сделал устройство в автомобиль, которое выполняет по три функции: светомузыки, аварийного света, ночника (плавное псевдослучайное изменение цвета и яркости светодиодной ленты). Светодиодная лента планировалась быть наклеенной в багажнике автомобиля. Что ты меньше паять, решил использовать плату CAN модуля STARLINE (описан в другой статье), удалив с неё микросхему интерфейса и внешней памяти. Освободившиеся выводы, использованы для подключения внешнего источника звукового сигнала, кнопки, и транзисторов — ключей светодиодной ленты. В последнее время, в своих проектах, стараюсь использовать предлагаемую в STM32CubeMX возможность включить в проект USB CDC и FreeRTOS. Это упрощает написание и отладку программ, особенно если на микроконтроллер возлагается несколько задач. А используемый микроконтроллер вполне со всем справляется. Аудио-сигнал подается на вывод микроконтроллера PA5 через резистор с разделительным конденсатором, и для правильной работы АЦП стоит еще резисторный делитель, создающий постоянное напряжение смещения на входе АЦП в половину напряжения питания микроконтроллера. Выводы микроконтроллера PB6, PB7, PB8, через резисторы, подключены к затворам транзисторов, которые нагружены светодиодами ленты соответствующих цветов. Транзисторы надо использовать и низким напряжением открытия (Ugs = 2-2,5 Вольта), вариантов много, я использовал оказавшиеся под рукой F5020. В проекте, старался оставлять подробные комментарии, так что и схему приводить не стал (если кому понадобится — нарисую). Теперь к программе. При старте микроконтроллера, создаем три дополнительные задачи (потока), каждая отвечает за определенный режим работы устройства. Нажимая на кнопку, обрабатываем это событие в одной задаче, приостанавливаем или запускаем на выполнение нужную задачу режима работы. Есть еще задачи, активизирующиеся от приема символов от компьютера, что позволяет контролировать работу устройства при отладке. Перед запуском задач, после инициализации, микроконтроллер рассчитывает коэффициенты для фильтра низкой частоты, полосового фильтра средней частоты, и фильтра высокой частоты. Результат работы фильтров, используется для загрузки значений в таймер, который работая в режиме широтно-импульсной модуляции, управляет транзисторами светодиодной ленты. Подробно расписывать работу программы не буду, есть комментарии в проекте, а по работе с USB CDC и FreeRTOS полно информации на русском языке. Остановлюсь на некоторых моментах. Программу писал можно сказать в лоб и без затей. Можно еще много шлифовать и оптимизировать код, убирать лишнее и т.д. Но так как это просто светомузыка, которая полностью выполняет свои заложенные функции, оставил все как есть когда заработало ;).

Монтаж незатейлив:

Получилось так:

Перед установкой в автомобиль:

По программе, кому нет надобности смотреть весь проект, приложу некоторые примеры кода:

Расчёт коэффициентов фильтра (для канала синего цвета, фильтр ВЧ):

Перевод их в целочисленные значения:

По прерыванию (какому указано ниже), читаем АЦП, читаем данные с АЦП:

кладем значение в буфер:

Выделяем абсолютное среднее значение амплитуды сигнала за cntib периода

Обработка сигнала для трех цветов, происходит по прерыванию таймера №2, который определяет частоту дискретизации (fdiskret=10044;), выглядит это так:

Значения частот среза фильтров определили ранее:

И так можно останавливать и запускать задачи в зависимости от режима работы:

Читайте также:  Самодельные ветрогенераторы из асинхронного двигателя до 10квт

После инициализации микроконтроллера и переменных, создаем свои задачи, которые начинают работать после запуска планировщика, ну а потом ими можно управлять.

За планировщиком, код можно не писать свой, вы туда не попадете :).

Не забудьте добавить памяти для «кучи» в файле конфигурации freertosconfig.h:

и возможно, раскомментировать, дополнительные директивы freertos, которые будем использовать (eTaskGetState).

При использовании созданного проекта в CubeMX, для KEIL 4.5, компилятор выдает ошибку, нельзя использовать ассемблер в тексте программы на c. Я добавил такой файл на ассемблере —

подключил его к проекту, а в файле stm32f1xx_hal_pwr.c сделал изменения:

Вот вроде бы по минимуму все…

Если есть вопросы, задавайте, ссылка на проект: yadi.sk/d/ly7OCeWPkf4rY

ООО "ДИАЛ-ЭЛЕКТРОЛЮКС" → STMicroelectronics анонсировала новую DSP библиотеку для микроконтроллеров семейства STM32

STMicroelectronics, мировой лидер в производстве микроконтроллеров, анонсировала 28 октября 2008 года DSP библиотеку для своего семейства STM32.

Это программное обеспечение позволяет разработчикам использовать все преимущества STM32 для обработки сигналов и управляющих функций на одном и том же ядре. ST является первым поставщиком микроконтроллеров на базе ядра ARM Cortex-M3, который обеспечивает свою продукцию расширенной DSP библиотекой, и позволяет оптимизировать приложения по производительности и экономить время разработки и выхода на рынок.

Библиотека DSP STM32 абсолютно свободна от платежей как лицензионных так и от процентов с продаж устройств (так называемых royalty).

Среди многочисленных полезных функций, которые включены в библиотеку: ПИД-регулятор (PID controller), функции преобразования Фурье, и набор цифровых фильтров, например 16-битный КИХ-фильтр и БИХ-фильтр в прямой и канонической форме. Все функции готовы к использованию, легко интегрируются в проект и подробно документированы.

Функции библиотек используют в полной мере возможности ядра ARM Cortex-M3 по цифровой обработке сигнала, что позволяет достигнуть максимальной производительности. Например такие операции как умножение с накоплением и аппаратное деление выполняется в пределах двух циклов. Например, демо-программа запущенная на STM32F103 Performance Line выполняет 16-битное Быстрое Преобразование Фурье по 256 точкам с корнем-4 в течении всего 362мкс.

По сравнению с гибридными архитектурами, такими как DSC (цифровые сигнальные контроллеры) с разделенными ядрами для управления и цифровой обработки сигналов, программное обеспечение для STM32 улучшает производительность и позволяет использовать стандартные инструменты.

Новая DSP библиотека может использоваться совместно со средствами разработки от IAR, Keil и Raisonance для STM32. Это позволит разработчикам сократить стоимость системы и ускорить разработку в таких приложениях как цифровое управление питанием, включая солнечные батареи, импульсные источники питания с обратной связью, цифровая обработка звука, речи и изображений.

Помимо DSP библиотеки для STM32, разработчики получают от этого семейства выдающиеся параметры по энергопотреблению. Не стоит забывать про богатый набор периферии, который включают сдвоенный 12-битный ЦАП, и 12-битный АЦП со скоростью до 1 миллионов выборок в секунду и 16-битные ШИМ таймеры. На данный момент доступны три линейки STM32. Это Access Line с таковой частотой 36МГц и Performance Line 72МГц с объемом Flash памяти от 16Кбайт до 512Кбайт, а также Access Line с тактовой частотой 48МГц с Flash памятью до 128Кбайт представленные в Августе 2008 года. В итоге семейство STM32 насчитывает 60 моделей, все совместимы аппаратно, программно и поддерживаются одними и теми же средствами разработки.

Делаю тут проект и возникла вот какая проблема. Получаю данные с АЦП (дельта-сигма) микросхемы в которую встроен контроллер и фильтр, но этот фильтр имеет довольно убогую АЧХ, в итоге идёт завал по ВЧ от 60Гц и далее. Выглядит это примерно так:

Читайте также:  Раскраска камней акриловыми красками

Т.е. такая неравномерность АЧХ нас явно не устраивает (не проходит по техническим требованиям), правда есть возможность повысить частоту дискретизации с 250Гц до 500Гц, чтобы выровнять АЧХ, однако тогда увеличивается объём данных который ещё нужно будет усреднять, что скажется на производительности (проект на STM32F103VE) системы в целом и на общем потреблении энергии (батарейное питание). Но есть и другой путь.

Можно выровнять АЧХ с помощью параметрического цифрового фильтра, в данном случае ВЧ. То есть это тоже самое что эквалайзер, мы поднимаем одни частоты, а другие не трогаем (или заваливаем). Такой метод конечно хорош, но т.к. мы пытаемся восстановить информацию, часть которой была уничтожена другим фильтром на входе (тот что в микросхеме), неизбежно увеличится уровень помех на высоких частотах, т.к. вместе с сигналом мы усилим также и их, но вот насколько?

Итак, идея решения проблемы есть, осталась реализация. Что мы помним о цифровых фильтрах (к тем кто не имел с ними практики) из университетского курса? Разве что такие слова как свёртка, Z-преобразование, импульсная характеристика и т.д. В общем не понятно с какого конца подходить даже, вроде надо какие-то коэффициенты рассчитывать, но что и зачем непонятно, поднимать курс и сидеть с книгами по ЦОС (есть одна на 800 страниц) нет времени, проект стоит и надо что-то делать, и быстро.

Поэтому немного погуглив находим вот такой ресурс в интернете. Это сайт по расчёту цифровых фильтров (и не только!) он-лайн, а сделал его некий Dr Anthony J. Fisher.

Итак задаёмся требованиями которые нам нужны и вводим на сайте. Во-первых, нам нужна плавная характеристика, поэтому однозначно Баттерворт первого порядка ВЧ (highpass). Во-вторых, sample rate, т.е. количество преобразований АЦП в секунду, или частота дискретизации, у нас это 250Гц. Вводим. И наконец, в-третьих, частота среза (-3дБ) — 50Гц, т.к. фильтр на входе режет примерно здесь. Нажимаем отправить и получаем вот такую характеристику нашего будущего фильтра:

Красным представлен график амплитуды от частоты Найквиста, синим изменение фазы. 0,5 соответствует половине частоты дискретизации.

Также получаем С код с рассчитанными коэффициентами:

Но это только фильтр, помним, что нам нужно усилить частоты от 50Гц и выше, чтобы выпрямить АЧХ, и эта функция в таком виде нам не поможет, поэтому путём нехитрых манипуляций приводим функцию к такому виду:

Всё. Чтобы использовать фильтр кидаем данные в параметры функции, а возвращает она отфильтрованные данные. Коэффициент усиления OUR_GAIN подбираем опытным путём, снимая показания с АЦП и замеряя АЧХ.

Таким образом мне удалось поднять АЧХ практически без дополнительной нагрузки на контроллер и мой проект прошёл по техническим требованиям (в медицинской области они весьма не хилые). Я боялся, что сильно возрастёт уровень помех, но он увеличился с 4-5мкВ примерно до 6-8мкВ, что нас устраивает. В заключении могу порекомендовать ещё одну бесплатную программу по расчёту цифровых фильтров — WinFilter, скачать её можно здесь. Насколько она работоспособна не знаю, не проверял, но она может выдавать код в VHDL (и в С естественно), что наверняка пригодится для ПЛИС. Также есть программа от Texas Instuments, по расчёту коэффициентов цифровых фильтров, называется она TIBQ. Всё. Удачи в проектировании цифровых фильтров.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock detector