Программирование AVR AVR335: цифровой рекордер звука на AVR и DataFlash Sun, January 20 2019  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR335: цифровой рекордер звука на AVR и DataFlash Печать
Добавил(а) microsin   

В этом переводе представлена реализация записи, хранения и воспроизведения звука на основе микроконтроллера AVR, имеющего на борту АЦП, микросхемы памяти AT45DB161B DataFlash и нескольких внешних компонентов (перевод апноута [1]).

Апноут [1] демонстрирует использование АЦП AVR для оцифровки звука, интерфейса SPI для подключения к внешней памяти DataFlash, а также ШИМ (Pulse Width Modulation, PWM) для воспроизведения записанного звука. Это может использоваться и в других приложениях - логгеры температуры, автоматы ответа на телефонные звонки, цифровые диктофоны и т. п.

Параметры демонстрационного проекта:

• Реализован простой цифровой диктофон.
• Звук записывается в 8-битном формате.
• Частота оцифровки 8 кГц.
• Полоса записываемого звука до 4000 Гц.
• Максимальное время записи 4 минуты 15 секунд.
• Очень простая схема.
• Код занимает меньше 700 байт.

Микросхема AT45DB161B DataFlash это память с интерфейсом SPI, работающая только от одного напряжения 2.7V. Её память 16 мегабит организована в 4096 страниц по 528 байт каждая. Дополнительно к этой основной энергонезависимой памяти, DataFlash содержит два буфера данных SRAM по 528 байт каждый. Буферы позволяют осуществить виртуально непрерывный записываемый поток данных в DataFlash.

Через SPI в AT45DB161B осуществляется последовательный доступ к данным. Этот интерфейс упрощает аппаратуру и разводку сигналов подключения, увеличивает надежность системы, снижает шумовые переходные процессы и уменьшает размеры используемых корпусов микросхем и количество их выводов. Типовое применение такой памяти - хранилище данных лога или звуковых данных. DataFlash работает на тактовой частоте SPI до 20 МГц, с типовым током потребления около 4 мА. AT45DB161B работает от одного источника питания (напряжением от 2.7V до 3.6V) как для операций чтения, так и для операций записи.

Последовательный интерфейс SPI AT45DB161B совместим с режимами 0 и 3 интерфейса SPI микроконтроллера AVR. В этом апноуте AVR AT90S8535 используется для оцифровки аналоговых выборок сигнала звука и преобразования их в цифровые значения с помощью встроенного АЦП. Аппаратный SPI микроконтроллера управляет данными, посылаемыми в память DataFlash и из неё. Функция аппаратного ШИМ (PWM) микроконтроллера AVR используется для воспроизведения, обратного преобразования цифровых выборок в аналоговый сигнал звука. Размер кода очень маленький, так что приложение поместится в младшие модели AVR.

[Принцип работы]

Перед тем, как аналоговый сигнал (рис. 1) можно будет сохранить в DataFlash, он должен быть преобразован в цифровой сигнал. Это делается за несколько шагов.

AVR335 analog signal fig01

Рис. 1. Пример аналогового сигнала.

Сначала аналоговый сигнал (рис. 1) преобразуется в запоминаемые на определенных, одинаковых интервалах времени выборки аналогового сигнала, этот процесс называется дискретизацией по времени (рис. 2). Интервал времени между двумя соседними выборками сигнала называется период дискретизации (sampling period), и обратная этому периоду величина называется частотой дискретизации (sampling frequency). В соответствии с теоремой выборок (теорема Найквиста-Котельникова) для достоверной оцифровки сигнала (чтобы его можно было восстановить почти без потерь) необходимо выполнение условия, чтобы частота дискретизации была как минимум вдвое выше самой высокой частоты в спектре сигнала. В противном случае продолжающееся повторение выборок приведет к завороту верхней части спектра в область низких частот, что называется "алиасингом" (aliasing). Такой неправильно оцифрованный сигнал не может быть корректно восстановлен из своих выборок.

AVR335 time discrete signal fig02

Рис. 2. Сигнал, дискретизированный по времени.

Голосовой спектр содержит основную информацию в пределах полосы частот ниже 3000 Гц. Таким образом, чтобы ограничить полосу сигнала, можно использовать фильтр низких частот (ФНЧ). Такой фильтр часто называют "антиалисинговым".

