8-разрядный микроконтроллер AVR может выполнять больше чем 100 различных инструкций, и многие из них выполняются за 1 такт. Современные реализации ядер AVR (megaAVR, tinyAVR серий 0 и 1) снабжены аппаратным умножителем, выполняющим операции за 2 такта. Однако нет четкого понимания, как такая вычислительная мощность может быть использована в приложениях реального мира, особенно когда на производительность кода накладываются особенности написания кода и компилятора высокоуровневого языка. В этой статье (перевод документа [1]) рассматриваются некоторые приложения цифровой обработки сигнала (DSP) на основе AVR, и какие для этого процессорные ресурсы требуются. В рассматриваемых приложениях используется встроенный в микроконтроллер AVR (MCU) аналого-цифровой преобразователь (ADC) для оцифровки приходящего аналогового сигнала, и ядро AVR выполняет обработку оцифрованного сигнала. Это означает, что приложение должно обеспечивать обработку данных в реальном времени, чтобы все оцифрованные данные были четко обработаны с фиксированными интервалами времени. Код приложения написан на языке C, за исключением некоторых функций на ассемблере, выполняющих умножение 16-битных чисел. Эти функции вызываются из программы на языке C.
tinyAVR 0-series. На рисунке ниже показана линейка tinyAVR серии 0, с указанием вариантов по количеству выводов и объему памяти.
• Миграция кода в по вертикальной оси возможна без значительной модификации кода, поскольку устройства полностью совместимы по выводам и функциональным возможностям. • Горизонтальная миграция влево связана с уменьшением количества выводов, и как следствие возможно уменьшение доступных функций.
Рис. 1. Обзор семейства tinyAVR 0-series.
Устройства с разным объемом памяти Flash также имеют разный объем SRAM и EEPROM.
tinyAVR 1-series. На рис. ниже показана линейка устройств tinyAVR 1-series, с указанием вариантов по количеству выводов и объему памяти.
• Вертикальная миграция вверх возможна без модификации кода, поскольку эти устройства совместимы по выводам и обеспечивают тот же или расширенный набор возможностей. Обратная миграция потребует модификации кода, поскольку будет меньше доступных периферийных устройств. • Горизонтальная миграция влево связана с уменьшением количества выводов, и как следствие возможно уменьшение доступных функций.
Рис. 2. Обзор семейства tinyAVR 1-series.
Устройства с разным объемом памяти Flash также имеют разный объем SRAM и EEPROM.
megaAVR 0-series. На следующем рисунке показана линейка устройств megaAVR 0-series, с указанием вариантов по количеству выводов и объему памяти.
• Миграция кода в по вертикальной оси возможна без значительной модификации кода, поскольку устройства полностью совместимы по выводам и функциональным возможностям. • Горизонтальная миграция влево связана с уменьшением количества выводов, и как следствие возможно уменьшение доступных функций.
Рис. 3. Обзор семейства megaAVR 0-series.
Устройства с разным объемом памяти Flash также имеют разный объем SRAM и EEPROM.
[Демодулятор сигнала FSK]
Первое приложение, что мы рассмотрим - демодулятор звукового сигнала модуляции по сдвигу частоты (audio frequency shift keying, AFSK) для протокола Specific Area Message Encoding (SAME), работающий на AVR-микроконтроллере ATmega328P. Подробное объяснение дизайна протокола и демодулятора, а также соответствующий исходный код на языке C, что можно использовать как исходную точку для собственной разработки, см. по ссылке [2].
В протоколе SAME AFSK биты передаются тональными посылками по 1.92 миллисекунд, поэтому скорость передачи получается 520.83 бит/сек. Логический 0 представлен тремя циклами тона звука 1562.5 Гц, и логическая 1 представлена 4 циклами тона звука 2083.3 Гц. В начале передачи отправляется 16-байтная преамбула, чтобы приемнику было легче определить границы бит перед началом их передачи.
Хотя демодулятор изначально был реализован на ATmega328P, работающем с тактовой частотой 16 МГц, то же самое может быть реализовано на другом микроконтроллере AVR. Таймер/счетчик и ADC микроконтроллера настраивается для оцифровки приходящего звукового сигнала с частотой, в 4 раза превышающей частоту сигнала для передачи 0, и 3 раза превышающей частоту передачи 1, или 6250 Гц. Это значит, что для обработки каждой выборки сигнала ADC доступно (16 МГц/6250 Гц) = 2560 тактов CPU. На следующем рисунке показана блок-схема демодулятора.
Рис. 4. Демодулятор FSK на основе ATmega328.
Каждый раз, когда от ADC приходит новая выборка, она добавляется в кольцевой буфер, состоящий из самых свежих 12 выборок ADC. Два цифровых полосовых фильтра Гёрцеля, один настроен на частоту тона лог. 0, другой на частоту тона лог. 1, оба работают на последних 12 выборках сигнала ADC, за которыми вычисляется выходная амплитуда сигнала для каждого фильтра. Выходные амплитуды двух фильтров сравниваются, чтобы определить какой из уровней был принят - бит нуля или бит единицы. Выполняется некоторая дополнительная обработка для обнаружения переходов между битами и преамбулы, чтобы по ним обеспечить синхронизацию приема данных. После достижения синхронизации демодулированные символы ASCII выводятся в USART.
Производительность ядра AVR тестировалась на коде C, скомпилированном в Atmel Studio 7.0.1645, который работал на отладочной плате ATmega328P Xplained Mini. Были сделаны некоторые незначительные модификации кода, чтобы можно было оценить утилизацию вычислительных ресурсов микроконтроллера, и сделать алгоритм более устойчивым к ошибке частоты передатчика (модифицированный код, а также весь код, рассматриваемый в последующих секциях, можно найти в архиве FSK_demod_code_for_AVR_core.zip на веб-сайте Microchip. От переводчика). В самом плохом случае было найдено, что для получения и обработки выборки ADC требуется 749 тактов CPU. Это количество включает как всю фильтрацию и синхронизацию, так и передачу демодулированых символов через USART. Из расчета 2560 тактов CPU на выборку ADC загрузка ядра процессора составит (749/2560)*100% = 29.3%.
Этот результат можно интерпретировать по-разному. Около 70% процессорной мощности ядра AVR все еще остается доступным, если в проект приложения надо будет добавить дополнительный функционал. Поэтому можно понизить тактовую частоту CPU от 16 МГц до 4.8 МГц, чтобы уменьшить потребление энергии без потери функциональности демодулятора AFSK. Еще одна интерпретация - если частота тактирования CPU останется 16 МГц, скорость бит AFSK, частоту звука и частоту дискретизации ADC можно увеличить в несколько раз, до 3.4 раза, чтобы достичь скорости передачи данных 1.77 килобит/сек.
[Демодулятор AFSK с двукратной частотой дискретизации и цифровой фильтрацией]
Демодулятор AFSK, который мы обсудили в предыдущем разделе, не имел никакой цифровой фильтрации, чтобы предотвратить наложение частот выше половины частоты дискретизации (0.5 * 6250 Гц = 3125 Гц). Для примера представим, что на вход поступает тон звуковой помехи с частотой 4687.5 Гц. Поскольку частота дискретизации составляет 6250 Гц, после дискретизации аналогового тонального сигнала с частотой 4687,5 Гц он будет появляться в цифровой области на совмещенной частоте (6250-4687.5) Гц = 1562.5 Гц. Поскольку это та же частота, что и нулевой сигнал логического уровня FSK, он будет мешать демодулятору FSK и препятствовать его правильному функционированию. Для предотвращения этой помехи единственным вариантом с предыдущим кодом демодулятора было бы добавление аппаратного аналогового фильтра перед входом АЦП для ослабления частот сигнала выше 3125 Гц.
Альтернативный способ для решения этой проблемы - оцифровывать сигнал на повышенной частоте дискретизации, выполнить некую цифровую фильтрацию для понижения составляющих спектра выше 3125 Гц, и затем передискретизировать вниз частоту оцифровки сигнала. Сигнал с пониженной частотой дискретизации после этого может быть демодулирован. Код демодулятора AFSK, описанный в предыдущем разделе, был взят за основу и затем доработан для реализации этого подхода. Блок-схема модифицированного демодулятора показана на рисунке ниже.
Рис. 5. Демодулятор FSK с цифровой фильтрацией.
Модифицированный код использует ADC для оцифровки приходящего аналогового сигнала на частоте дискретизации 12500 Гц, что в 2 раза выше предыдущего варианта частоты дискретизации 6250 Гц. Выборки 12500 Гц проходят через 15-звенный FIR-фильтр, который разработан так, что ослабляет больше чем на 44 dB составляющие спектра выше частоты среза 3125 Гц. Звенья FIR-фильтра реализованы с 10-разрядной точностью, и значения ADC также 10-битные, так что в реализации FIR-фильтра используются операции умножения 16-бит на 16-бит. Выходные данные FIR-фильтра передискретизируются вниз в 2 раза, чтобы получить оригинальную частоту дискретизации 6250 Гц, после чего этот цифровой сигнал подается в код оригинального демодулятора FSK, который был разработан для частоты дискретизации 6250 Гц.
Рассмотрим, что произойдет, когда присутствует сигнал синусоидальной помехи 4687.5 Гц. Из-за того, что сигнал оцифровывается с частотой дискретизации 12500 Гц, наложения спектра для этого сигнала не произойдет – он нормально будет присутствовать как 4687.5 Гц в оцифрованной версии сигнала. Благодаря ослаблению 44 dB FIR-фильтра для частот выше 3125 Гц, сигнал помехи 4687.5 Гц на выходе FIR-фильтра будет уменьшен до уровня менее 1% от своей оригинальной амплитуды. После того, как частота дискретизации будет снова понижена до 6250 Гц, наложение спектра для этой помехи вернется на частоту 1562.5 Гц, но будет при этом значительно понижена по амплитуде, и не окажет негативное влияние на работу демодулятора FSK.
Удвоение частоты дискретизации до 12500 Гц при частоте тактов AVR-ядра 16 МГц приведет к тому, что теперь на каждую выборку будет доступно (16 МГц/12500 Гц) = 1280 тактов CPU. Было обнаружено, что утилизация CPU этого кода составила не более 792 тактов на выборку ADC, поэтому расход процессорного времени ядра AVR составил (792/1280)*100% = 62%.
Как и ранее, этот результат также можно интерпретировать по-разному. У нас осталось 38% свободного процессорного времени, которое можно было бы потратить на добавление/улучшение функционала нашего приложения. Например, тактовую частоту CPU можно было бы снизить с 16 МГц до 10 МГц без ухудшения работы демодулятора. Другая интерпретация - если оставить частоту тактов AVR-ядра 16 МГц, то можно в 1.6 раза повысить параметры скорости бит AFSK, частоты звука или частоты дискретизации ADC, чтобы достичь скорости передачи данных до 833 бит/сек.
[Демодулятор FSK на 8-кратной частоте дискретизации, с цифровой фильтрацией]
Код приложения был дополнительно изменен для демодуляции более сложного сигнала FSK. Длительность бит оставлена 1.92 миллисекунды, однако частота звука была повышена до 16666.7 Гц для логической единицы и 17187.5 Гц для логического нуля. Это соответствует точно 32 или 33 периодам синусоиды для интервала бита 1.92 мс.
Для этого варианта приложения таймер/счетчик и ADC микроконтроллера настроены для оцифровки на частоте дискретизации 50 кГц. Блок-схема демодулятора показана на следующем рисунке.
Рис. 6. Демодулятор FSK, работающий на повышенной частоте дискретизации.
Обработчик прерывания (ISR) сохраняет поступающие выборки ADC в кольцевой буфер, который обрабатывается в главном цикле приложения. В главном цикле обработки выборки 50 кГц поступают на вход 9-звенного FIR-фильтра, который на 40 dB понижает составляющие сигнала ниже 10 кГц, так что звуки человеческого голоса и низкочастотные шумы удаляются из сигнала. FIR-фильтр реализован с 10-битной точностью, и значения ADC имеют разрядность 10 бит, так что в реализации FIR-фильтра используются операции умножения 16 бит на 16 бит.
Выход FIR-фильтра передискретизируется вниз в 8 раз, чтобы получить цифровой сигнал с частотой дискретизации 6250 Гц. Частоты в передискретизированном вниз сигнале, близкие к ультразвуку 16666.7 Гц и 17187.5 Гц отображаются на частоты (3*6250 – 16666.7) Гц и (3*6250 – 17187.5) Гц, т. е. на 2083.3 Гц и 1562.5 Гц соответственно. Это значит, что для них можно использовать все тот же код оригинального демодулятора FSK.
С учетом того, что ядро работает на частоте 16 МГц, у нес есть 320 циклов CPU на каждый интервал между выборками 50 кГц, и 2560 тактов CPU на передискретизированный до 6250 Гц интервал сигнала. Расход процессорного времени был определен следующим образом:
• Подпрограмма ISR: 65 тактов на выборку 50 кГц = (65/320)*100% = 20.3% утилизации CPU. • 9-звенный FIR-фильтр и накладные расходы: 468 тактов на 6250 Гц = (468/2560)*100% = 18.3% утилизации CPU. • Демодулятор FSK (включая вывод в USART): 718 тактов на 6250 Гц = (718/2560)*100% = 28.0% утилизации CPU.
Получается, что общий расход процессорного времени CPU составил 20.3% + 18.3% + 28.0% = 66.6%, так что еще треть тактов CPU остается доступной для другой обработки. Можно понизит тактовую частоту с 16 МГц до 10.7 МГц без потери функционала демодулятора. Если же оставить частоту тактов 16 МГц, то частоты бит FSK можно пропорционально повысить в 1.5 раза.
[Общие выводы]
Утилизация процессорного времени ядра AVR сведена в следующую таблицу. Был также добавлен столбец для частоты тактов CPU 20 МГц, поскольку многие микроконтроллеры AVR могут работать на такой тактовой частоте.
Тип демодулятора
|
Частота дискретизации
|
Колич. звеньев КИХ-фильтра
|
Коэф. передискр. вниз
|
Загрузка ядра (16 МГц)
|
16 МГц |
20 МГц |
AFSK |
6250 Гц |
- |
1 |
29.3% |
23.4% |
AFSK с дополнительной фильтрацией |
12500 Гц |
15 |
2 |
61.9% |
49.5% |
FSK в диапазоне, близком к ультразвуку |
50000 Гц |
9 |
8 |
66.6% |
53.3% |
Эти результаты подтверждают, что 8-битное ядро AVR может предоставить достаточный уровень производительности даже для некоторой цифровой обработки сигнала и написания кода на языке высокого уровня. В следующий раз, когда будете принимать решение, какой микроконтроллер выбрать для реализации проекта, рассмотрите вариант прототипа на основе 8-битного AVR. Его производительность вместе с низким энергопотреблением и ценой позволят в многих случаях разработать очень эффективное приложение.
[Словарик]
FIR Finite Impulse Response, фильтр с конечной импульсной характеристикой, КИХ-фильтр.
[Ссылки]
1. AN2701 Digital Signal Processing Performance of the 8-bit AVR Core site:microchip.com. 2. Specific Area Message Encoding site:swfltek.com. 3. Алгоритм Гёрцеля site:wikipedia.org. 3. Библиотека DSP реального времени для Arduino. 4. Обработка звука в реальном времени с помощью Arduino. 5. AVR223: Digital Filters with AVR (цифровые фильтры на AVR). 6. AVR335: цифровой рекордер звука на AVR и DataFlash. 7. Улучшение оцифровки с помощью передискретизации и усреднения. 8. FSK Demodulation in GNU Radio site:wirelesspi.com. 9. 230628AN2701.zip - даташиты, документация. |