Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Защита и контроль >

Теги статьи: Добавить тег

Цифровой измеритель частоты пульса на MAX30102

Автор: Сергей Безруков (aka Ser60)
Опубликовано 08.03.2022
Создано при помощи КотоРед.

Сегодня измерителем частоты пульса никого не удивишь - подобные измерители встроены во многие гаджеты, например, в smart watch. Такие часы были и у меня пока я их случайно не разбил. Поскольку пульс я контролирую часто, срочно потребовалась замена. Проще было бы сразу приобрести новые часы или просто отдельный пульсометр, но у меня завалялся давно приобретённый датчик пульса МАХ30102, уже распаянный на маленькой плате, и я решил пустить его в дело.

Порывшись в сети, я обнаружил массу проектов для этого датчика на Arduino с готовыми библиотеками. Плат Arduino у меня нет, но с имеющимися в открытом доступе исходными кодами этих библиотек на языках С/С++, я подумал, что портировать их на другой МК не составит особого труда, даже не вникая в суть дела. В то время я экспериментировал с новыми МК серии EFM32PG22 и решил использовать такой в тестовой схеме. Помимо датчика и МК с минимальной обвязкой в схеме присутствуют USB-UART конвертер на CP2102 для вывода данных на терминал компьютера и OLED дисплей с разрешением 128×32 для оперативного вывода частоты пульса и анимации сердцебиения.

Портирование библиотек действительно не заняло много времени, однако оказалось, что система работает крайне нестабильно. Согласно заимствованной программе, показания частоты пульса должны обновляться с каждым ударом сердца. На самом деле наблюдались частые пропуски детектирования ударов сердца и показания на дисплее иногда сильно отличались от удара к удару. Кроме того, оказалось, что стабильность системы сильно зависит от степени прижима пальца к датчику – недаром в промышленных устройствах прижим пальца стабилизирован прищепкой. Приноровившись, я научился худо-бедно пользоваться своей системой, но оказалось, что на некоторые мои пальцы и на пальцы некоторых других людей она просто не реагировала, как будто пульса в них нет вообще. Заподозрив неладное, я решил подробнее копнуть заимствованную из сети программу. Тут я повторюсь, что было бы быстрее и проще купить готовый пульсометр, но не доведённое до конца дело меня заело.

Поначалу я не знал на что грешить – ПО, сенсор, прижим пальца, или что-то иное. Посмотрев программы других подобных проектов, я обнаружил, что они сделаны как будто под копирку. Все они основаны на библиотеке сенсора от AdaFruit и библиотеке обработки данных сенсора от SparkFun. Опустив тот факт, что библиотеки эти оптимизированы под МК семейства AVR на платах Arduino, ресурсы которых весьма ограничены, сами библиотеки используются авторами проектов совершенно бездумно. Например, зачем-то для измерения частоты пульса используются оба светодиода сенсора – красный и инфракрасный, хотя в ДШ явно указано, что достаточно лишь красного, и для этого имеется специальный режим сенсора. Далее, для чтения новых данных сенсора производится постоянных его опрос, в то время как на плате сенсора имеется вывод запроса прерывания после каждого нового измерения, который никогда не использовался. Помимо того, для вычитания постоянной составляющей сигнала используется приближённый алгоритм вычисления этой составляющей для минимизации задействованных ресурсов МК и в ущерб качеству. Список моих претензий к стандартным библиотекам можно существенно продолжить.

Для исправления ситуации пришлось вникнуть в работу сенсора и вообще в оксиметрию, и переписать код программы и библиотек практически заново, используя отсутствие скованности в ресурсах на МК типа ARM и введя 32-битную обработку. В результате надёжность работы устройства существенно повысилась, и оно стало устойчиво измерять пульс на пальцах всех пользователей, на ком я его тестировал. Также существенно ослаблена зависимость работы от степени прижима пальца к сенсору, см. видео ниже. Сенсор сконфигурирован на работу в режиме 2 с задействованием только красного светодиода при частоте семплирования 400 Гц и усреднением 8 последовательных выборок. Таким образом, в результате децимации сенсор выдаёт 50 измерений в секунду. Каждое новое измерение приводит к генерации запроса на прерывание на выводе INT сенсора. Между измерениями МК погружается в сон. В прилагаемой программе используются все 3 байта данных сенсора, а не только старшие 2 как ранее.