Для идеального ФНЧ с частотой среза на 3000 Гц (с прямоугольным резким спадом на верхней предельной частоте) частота дискретизации должна быть 6000 Гц. В зависимости от реализации фильтра его спад амплитудной характеристики будет более или менее пологим, но никогда не идеальным. Особенно пологая характеристика у простейшего RC-фильтра первого порядка, поэтому нужно выбрать намного большую частоту дискретизации. При этом верхний предел такой частоты ограничивается возможностями АЦП, быстродействием микроконтроллера и доступной памятью для хранения цифровых выборок.

Определение цифровых значений для представления аналоговых выборок, которые берутся из аналогового сигнала на частоте дискретизации, называется квантованием уровня (quantization). Аналоговый сигнал квантуется таким образом, что определенным уровням напряжения присваиваются ближайшие допустимые цифровые значения (рис. 3). Количество таких возможных цифровых значений называется разрешающей способностью (resolution), и оно всегда ограничено. Например, это будет 256 различных вариантов уровня для 8-битного цифрового сигнала, или, как в примере на рисунке 3, это 10 допустимых значений. Таким образом, квантования по уровню аналогового сигнала всегда приводит к потере некоторой части исходной информации. Эти потери называются ошибкой квантования (quantization error), и они обратно пропорциональны разрешающей способности цифрового сигнала. Ошибка квантования вносит в оцифрованный сигнал шум, который называют "шумом квантования". Также потери квантования обратно пропорциональны динамическому диапазону сигнала, в примере на рис. 3 это минимальное значение 3 и максимальное 8. АЦП микроконтроллера AT90S8535 можно подстроить к динамическому диапазону сигнала путем установки уровней AGND и AREF в соответствие с максимом и минимумом уровней входного сигнала.

AVR335 quiantized signal fig03

Рис. 3. Квантование сигнала по уровню.

Другой способ подстройки динамического диапазона под АЦП - использование усилителя на его входе. У AVR также есть свой программируемый в некоторых пределах усилитель сигнала для АЦП, что будет рассмотрено позже. Любые (корректные) подгонки рабочего диапазона АЦП под динамический диапазон сигнала снижают ошибку квантования.

Рис. 4 показывает цифровые выборки сигнала, которые представляют аналоговый сигнал. Эти цифровые значения вычитываются из АЦП в процессе его периодических (с интервалом дискретизации) преобразований.

AVR335 digital signal fig04

Рис. 4. Цифровой сигнал.

В этом приложении сигнал должен иметь минимально допустимое и максимально допустимое значения, которые нельзя превышать. Части сигнала, которые переходят за эти уровни, не несут полезной информации. Они могут быть удалены из выходных данных для экономии памяти. Это делается смещением всех выборок сигнала вниз, и отбрасыванием "максимальных" значений (рис. 5).

AVR335 bit reduced digital signal fig05

Рис. 5. Цифровой сигнал с ограниченным количеством бит.

В этом приложении результирующий сигнал имеет разрядность 8 бит. Эта разрядность выборок максимально удобна как для обработки внутри AVR, так и для сохранения в DataFlash.

DataFlash не требует отдельного цикла стирания перед программированием. Когда используются команды, работающие с SRAM-буфером DataFlash (команды "Buffer to Main Memory Page Program with Built-In Erase" или "Main Memory Page Program Through Buffer"), микросхема DataFlash будет автоматически стирать указанную страницу в памяти перед программированием в неё реальных данных. В системах, которые требуют более скоростных передач данных для записи (больше 200 килобит/сек), основной массив памяти может быть предварительно стерт, чтобы уменьшить общее время программирования. Предоставляются опциональные команды "Page Erase" для очистки одной страницы памяти и "Block Erase" для очистки 8 страниц памяти за 1 раз. Когда в памяти есть предварительно очищенные области данных, команда "Buffer to Main Memory Page Program without Built-In Erase" должна использоваться для максимально быстрого программирования.

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

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

[Как работает демонстрационная программа]

Для записи в DataFlash используется Buffer 1. Когда этот буфер заполнился (528 выборками), он записывается в основную память во время осуществления 529-го преобразования. Данные записываются до тех пор, пока не будет отпущена кнопка "Record", или пока не заполнится вся память. Если вся память заполнена, то новые данные не могут быть записаны в DataFlash до её очистки. Если память заполнена только частично, и кнопка "Record" нажата второй раз, то новые данные будут добавлены непосредственно за уже записанными.

Воспроизведение всегда начинается от начала DataFlash. Воспроизведение останавливается, когда все записанные данные были проиграны, или когда была отпущена кнопка "Playback".

DataFlash позволяет вычитывать данные либо напрямую из основной памяти, или путем копирования страницы в один из двух буферов, и последующего чтения из этого буфера. Метод прямого доступа не подходит для таких приложений, как двухадресные, с одним адресом для номера страницы, и другим для позиции байта, когда применяется длинная последовательность инициализации, передаваемая в DataFlash для каждого отдельного байта. Такие обращения к памяти происходят обычно намного дольше, чем один такт ШИМ, который занимает 510 периодов тактов для 8-битного сигнала ШИМ.

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

Чтение данных из буфера DataFlash синхронизировано с частотой ШИМ.

Цифровые значения воспроизводятся с помощью ШИМ (PWM). На рис. 6 показаны примеры выборок сигнала 2 и 3. Один цикл PWM состоит из счета счетчика вверх до максимального значения, заданного максимальной разрешающей способностью (8 в этом примере), после чего снова происходит счет вниз. Выходной сигнал PWM переключается в лог. 1, когда счетчик PWM достигает значения цифрового сигнала, и переключается в лог. 0, когда значение счетчика снова оказывается меньше значения цифрового сигнала. Таким образом, темная часть на рисунке представляет мощность (уровень) сигнала для этой выборки.

AVR335 two example PWM cycles fig06

Рис. 6. Два примера циклов ШИМ (PWM).

На рис. 7 показан пример выходного сигнала PWM.

AVR335 filtered PWM output signal fig07

Рис. 7. Фильтрованный сигнал ШИМ.

Частота PWM должна быть как минимум в два раза выше частоты сигнала. Рекомендуется использовать частоту PWM как минимум в 4 раза выше частоты сигнала, что зависит от выходного фильтра. Чем выше частота ШИМ, тем проще реализация фильтра с требуемыми параметрами.

С помощью ШИМ осуществляется обратное преобразование цифрового сигнала в аналоговую форму (ЦАП). Повышение точности такого преобразования может быть достигнуто повышением разрядности счетчика ШИМ, повышением частоты ШИМ, либо снижением полосы спектра выходного сигнала.

В этом приложении частота среза выходного фильтра установлена на 4000 Гц, что грубо составляет четверть от частоты ШИМ (15686 Гц). Системная тактовая частота микроконтроллера и разрешающая способность ШИМ определяют частоту ШИМ. При системной тактовой частоте 8 МГц частота 10-битного разрешения ШИМ составит 3922 Гц (8 МГц / 2 • 210 = 3922 Гц), 7843 Гц для 9-битного разрешения и 15686 Гц для 8-битного разрешения. Только последнее значение достаточно высокое, чтобы работать в качестве частоты несущей для сигнала со спектром 4000 Гц. Таким образом, оригинальная 10-битная цифровая выборка преобразуется в 8 бит.

Выходной фильтр сглаживает импульсы выходного сигнала ШИМ, удаляя из него высокочастотную несущую 15686 Гц. Результирующий выходной сигнал получится подобным сигналу на рис. 8. За исключением ошибок квантования (которые очень большие в этом примере, потому что в примере на рис. 8 используются только лишь 8 цифровых значений), сигнал выглядит похоже на исходный (рис. 1).

AVR335 PWM output signal fig08

Рис. 8. Выходной сигнал ШИМ.

Пользователь может управлять системой звука тремя кнопками: "Стереть" (Erase), "Запись" (Record) и "Воспроизвести" (Playback). Если кнопка не нажата, то внутренними верхними подтягивающими резисторами (pull-up) на входах портов кнопок (PD0, PD1, PD2) устанавливается высокий уровень VCC.

Для обратной связи с пользователем имеется светодиод LED, показывающий состояние системы.