Цикл обработки данных сенсора переписан с использованием конечного автомата с 3 состояниями. В состоянии 0 производится ожидание прикосновения пальцем к сенсору. При этом значение сигнала фото-приёмника сенсора увеличивается от пары сотен до нескольких десятков тысяч условных единиц, и программа переходит в состояние 1. В этом состоянии на дисплее появляется маленькая иконка сердца и производится ожидание детектирования удара сердца с помощью цифровых фильтров в функции checkForBeat(). Как только удар будет детектирован, программа переходит в состояние 2, и маленькая иконка сердца заменяется на отрезок времени в 100мс на большую. Этим достигается анимация детектирования удара сердца. В состоянии 2 продолжается приём новых данных от сенсора и их цифровая обработка. В стандартных программах из сети эта обработка не производится во время ожидания истечения 100мс анимации, что отрицательно влияет на надёжность системы. После истечения 100мс система возвращается в состояние 1 если палец всё ещё находится над сенсором. В противном случае из состояний 1 и 2 происходит возврат в состояние 0. Для вычисления частоты пульса производится измерение временного интервала между двумя последовательными сердцебиениями с усреднением четырёх последовательных измерений на основе скользящего среднего. В качестве эталона времени используется sleeptimer, тактируемый от внутреннего генератора на 32 КГц и работоспособный в режиме сна МК. Помимо библиотек сенсора пришлось написать свой драйвер дисплея для SSD1306, чтобы вывод на дисплей укладывался в период между двумя измерениями сенсора (20мс). В результате отсутствует потеря данных сенсора для цифровой обработки его сигнала, что также повышает надёжность работы системы. При использовании (медленной) библиотеки Arduino для SSD1306 коммуникация с дисплеем иногда превышала 20мс даже при максимальной частоте тактирования I2C (400 КГц). В результате некоторые данные сенсора терялись и, соответственно, не обрабатывались.

Помимо указанных выше нововведений, изменениям подверглась сама цифровая обработка сигнала сенсора. Так, для вычисления DC составляющей сигнала использован честный фильтр длины 32 на основе скользящего среднего, а для сглаживания показаний AC составляющей сигнала сенсора использован FIR фильтр нижних частот длины 24 с частотой среза 5Гц. Разработка последнего фильтра произведена с помощью системы FIR Filter Designer (автор Philip Salmony). В фильтре использована оконная функция Хэмминга. Характеристики фильтра с оконной функцией и без неё представлены ниже (сплошные и пунктирные линии, соответственно).

После прикосновения пальцем к сенсору следует подождать 3-5 секунд для насыщения буферов цифровых фильтров данными и входа фильтров (и пальца) в рабочий режим измерений. Для графического контроля работы системы данные AC составляющей сигнала и выхода FIR фильтра визуализировались системой Serial Oscilloscope. Данные для этой системы выводятся в (виртуальный) последовательный порт компьютера в функции checkForBeat(). Графики указанных сигналов представлены ниже красным и зелёным цветом, соответственно. Для детектирования сердцебиения ожидается момент перехода зелёной кривой через 0 при возрастании сигнала. Несколько более подробно об этих экспериментах рассказано в представленном ниже видео.

Программное обеспечение разработано и отлажено в системе Silicon Labs Simplicity Studio v5. Файл проекта HeartRate.sls, включающий все исходные тексты программ и настройки периферии, прилагается. Помимо системы Simplicity Studio открыть его можно обычным ZIP архиватором. Несмотря на то, что дальнейшее развитие проекта мной не предполагается (с тех пор уже приобретён новый smart watch с пульсометром) надеюсь мой опыт может быть кому-то полезен.

 

 

 


Файлы:
Архив ZIP


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

21 3 1