Микросхема памяти DataFlash напрямую подключена к микроконтроллеру AVR с помощью шины SPI. Эта же шина SPI используется для внутрисхемного перепрограммирования (ISP) микроконтроллера AVR, в этом случае сигнал выборки микросхемы памяти DataFlash (Chip Select, CS) подтягивается к высокому уровню pull-up резистором 10 кОм, что предотвращает активацию DataFlash. Если ISP не используется, то этот резистор можно не устанавливать.

AVR335 Microcontroller and Memory circuit fig09

Рис. 9. Схема устройства.

Аналоговое напряжение AVCC подключено к VCC через ФНЧ на RC-цепочке. Это напряжение используется как опорное для АЦП.

Кварцевый резонатор с двумя корректирующими конденсаторами используются для генерации системной частоты AVR.

В качестве микрофонного усилителя используется простой инвертирующий каскад на операционном усилителе LM324 (U1A). Его усиление устанавливается резисторами R1 и R9 (коэффициент усиления = R1 / R9). R4 используется для подачи питания на микрофон, и C1 блокирует прохождение постоянной составляющей сигнала микрофона на вход усилителя. R2 и R3 устанавливают смещение усилителя по постоянному току. R5 и C8 формируют цепочку ФНЧ первого порядка. Дополнительно R5 защищает выход операционного усилителя U1A от короткого замыкания.

AVR335 microphone and speaker circuit fig10

Рис. 10. Схема микрофонного усилителя и выходного усилителя.

Схема для подачи сигнала на динамик/наушники состоит из ФНЧ 5-го порядка с характеристикой Чебышева (U1B, U1C) и буферного повторителя (U1D). Фильтр построен на двух каскадах ФНЧ Чебышева 2-го порядка (R6, R7, R8, C2, C7 и R7, R10, R11, C9, C5) и пассивной цепочки ФНЧ (R11, C4). Частоты среза первых двух каскадов немного сдвинуты друг относительно друга, чтобы ограничить провалы общей АЧХ. Общая частота среза ФНЧ установлена на 4000 Гц, что грубо составляет четвертую часть от частоты ШИМ (15686 Гц).

Буферный каскад с одиночным усилением (U1D) обеспечивает развязку фильтра от выходной нагрузки. C3 блокирует постоянную составляющую на выходе буферного усилителя от попадания на динамик или наушники.

[Программная реализация]

Первоначальные установки. При включении питания запускается программа микроконтроллера, и она настраивает его порты GPIO. Это делает подпрограмма setup.

В протоколе SPI определено, что одно из устройств на шине должно работать как главное (master), и другие устройства как подчиненные (slave) [2, 3]. В нашем случае микроконтроллер AVR AT90S8535 работает как master, а микросхема DataFlash как slave. Поскольку AT90S8535 работает только как master, вывод SS может использоваться как обычный порт ввода/вывода (GPIO).

SPI AT90S8535 привязан к альтернативной функции ножек порта B (PB5, PB6 и PB7). Также настраиваются порты GPIO PB0, PB1 и PB4 для сигналов управления DataFlash. Ножка порта PB3 используется для управления светодиодом LED. Для функционирования SPI master сигналы тактов (Serial Clock, SCK), выход последовательных данных (Master Out/Slave In, MOSI), выборка микросхемы (Chip Select, ~CS), защита от записи (Write Protect, WP) и сброс (Reset, RST) настраиваются у микроконтроллера AVR как выходы, и сигналы входа последовательных данных (Master In/Slave Out, MISO) и готовность/занятость (Ready/Busy, RDY/BSY) настраиваются как входы. Также порт PB3 светодиода настраивается как выход, поэтому в регистр DDRB записывается значение 0xBD.

Затем в регистр PORTB записывается значение, устанавливающее все выходы в лог. 1, и подключающие на всех входах внутренние pull-up резисторы.

Встроенный АЦП AT90S8535 подключен к выводам порта A. Поэтому порт A настроен как вход с высоким сопротивлением.

Порт D обслуживает входы кнопок и выход для вывода сигнала ШИМ. Для формирования ШИМ используется функция PWM таймера Timer1 на выходе PD4.

В завершение разрешаются прерывания. В этом приложении используются два прерывания - АЦП и переполнение таймера 1 (ADC и Timer1 Overflow), которые разрешаются и запрещаются в подпрограмме, когда это необходимо.

Цикл функции main. В бесконечном цикле main опрашиваются три кнопки. Если какая-нибудь из них нажата, зажигается LED чтобы показать, что система занята действием и вызвана соответствующая подпрограмма. Выполняется дополнительный цикл, пока кнопка не будет отпущена, в качестве программного подавления дребезга контактов кнопок Erase и Playback. Светодиод LED гаснет, чтобы показать переход системы в состояние ожидания.

AVR335 main loop fig11

Рис. 11. Алгоритм бесконечного цикла.

Очистка памяти. Память микросхемы DataFlash может быть опционально очищена (Erase).

AVR335 Erase fig12

Рис. 12. Алгоритм Erase.

Когда вызывается подпрограмма Erase, устанавливается флаг, который показывает, что следующий цикл записи новых данных будет начинаться от начала DataFlash. SPI должен быть настроен для доступа к DataFlash. Здесь не используются прерывания (они запрещены). SPI master AT90S8535 настраивается на порядок следования бит при обращении к DataFlash такой, что старший бит (Most Significant Bit, MSB) идет первым. DataFlash воспринимает сигнал лог. 0 SCK, когда ~CS переходит от лог. 1 к лог. 0 (SPI Mode 0), или лог. 1 SCK, когда ~CS переходит от лог. 1 до лог. 0 (SPI Mode 3) в положительной фазе тактов. В этом приложении SPI настраивается в Mode 3. Чтобы осуществить максимально быструю передачу данных, выбирается самый маленький коэффициент деления тактовой частоты, при этом шина SPI работает на частоте 2 МГц, если используется кварцевый резонатор 8 МГц.

Для выполнения очистки блоками (block erase), сигнал ~CS переводится в лог. 0, и в DataFlash загружается код операции 0x50, за которыми идут два зарезервированных нулевых бита, 9-битный адрес блока, и 13 бит, которые не имеют значения. Эта последовательность передается байтами в подчиненное устройство DataFlash. После каждого байта регистр состояния SPI (SPI Status Register, SPSR) проверяется на установку флага прерывания SPI, показывающего завершение последовательной передачи. После того, как вся эта последовательность записана, начинается стирание блока, когда сигнал ~CS переводится в лог. 1. Вывод Ready/Busy переводится микросхемой DataFlash в лог. 0, пока блок не будет очищен. Затем точно так же будет очищен следующий блок, как был только что очищен текущий. Это повторяется, пока не будут очищены все 512 блоков. Очищенные байты DataFlash читаются как 0xFF.

Запись. Подпрограмма оцифровки звука состоит из настройки АЦП и пустого цикла, который повторяется, пока нажата кнопка Record. Ножка ADC0 используется как вход для аналогового сигнала, поэтому регистр мультиплексора АЦП (ADC Multiplexer Select Register, ADMUX) должен быть установлен в 0. В регистре управления и состояния (ADC Control and Status Register, ADCSR) АЦП разрешается с коэффициентов деления тактов 32, настраивается режим одиночного преобразования (single conversion mode), разрешаются прерывания, и очищается флаг прерывания. Немедленно запускается преобразование АЦП. Первое преобразование происходит дольше, чем последующие преобразования (832 тактов генератора вместо 448). После этого времени произойдет прерывание АЦП, которое показывает, что преобразование завершилось, и результат оцифровки можно прочитать из регистра данных АЦП (ADC Data Register).

Аналоговый сигнал на выходе микрофонного усилителя оцифровывается на частоте дискретизации 15686 Гц. Та же самая частота используется в качестве несущей ШИМ (PWM).

Чтобы достичь частоты дискретизации 15686 Гц, выборка сигнала с АЦП происходит через каждые 510 тактов системной частоты (15686 Гц x 510 = 8 МГц). Чтобы получить результат преобразования АЦП, через каждые 510 тактов АЦП запускается на одиночное преобразование с коэффициентом деления тактов ADC, равным 32. Одиночное преобразование занимает 14 тактов АЦП. Таким образом, результат преобразования будет готов через 14 x 32 = 448 тактов.

Когда преобразование завершается, происходит прерывание. Обработчик прерывания выполняет цикл для заполнения остальных 62 тактов (510 - 448 = 62) перед запуском нового преобразования АЦП.

10-битный результат преобразования представляет значение уровня аналогового сигнала на входе АЦП после 2 тактов от момента запуска преобразования. Эти 10 перекрывают диапазон уровней от AGND до AREF, что в этом приложении соответствует уровням от 0V до 5V. Однако сигнал на выходе микрофонного усилителя ограничен диапазоном от 2.3V до 3.5V. Таким образом, из 10-битного результата преобразования вычитается значение, соответствующее минимальному входному напряжению. Это значение равно 0x1D5 для минимального напряжения 2.3V. Часть данных, представляющая значения выше 3.5V, удаляется из результата путем обнуления двух старших бит 10-битного результата преобразования. Это делается автоматически, когда результат преобразования обрабатывается подпрограммой записи во FLASH, так как её переменная flash_data определена как char (имеет разрядность 8 бит). Конечные 8-битные данные затем записываются в DataFlash перед тем, как произойдет следующее прерывание АЦП.

AVR335 Record fig13

Рис. 13. Алгоритм оцифровки сигнала (запись).

Запись данных в DataFlash осуществляется сначала в буфер, и потом этот буфер полностью записывается в страницу основной памяти.

В подпрограмме write_to_flash переменная j представляет номер байта в буфере и переменная k номер страницы, в которую будет записан буфер. Если флаг new-data показывает, что память DataFlash чистая, то оба счетчика устанавливаются в 0. Если память уже содержит какие-то данные, то эти переменные содержат следующую свободную ячейку в памяти, что гарантирует, что новые данные будут непосредственно добавлены к уже имеющемся данным звука в памяти.

Чтобы сохранить значение этих переменных между вызовами двух функций, они декларированы как static.

Чтобы записать данные в буфер, сигнал ~CS переводится в лог. 0, и код операции 0x84 загружается в микросхему DataFlash. За этим следуют ничего не означающие 14 бит, и 10-битный адрес позиции в буфере. Затем идут 8-битные данные.

Эта последовательность передается по байтам. После каждого байта проверяется регистр состояния SPI (SPI Status Register, SPSR), пока флаг прерывания SPI не покажет, что последовательная передача завершилась. После записи всей последовательности сигнал ~CS переводится в лог. 1.

Если буфер заполнился, и еще есть чистые страницы, то буфер копируется в следующую страницу DataFlash. Так как память была стерта раньше, данные можно записывать без дополнительной операции стирания.

Если вся память заполнена, выполняется цикл, пока не будет отпущена кнопка Record. Любые оцифрованные данные при этом не запишутся и не будут потеряны.

AVR335 Write to DataFlash fig14

Рис. 14. Алгоритм записи в DataFlash.

Воспроизведение. В подпрограмме Playback, содержимое DataFlash считывается, и прочитанные данные модулируют 8-битный ШИМ, работающий на 15686 Гц. Чтобы достичь более высокой скорости, данные не вычитываются напрямую из памяти, вместо этого перемещаются в один из двух буферов, и затем чтение происходит из буфера. Тем временем следующая страница памяти копируется в другой буфер. Для ШИМ используется 16-битный Timer/Counter1, сигнал ШИМ выводится на OC1B. Это настраивается в регистрах таймера Timer/Counter Control Register A (TCCRA) и Timer/Counter Control Register B (TCCRB). Чтобы запустить ШИМ а самой большой возможной частоте, делитель тактов PWM установлен в 1.

Когда настройка завершена, первая страница копируется в Buffer 1 путем перевода сигнала ~CS в лог. 0 и передачи соответствующих команд в микросхему DataFlash. Перемещение данных из страницы в буфер (page-to-buffer transfer) начинается, когда сигнал ~CS снова возвращается в лог. 1. Когда сигнал занятости Ready/Busy переведен микросхемой DataFlash в лог. 1, Buffer 1 содержит достоверные данные. Затем запускается перемещение данных в Buffer 2. Так как оба буфера не зависят один от другого, данные из буфера 1 могут читаться, пока DataFlash занята копированием следующей страницы в буфер 2.

Для чтения байта из буфера, в микросхему DataFlash записывается пустое, ничего не значащее значение (dummy value). Операция записи со стороны устройства master SPI приводит к тому, что подчиненное устройство выдвигает на шину SPI свои данные, которые появятся после завершения записи в регистре данных SPI (SPI Data Register, SPDR). После записи dummy-байта в DataFlash регистр SPDR микроконтроллера AVR содержит выходные данные, прочитанные из DataFlash.

AVR335 Playback fig15

Рис. 15. Алгоритм воспроизведения.

Когда счетчик PWM содержит значение 0, происходит прерывание переполнения таймера 1 (Timer1 overflow interrupt). Это прерывание используется для синхронизации вывода данных из DataFlash с частотой ШИМ. Когда значение из буфера выдвигается через SPI в микроконтроллер AVR, выполняется цикл до момента возникновения прерывания таймера 1. Тогда данные, записанные в регистр сравнения B таймера (Timer/Counter1 Output Compare Register B, OCR1B), автоматически защелкиваются на выход ШИМ, когда счетчик содержит свое максимальное значение (255 для 8-битного ШИМ).

После того, как из буфера будет прочитано последнее значение, происходит переключение на другой буфер.

Когда вся память проиграна, все прерывания запрещаются, и Timer/Counter1 останавливается.

AVR335 Next Page to Next Buffer fig16

Рис. 16. Алгоритм перемещения следующей страницы в следующий буфер.

AVR335 Active Buffer to Speaker fig17

Рис. 17. Алгоритм вывода активного буфера на динамик.

Описанное здесь приложение может быть протестировано и изменено для своих целей на основе STK200 Development Board. В этом случае следует сделать несколько замечаний.

Сокет чипа. Это приложение использует встроенное АЦП микроконтроллера. Таким образом микроконтроллер, устанавливаемый в сокет, должен иметь на борту аппаратный АЦП, и выход микрофонного усилителя подключается к контактам разъема, помеченного "Analog".

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

Резисторы SPI. Чтобы избежать ненужно влияния друг на друга SPI микроконтроллера и устройств, подключенных к коннектору порта B, вставляются резисторы 10 кОм между сокетом чипа и выводами PB5 .. PB7 коннектора Port B. Если DataFlash подключается к этим контактам коннектора, резисторы замыкаются мостиками припоя на обратной стороне STK200.

Использование встроенного AVR SPI. Замыкание резисторов между сокетом чипа и коннектором Port B может вызвать некоторые проблемы, если Вы используете SPI для загрузчки и проверки программы (через ISP), когда устройство памяти подключается к контактам разъема Port B. Если такие проблемы возникают, то помочь может отключение устройства во время работы ISP, или путем установки резистора 10 кОм между PB4 и VCC, как показано на рис. 9.

[Оптимизация и модификации]

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

Данные, вычитываемые из АЦП, без изменений записываются в DataFlash. Может понадобиться компрессия данных, если нужно увеличить время записи или если нужна запись стереосигнала.

В этом приложении показаны два способа реализации флага состояния. В одном из них используется глобальная переменная (например переменная wait применена в подпрограмме playback). Другой способ реализации флага подразумевает применение не используемого бита в регистре, что полезно для экономии оперативной памяти. В подпрограмме erase бит ACIS1 регистра управления и состояния аналогового компаратора (Analog Comparator Control And Status Register, ACSR) используется как индикатор сохранения новых данных. Пока аналоговый компаратор не используется, это не окажет никаких негативных эффектов на работу программы и освободит память, которая потребовалась бы для еще одной глобальной переменной.

Частота выборок 15686 Гц, соответствующая 510 тактам системной частоты, генерируется на основе прерывания АЦП и цикла задержки. Эта реализация может быть заменена на независимом таймере (Timer/Counter0 или Timer/Counter2), если он не используется для каких-нибудь других целей.

Исходный код проекта [4] может быть легко портирован на любой другой микроконтроллер AVR, у которого на борту есть аппаратный АЦП и SPI.

[Ссылки]

1. AVR335: Digital Sound Recorder with AVR® and DataFlash® site:microchip.net.
2. Интерфейс SPI.
3. AVR151: настройка и использование SPI.
4. 181227AVR335.zip - документация, исходный код.
5Обработка звука в реальном времени с помощью Arduino.
6. Библиотека DSP реального времени для Arduino.
7. AT45DB161B: 16 мегабит DataFlash.
8. Использование Atmel Serial DataFlash.

 

Добавить комментарий


Защитный код
Обновить

Top of Page