Как подключить к микроконтроллеру цап

Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Генерируем и воспроизводим звук. Часть первая

Вступление

Общее представление о простом методе генерирования звука.

Чтобы создать звук нам нужно заставить колебаться мембрану динамика с определенной частотой. Каждой ноте соответствует своя частота, например ноте До 1 октавы, соответствует частота 261Гц. Т.е. дрыгая ногой микроконтроллера, подключенной к динамику, со скоростью 261 раз в секунду мы будем слышать звучание этой ноты. Для тех кто не силен в музыкальной теории, звук ближе от 1кГц и выше будет более писклявый, ниже 300Гц будет басить.

На нашей плате установлен разъем Jack 3.5 и усилитель к нему. Рассмотрим принципиальную схему.

Как подключить к микроконтроллеру цап

Как мы видим, усилитель подключен к контроллеру через пин PE0. После переключения джампера «DAC_OUT_SEL» на плате, мы можем генерировать звук, который можем услышать, подключив, к примеру, наушники к Jack-у.

Реализация простой пищалки

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

Теперь нужно решить, с какой частотой мы будем «пищать». В этом мне помогла эта таблица частот. Для наглядности представлена ниже.

Как подключить к микроконтроллеру цап

Нота до ( C ) первой октавы имеет частоту 261.63 Герца. Это значит, что за одну секунду проходит 261.63 периода. В каждом из которых мы 2 раза меняем состояние бита. И того нам нужно менять состояние бита 523.26 раз в секунду. Поделив 1 секунду на 523.26 мы получим 0,0019110958223445, что примерно равняется 191*10^(-5) секунды. Это «пауза» между переключениями.

Теперь, когда мы знаем примерное значение задержки, мы можем настроить SysTick таймер и задержку к нему. Настроить нам его нужно на прерывания раз в 10^(-5) секунды. Для этого немного изменим нашу функцию из этой статьи. Получим следующее.

Ну и теперь, наконец-то, воспользуемся всем вышеописанным.

Все бы хорошо, но тут первые грабли. Как вы могли заметить, в основной функции нет ни строчки кода для настройки тактирования. Контроллер тактируется от HSI. В нашем примере это привело к тому, что вместо ноты до первой октавы, играла нота ля малой октавы (на 2 целых тона ниже). Чтобы исправить эту ошибку — добавим функцию переключения источника тактовой частоты с HSI на HSE (внешний кварцевый резонатор).

О системе тактирования было рассказано в этом уроке.

Чуть усложним задачу. Напишем программу, которая будет играть нам гамму из 12 полутонов (7 белых клавиш и 5 черных, если смотреть на фортепиано). Для этого создадим массив с длительностями всех задержек. Рассчитываем их так же, как и предыдущую: 100000/частота_ноты/2 = длительность_задержки. Делим 100000 потому, что у нас прерывание раз в 0.00001 секунды (10^(-5)).

Теперь немного изменим основную функцию.

Небольшое пояснение к коду. Так как длинна звучания сэмпла (одного периода звуковой волны) у каждой ноты разное, то для того, чтобы более-менее сделать звучание каждой ноты одинаковым, цикл ожидания составлялся следующим образом. Число самой длинной ноты (нота с большим числом задержки) звучало «задержку раз» самой короткой. Поясню. Нота до первой октавы (191) игралась 96 * 3 раз, а нота до второй октавы (96) играла 191 раз * 3. Тройка здесь коэффициент длительности. Далее будет рассмотрен более правильный способ измерения задержки.

Вот так выглядит наша волна.

Как подключить к микроконтроллеру цап

Если присмотреться по ближе, то можно увидеть ее несовершенность. Она даже близко не похожа на прямоугольные импульсы.

Как подключить к микроконтроллеру цап

Освоение ЦАП

Это стало для меня очень приятным сюрпризом. Никогда ранее я не видел ЦАП-а непосредственно в самом микроконтроллере. Но для начала нужно понять, можно ли подключить ЦАП к усилителю. Для этого открываем схему платы и видим следующее.

Как подключить к микроконтроллеру цап

Вывод нашего усилителя подключается непосредственно к PE0, к которому подключен ЦАП. Отлично. Можно начать настройку. Но перед этим немного изучим ЦАП.

В микроконтроллере реализовано два ЦАП. Для включения ЦАП необходимо установить бит Cfg_ON_DACx в 1, используемые выводы ЦАП порта Е были сконфигурированы как аналоговые и были отключены какие-либо внутренние подтяжки. Оба ЦАП могут работать независимо или совместно. При независимой работе ЦАП (бит Cfg_SYNC_A=0) после записи данных в регистр данных DACx_DATA на выходе DACx_OUT формируется уровень напряжения, соответствующий записанному значению. При синхронной работе (бит Cfg_SYNC_A=1) данные обоих ЦАП могут быть обновлены одной записью в один из регистров DACx_DATA. ЦАП может работать от внутренней опоры Cfg_M_REFx=0, тогда ЦАП формирует выходной сигнал в диапазоне от 0 до напряжения питания AUCC. В режиме работы с внешней опорой Cfg_M_REFx=1 ЦАП формирует выходное напряжение в диапазоне от 0 до значения DACx_REF.

Тут, можно сказать, описана вся настройка. Взглянем на регистры.

Как подключить к микроконтроллеру цап

Их здесь всего три регистра на два ЦАП. Из них два регистра для хранения значения на выходе у каждого из ЦАП. Рассмотрим регистр настройки.

Как подключить к микроконтроллеру цап

Приступаем к настройке. Так же не забываем про тактирование DAC. Ну и для теста выставим на выход максимальное напряжение (0xFFF = 4095).

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

Ну и добавим все это в основную функцию.

Сейчас, если замерить напряжение на пине, мы должны получить около трех вольт. НО. Этого не происходит. На пине у нас около 0.08 вольт. Что не есть хорошо. Идем разбираться. Прежде всего я проверил, затактирован ли ЦАП, Все было хорошо. Отладчик сообщает, что все регистры заполнены верно. Далее я решил взглянуть на таблицу пинов и обнаружил следующее.

Как подключить к микроконтроллеру цап

Вот это новость. PE0 подключен не к DAC1, а к DAC2! Вот и еще одна ошибка… Меняем функцию ЦАП-а.

Пробуем запустить. Теперь все хорошо. На выходе 3.28 вольта. Теперь по примеру простой пищалки попробуем сгенерировать звук прямоугольными импульсами. Для этого чуть изменим код предыдущего проекта.

Чисто по ощущениям звук намного приятнее, чем в предыдущем примере. Да и звучит он куда громче. Проект и звуковой файл на github.

А вот, для сравнения, наша волна.

Как подключить к микроконтроллеру цап
Как подключить к микроконтроллеру цап
Как подключить к микроконтроллеру цап

Отступление: усилитель на плате безумно сильно греется. Если оставить его в таком режиме минут на 10, то он превращается в печь… Поэтому я отключаю джампер после того, как послушал звук. Так он не нагревается.

Генерация синусоидальной волны.

Разобравшись с тем, как генерировать напряжение на выходе разного уровня я задумался, откуда брать значения этого напряжения? Буквально сразу же после начала поисков я наткнулся на эту статью. В ней я нашел самое главное. Код получения значений синуса волны. Немного переделав код я получил программу, которая запрашивая длину волны и частоту сэмпла генерирует массив значений напряжения для нашего кода. Вот код на Pascal ABC на github (Все таки нужно готовиться к ЕГЭ и временами писать и на паскале.).

Эксперименты с синусоидальной волной.

Получив синусоиду разбитую на 100 частей, вспоминаем, что эта синусоида должна быть проиграна с частотой 261,63 герца. Теперь рассчитаем интервал прерывания. Секунда/(100 частей * 261, 63) = 0.00003822191 секунды. Ну чтож. Скажу сразу. Я провел море эксперементов, чтобы получить звук. Вкратце расскажу о них. Так как частоты в 8 Мгц уже явно не хватало для такой скорости, то я решил себя побаловать и разогнал чип до 80 МГц, надеясь, что этого мне точно хватит. Но не тут то было. Настроив прерывания SysTick на 10000000 раз в секунду, контроллер даже не доходил до цикла, в котором выводились данные. После я решил, что куда проще будет выдавать данные сразу в прерывании. Получилось следующее.

Основная функция имела вид:

Звук получался таким:

Как подключить к микроконтроллеру цап

При детальном рассмотрении видно следующее:

Как подключить к микроконтроллеру цап

Вот приближенное возрастание «синусоиды»:

Как подключить к микроконтроллеру цап

Видна огромная погрешность. А так же звук получился очень низким. Может быть ля малой октавы. Не выше. Что свидетельствует о том, что код в прерывании просто не успевает выполняться. Даже при частоте 80 Мгц. Поступим иначе. Немного снизим качество. Сделаем прерывание чуть реже. И округлим цикл ожидания в прерывании. Получаем следующее.

Теперь прерывание успевает обработаться. Мы получаем звук практически идентичный с нотой До. Но все же на слух (при сравнении с фортепиано) можно услышать неточность. Файлы проекта и звуковые файлы на github.

Наша звуковая волна имеет следующий вид:

Как подключить к микроконтроллеру цап

Подъем «синусоиды» имеет следующий вид:

Как подключить к микроконтроллеру цап

Как мы видим, толка в наших 100 частях нет. ЦАП просто не успевает менять напряжение. (Как мне показалось на момент изучения.) Изменим наш проект так, чтобы синусоида состояла из 20 частей. Получаем следующий массив.

Рассчитаем частоту прерывания теперь. Секунду/(20 частей * 261.63) = 0.00019110958 секунды

191*10^(-6). Это уже лучше, чем было раньше. Настраиваем прерывания и задержку. Получаем следующее.

Мы получили звук еще более приближенный к ноте До. Звуковой файл так же имеется в проекте по ссылке выше.

Как подключить к микроконтроллеру цап
Как подключить к микроконтроллеру цап

К моему удивлению передо мной снова практически прямоугольные импульсы! Хотя должна была быть синусоида. Где-то я ошибся… «А что, если снизить амплитуду колебания?» — подумал я. Изменил в программе на паскале параметр, показывающий «высоту волны» от «0» до «предела» с 2047 на 1500. Но это ни к чему не привело. И тут я взглянул на меню программы подробнее и увидел.

Как подключить к микроконтроллеру цап

Вот удачный массив:

Теперь взглянем на наш сигнал (аудио запись так же доступна на github по ссылке выше). Наконец-то что-то похожее на синусоиду!

Как подключить к микроконтроллеру цап

Теперь, когда я смог создать синусоиду из 20 частей, воспользуемся кодом, рассмотренным ранее, и попытаемся сделать синусоиду из 100 частей. Вот получившийся массив.

Заменяем массив используя старый код и получаем это:

Как подключить к микроконтроллеру цап

Мы получили очень качественную синусоиду!

Код проекта и аудио на github.

Лирическое отступление

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

Для записи и анализа звука использовал полностью бесплатную программу Audacity. Она позволяет записывать звук в сколь угодно высоком качестве без ограничений и позволяет сохранять его в любом формате (в том числе и FLAC, в котором я и приводил примеры).

Так же хочу добавить, что у меня нет осциллографа. Эта программа заменила мне его.

Вместо заключения.

В следующей статье будет разобран DMA модуль и его спряжение с DAC.

Источник

Генерация звука через внешний ЦАП в схемах на микроконтроллере

В душе у каждого человека «сидит» композитор, только вырваться наружу ему не всегда удаётся. Вот и приходится довольствоваться прослушиванием чужих мелодий да напеванием через караоке популярных песен. Тем не менее, любой электронщик имеет все шансы попробовать свой талант в создании музыки, используя звуковые возможности MK и внешний узел ЦАП.

Теоретически ЦАП предназначен для преобразования цифровых кодов в аналоговую величину, например, в напряжение, ток, сопротивление. Алгоритм работы ЦАП заключается в суммировании образцовых напряжений и токов пропорционально весовым разрядам. В двоичном коде, характерном для MK, «вес» от разряда к разряду изменяется ровно в 2 раза.

Для понимания физики процессов, происходящих в звуковом ЦАП, иногда предлагают весьма необычные сравнения и аналогии 80. Например, надо мысленно представить себе переменный резистор, подключённый крайними выводами к источнику питания. Со среднего вывода резистора напряжение подаётся на обычный наушник (Рис. 2.60, а). Если очень-очень быстро крутить движок переменного резистора R1 в такт музыке, пропорционально частоте и громкости, то в наушнике BF1 появится высококачественный звук. И это действительно так!

Как подключить к микроконтроллеру цап

Рис. 2.60. Схемы имитации звукового ЦАП: а) на переменном резисторе; б) на ключах.

Разумеется, нормальному человеку выполнить столь быстрое и точное вращение не под силу. Нужен робот или, на крайний случай, MK, который вместе с внешними навесными элементами сможет сымитировать работу идеального «пеменника». Для этого в схему замещения вводятся многочисленные постоянные резисторы и переключатели (Рис. 2.60, б).

Если вспомнить, внутри MK уже имеются электронные ключи, то остаётся лишь программно коммутировать их со скоростью, достаточной для воспроизведения звука в диапазоне 20…20000 Гц. В итоге получается преобразование номера электронного ключа (цифра) в напряжение на наушнике (аналог).

Основой рассмотренного ЦАП являются резисторы R1…Rn, которые конфигурируются следующими способами:

• «параллельно», на матрице резисторов «2R», где сопротивление последующего и предыдущего резисторов отличаются ровно в 2 раза;

• «последовательно», на матрице «R-2R», где число резисторов вдвое больше, зато в каждой половине они имеют одинаковые номиналы: R и 2R;

• «нелинейно», с изменяющимися по определённому закону резисторами.

Разрядность ЦАП, как правило, кратна числу 4, например, 8, 12, 16, 24, 32. Следовательно, MK должен иметь точно такое же количество свободных выходных линий. При этом чем больше разрядность, тем ближе форма выходного сигнала к синусоиде, тем меньше размер «ступенек» импульсов и тем проще ФНЧ, их сглаживающий, однако тем выше требования к точности резисторов.

Задача MK сводится к тому, чтобы выбрать из памяти очередной отсчёт амплитуды, разложить его на двоичные разряды, выставить получившиеся уровни на линиях порта, выдержать паузу 5…200 МК с, определяющую дискретизацию сигнала во времени, и повторить процедуру заново с новым отсчётом.

Для справки, в персональных компьютерах используют следующие стандартные частоты дискретизации звукового сигнала: 5.500; 7.333; 8.000; 11.025; 16.000; 18.900; 22.050; 31.250; 31.500; 44.056; 48.000; 96.000; 192.000 кГц. Соответственно, пауза времени между между выборками должны составлять 5.2…180 МК с. Быстродействие современных MK общего назначения позволяет генерировать звук во всём диапазоне указанного ряда, правда низкий объём внутренней памяти резко ограничивает длительность звучания, особенно при высоких битрейтах.

Схемы генерации звука через внешний ЦАП можно разделить на три группы:

• параллельные резисторные (Рис. 2.61, а…з);

• последовательные резисторные (Рис. 2.62, а…з);

• с интегральными микросхемами (Рис. 2.63, а…д).

Как подключить к микроконтроллеру цап

Рис. 2.61. Схемы генерации звука через параллельные резисторные ЦАП (начало):

а) классический ЦАП с матрицей резисторов «2R». Резисторы R1…R8через внутренние ключи MK фактически соединяются параллельно друг с другом (отсюда и название «параллельный» ЦАП). Телефон BF1 служит нагрузкой и одновременно выполняет функцию ФНЧ. На линиях MK выставляются ВЫСОКИЕ/НИЗКИЕ уровни очередного байта амплитуды сигнала. Допускается вместо НИЗКИХ уровней переводить MK в режим входа с Z-состоянием, но при этом появляется амплитудная нелинейность («логарифмический» ЦАП). Здесь и далее во всех схемах внешних ЦАП резисторы в делителях желательно использовать с допуском ±(0.5…2)%. От этого зависит точность преобразования и температурная стабильность;

б) добавление звукового сигнала от ЦАП в уже существующий тракт RJ1, C2. Конденсатор C1 сглаживает «ступеньки» импульсов. Резисторы R9, R10 определяют амплитуду сигнала; О

Как подключить к микроконтроллеру цап

О Рис. 2.61. Схемы генерации звука через параллельные резисторные ЦАП (продолжение):

в) с коллектора и эмиттера транзистора VT1 снимаются противофазные сигналы ЦАП. Для сглаживания «ступенек» импульсов требуется дополнительный внешний ФНЧ. Резистором R9 устанавливается рабочая точка транзистора K77, чтобы в сигналах на выходе не наблюдалось ограничений по амплитуде;

г) резисторы Л/…Л# задают напряжение на базе транзистора VT1. Громкоговоритель BA1 выполняет функцию ФНЧ (инерция диффузора). Переменным резистором ЛР регулируется громкость звука. Схема обладает узким линейным диапазоном ЦАП, поскольку при выставлении на выходах MK кодов выборок, близких к максимуму (11111111) или минимуму (00000000), транзистор VT1 входит в насыщение или в отсечку;

д) имитатор «органного» звучания по 8 каналам, каждый из которых отличается по частоте в 2 раза. Для формирования партитуры требуется специальное компьютерное программное обеспечение. Смеситель сигналов собран на ОУ DA1. Устройство можно также использовать как ЦАП, правда, с низкой разрядностью из-за одинаковых сопротивлений в 8 каналах; О

Как подключить к микроконтроллеру цап

е) широкодиапазонный генератор «цифрового синуса». Шкала сдвоенного переменного резистора R1 градуируется по частоте в трёх диапазонах: 20…200 Гц, 0.2…2 кГц, 2…20 кГц. Диапазоны переключаются НИЗКИМИ уровнями на трёх нижних линиях MK. Внутренний АЦП MK измеряет напряжение на резисторе R1.7, затем MK переводит напряжение в частоту. После этого восемь верхних линий MK сверху-вниз заполняются «бегущим столбиком» ВЫСОКИХ уровней, затем «бегущим столбиком» НИЗКИХ уровней и т.д. Итого образуется 16 «ступенек» синусоиды, полный цикл которой равен периоду генерируемого сигнала. Резистор R12 синхронно изменяет частоту среза ФНЧ, собранном на элементах 7?7.2, R10, C1..C3, что позволяет снизить уровень побочных гармоник;

ж) особенность данного ЦАП заключается в применении резисторов 7?7…7?Рсдопуском ±5%. Однако их последовательное и параллельное включение обеспечивает суммарную точность примерно в 2 раза выше. Резистором R10 регулируется амплитуда сигнала. Ёмкость конденсатора фильтра C7 зависит от частоты генерации звука. Конденсатор должен отсутствовать, если ЦАП используется для формирования телевизионного видеосигнала;

з) генератор сигналов треугольной формы. Матрица «2R» заменяется матрицей «R» с резисторами R одинакового сопротивления. Каждой «ступеньке» треугольника соответствует определённое число ВЫСОКИХ уровней, выставленных на верхних линиях MK. Амплитуду треугольного сигнала можно уменьшить на один или два порядка за счёт комбинации уровней на трёх нижних линиях MK.

Как подключить к микроконтроллеру цап

Рис. 2.62. Схемы генерации звука через последовательные резисторные ЦАП (начало):

а) классический ЦАП с матрицей резисторов «R-2R». Резисторы R1…R16могут иметь другие номиналы, но главное, чтобы сопротивления резисторов Л/…Л9были ровно в 2 раза больше, чем R10…R16. Для сглаживания «ступенек» импульсов требуется внешний ФНЧ. На выходах MK, в отличие от параллельного ЦАП, выставляются ВЫСОКИЕ/НИЗКИЕ уровни без Z-состояния;

б) унификация сопротивлений резисторов R1…R25приводит к повышению точности преобразования, поскольку сопротивление двух последовательно включённых резисторов будет иметь статистически меньший уход от номинала, чем у одного резистора. Рекомендуемая точность резисторов ±(1…2)%. Для уменьшения габаритов матрицы следует применить чип-резисторы;

в) повторитель напряжения на ОУ DA1.1 обеспечивает высокое входное сопротивление для матрицы «R-2R». Первым ФНЧ служит конденсатор С/, вторым — интегратор на ОУ DA1.2 с параллельной цепочкой R18, C2, определяющей частоту среза; О

Как подключить к микроконтроллеру цап

О Рис. 2.62. Схемы генерации звука через последовательные резисторные ЦАП (продолжение).

г) организация стереозвучания через две одинаковые резисторные матрицы «R-2R» и два идентичных пассивных ФНЧ на цепочках R33, C3 и R34, C4\

д) ЦАП на интегральной сборке высокоточных резисторов R3. Частота среза ФНЧ задаётся конденсаторами C7, C3, которые подключаются к общему проводу через транзисторы VT1, VT3. Эмиттерный повторитель на транзисторе КГ2сужаетдинамический диапазон ВЫх на 0.7 В. Для его расширения следует перейти на двухполярное питание аналогично Рис. 2.61, в;

е) применение мощного буферного повторителя DA1 повышает (хотя и не намного) инструментальную точность ЦАП за счёт меньшего влияния нагрузки на выходные уровни;

ж) аналогично Рис. 2.62, б, но с меньшим числом резисторов, поскольку применяется их паллельное, а не последовательное включение; О

Как подключить к микроконтроллеру цап

О Рис. 2.62. Схемы генерации звука через последовательные резисторные ЦАП (окончание):

з) эмиттерный повторитель на транзисторе VT1 и MK питаются от разных напряжений. Это позволяет повысить линейность преобразования ЦАП и расширить динамический диапазон, поскольку транзистор VT1 будет работать без насыщения и отсечки.

Как подключить к микроконтроллеру цап

Рис. 2.63. Схемы генерации звука через внешние интегральные ЦАП (начало):

а) восьмиразрядный ЦАП на микросхеме DA1 (фирма Texas Instruments) имеет вход «R» для плавного регулирования амплитуды выходного сигнала. Транзистор VT1 служит эмиттерным провторителем, что позволяет использовать высокоомный резистор R2\

б) программно-аппаратный ЦАП на базе интегратора DA2, охваченного обратной связью через внутренний 10-разрядныйАЦП MK. Напряжение 6 вых формируется зарядом/разрядом конденсатора C1. Динамический диапазон составляет 0…3.1 В. Ключи микросхемы DA1 включаются кратковременно только в те моменты, когда напряжение f/BbIX надо изменить; О

Как подключить к микроконтроллеру цап

О Рис. 2.63. Схемы генерации звука через внешние интегральные ЦАП (окончание):

в) подключение к MK внешнего «японского» ЦАП DA1 (16 бит, стерео, но используется режим моно). ОУ DA2.1 служит повторителем, а ОУ DA2.2 — активным фильтром Sallen-Key;

г) DA1— 12-разрядный последовательный ЦАП фирмы Burr-Brown. Усилитель на микросхеме Д42обеспечивает выход на наушники ( НАУШ) и сигнал в линию (UmH);

д)восьмиразрядный ЦАП на микросхеме DA1 (фирма National Semiconductor) работает в паре с ОУ DA2. Диапазон генерируемых частот 0…30 кГц, выходное напряжение 4 В, неравномерность АЧХ не более 0.3 дБ, КНИ = 0.0076% на частоте 1 кГц.

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Источник

Как подключить к микроконтроллеру цап

Может использоваться в системах автоматического регулирования, измерительных системах, в качестве генератора сигналов произвольной формы и т.д. DAC в микроконтроллерах STM32F100xx имеют достаточно высокое разрешение и быстродействие для использования в аудио-приложениях (системы с голосовым оповещением; говорящие игрушки; беспроводная гарнитура; может быть, даже плееры низшей ценовой категории).

Как подключить к микроконтроллеру цап
Рис. %img:n32_0

Введение

Микроконтроллеры STM32F100xx имеют встроенный модуль цифро-аналогового преобразования (ЦАП, он же DAC: Digital-to-analog converter) с разрешением 12 бит. Модуль имеет два выходных канала, каждый из которых имеет собственный преобразователь, т.е. DAC модуль включает в себя два DAC преобразователя. Два канала могут работать независимо (также можно задействовать только один из каналов) или совместно, синхронно обновляя сигнал на выходе. Присутствует поддержка DMA для каждого канала. Есть несколько режимов запуска преобразования: автоматически при загрузке данных в DAC (по умолчанию); по программному сигналу; по таймеру; по сигналу с вывода микроконтроллера.

Дополнительно имеется возможность работать в режиме генерации сигнала треугольной формы или в режиме генерации шума.

Функциональная схема DAC

Как подключить к микроконтроллеру цап
Рис. %img:bd

DAC использует следующие выводы

VDDA: вход для аналогового питания. Потенциал на выводе аналогового питания должен быть тем же самым, что и на основных выводах питания VDD, иначе говоря вывод VDDA должен быть подключён к VDD, возможно, через дополнительный фильтр. Цепи питания разделены для уменьшения влияния помех, создаваемых цифровыми элементами микроконтроллера на аналоговые.

Если аналоговые устройства микроконтроллера не используются, то напряжение питания может быть в пределах 2..3.6 В, но если используется DAC или ADC, требуется, чтобы напряжение питания (VDD и VDDA) было в пределах 2.4..3.6 В.

VREF+: вход для опорного положительного напряжения DAC; опорные напряжения определяют диапазон возможных напряжений на выходе преобразователя. Напряжение на выходе преобразователя линейно зависит от преобразуемого цифрового кода, при изменении цифрового кода от 0 до максимально возможного (0x0FFF в случае разрядности 12 бит) на выходе преобразователя получим напряжения от VREF- до VREF+. Вывод VREF- доступен только в 100-выводных корпусах семейства STM32F100xx, в остальных он подключён к выводу VSSA (общий аналоговый). Но даже если вывод VREF- имеется, всё равно требуется, чтобы он был подключён к VSSA. Поэтому на самом деле выходное напряжение DAC может изменяться в пределах 0..VREF+.

Вывод VREF+ доступен только в микроконтроллерах в 100-выводных корпусах и в корпусе TFBGA64 (с матрицей 8*8 жёстких шариковых выводов). Должен быть подключен к источнику опорного напряжения от 2.4 В до VDDA.

В остальных корпусах VREF+ подключается к VDDA внутри микроконтроллера, т.е. в качестве опорного напряжения для DAC используется напряжение аналогового питания.

Включение DAC

Прежде чем начать работу с периферийным устройством, следует включить для него тактовый сигнал. Для DAC, который подключён к шине APB1 это делают с помощью кода:

После установки соответствующего каналу бита ENx в регистре управления DAC_CR, аналоговый выход канала будет подключён к выводу микроконтроллера. На включение требуется время tWAKEUP до 10 мкс (максимальное значение при условии, что ёмкость нагрузки CLOAD≤50 пф, сопротивление нагрузки RLOAD≥5 кОм; типичное значение: 6.5 мкс).

Включение буфера

DAC содержит два выходных буфера которые используются для уменьшения выходного сопротивления преобразователя, что позволяет подключать нагрузку без использования внешнего операционного усилителя. Буфер каждого канала может быть независимо включён и отключён с помощью битов BOFFx регистра DAC_CR. По умолчанию буферы включены. Устанавливая бит BOFFx, отключаем буфер канала x.

С другой стороны, при отключённом буфере на выходе преобразователя можно получить напряжение из полного диапазона 0..VREF+. Буфер же обеспечивает работу только с сигналами в диапазоне 0.2 В..VDDA-0.2 В.

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

Формат данных DAC

DAC микроконтроллеров STM32F100xx является 12-битным, однако поддерживается загрузка данных в нескольких форматах. Возможны три варианта:

Регистры данных в одноканальном режиме DAC

31231570
8 бит, выравнивание вправо
12 бит, выравнивание влево
12 бит, выравнивание вправо

12-битный формат со выравниванием влево позволяет загружать в DAC данные как 16-битные числа. При этом преобразователь, естественно, остаётся 12-битным, так что младшие 4 бита в загружаемых числах не учитываются (теряются при сдвиге вправо на 4 бита перед сохранением во внутреннем регистре).

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

Кроме того, можно загрузить данные одновременно в два канала. В двухканальном режиме также возможны 3 варианта.

Регистры данных в двухканальном режиме DAC

31231570
8 бит, выравнивание вправо
12 бит, выравнивание влево
12 бит, выравнивание вправо

Процесс преобразования

Как подключить к микроконтроллеру цап
Рис. %img:dtd

Регистр DAC_DORx, который непосредственно связан с аналого-цифровым преобразователем и определяет напряжение на выходе канала DAC, недоступен для прямой записи. Вместо этого следует загрузить данные в один из регистров: DAC_DHR8Rx, DAC_DHR12Lx, DAC_DHR12Rx, DAC_DHR8RD, DAC_DHR12LD или DAC_DHR12LD.

Записанные в DAC_DHRx данные автоматически передаются в DAC_DORx через 1 цикл тактового сигнала APB1, если не выбран вариант аппаратного запуска преобразования (аппаратный запуск выбирается установкой бита TENx в регистре DAC_CR). Если аппаратный запуск выбран и сигнал запуска получен, передача данных в регистр DAC_DORx произойдёт через 3 такта тактового сигнала APB1.

После того, как в DAC_DORx будет загружено значение из DAC_DHRx, требуется время tSETTLING для установки напряжения на аналоговом выходе. Это время зависит от напряжения питания и нагрузки выхода DAC.

Цифровой код на входе DAC линейно преобразуется в выходное напряжение из диапазона 0..VREF+. Напряжение на аналоговом выводе канала DAC определяется соотношением
DACoutput=VREF+*DOR/4095.

Выбор способа запуска преобразования

По умолчанию преобразование цифрового кода в напряжение на выходе при включённом DAC осуществляется автоматически. В этом случае при изменении содержимого регистра DAC_DHRx (как изменить его содержимое описано выше, сам регистр недоступен для записи), через 1 такт тактового сигнала шины APB1 новое значение из DAC_DHRx копируется в DAC_DORx, а содержимое регистра DAC_DORx непосредственно определяет напряжение на выходе преобразователя.

Однако, есть возможность осуществлять пересылку содержимого из DAC_DHRx в DAC_DORx по внешнему сигналу. Это позволяет осуществить точную привязку аналогового сигнала к определённым моментам времени. Для этого с помощью битов TSELx[2:0] регистра DAC_CR определяют, какое событие будет запускать преобразование. Источник запуска может быть выбран только при выключенном канале DAC. С помощью бита TENx регистра DAC_CR включают режим преобразования по внешнему событию.

Выбор события, запускающего преобразование

ИсточникТипTSEL[2:0] 1
Timer 6 TRGO eventВнутренние сигналы от таймеров микроконтроллера000
Timer 3 TRGO event001
Timer 7 TRGO event010
Timer 5 или Timer 15 TRGO event 2011
Timer 2 TRGO event100
Timer 4 TRGO event101
EXTI line9Внешний вывод микроконтроллера110
SWTRIGУстанавливаемый программно бит SWTRIGx регистра DAC_SWTRIGR111

Каждый раз при обнаружении нарастающего фронта на выходе TRGO выбранного таймера или в случае внешнего прерывания по линии 9, данные, сохранённые в регистре DAC_DHRx пересылаются в регистр DAC_DORx. Содержимое DAC_DORx обновляется через 3 такта тактового сигнала на шине APB1 после того, как событие запуска произошло.

Если выбран программный запуск, преобразование запускается при установке бита SWTRIG. Этот бит сбрасывается аппаратно после того, как в регистр DAC_DORx будет загружено значение из DAC_DHRx. В данном случае на обновление регистра DAC_DORx требуется 1 такт тактового сигнала на шине APB1.

Примечание.
1. Биты TSELx[2:0] не могут быть изменены при установленном бите ENx.
2. В микроконтроллерах из линейки high-density value line (устройства с объёмом Flash памяти от 256 до 512 Кб) при выборе TSEL=3 запуск по умолчанию происходит по событию TRGO таймера TIM5, но с помощью функций переназначения AFIO может быть задействован таймер TIM15. В линейках low- и medium-density (объём Flash памяти 16..32 Кб и 64..128 Кб) при выборе источника запуска преобразования TSEL=3, всегда используется TIM15.

Пример программы

Прежде всего надо признать, что это, конечно, плохой пример и синтезировать сигнал таким способом не следует. Во-первых, кроме исключения от системного таймера обычно бывает разрешена обработка и других исключений. Тогда исключение от системного таймера, как правило, имеющее низкий приоритет может быть отложено, если в данный момент выполняется обработка других исключений. Хуже всего то, что моменты возникновения задержки и их длительность непредсказуемы. В результате в формируемый сигнал будут вноситься случайные фазовые искажения. Во-вторых, даже если бы не было «во-первых», длительность вычислений, производимых с числами с плавающей точкой будет немного изменяться при изменении операндов (потому что код, реализующий эмуляцию операций с плавающей точкой содержит операторы ветвления; в зависимости от выбора ветвей в процессе вычислений, количество выполненных операторов будет отличаться). Второй эффект легко устраним, если немного модифицировать код: сначала пишем в регистр DAC значение, вычисленное во время предыдущей обработки исключения от таймера, а уже после этого вычисляем новое значение, которое будет использоваться в следующий раз.

Но лучше воспользоваться возможностью аппаратного запуска преобразования по событию, например по сигналу таймера. Вопросам «правильного» синтеза сигналов посвящена серия статей, начиная с «Микроконтроллер + DAC как синтезатор сетки частот» и далее.

Как подключить к микроконтроллеру цап
Рис. %img:n3. N=3; Y: 1 В/дел.; X: 1 мс/дел. Это ещё совсем не похоже на синусоиду.

Как подключить к микроконтроллеру цап
Рис. %img:n4. N=4; Y: 1 В/дел.; X: 1 мс/дел.

Как подключить к микроконтроллеру цап
Рис. %img:n8. N=8; Y: 1 В/дел.; X: 2 мс/дел. При N=8 и более получается вполне приличное приближение.

Как подключить к микроконтроллеру цап
Рис. %img:n16. N=16; Y: 1 В/дел.; X: 5 мс/дел.

Как подключить к микроконтроллеру цап
Рис. %img:n32. N=32; Y: 1 В/дел.; X: 10 мс/дел.

Регистры DAC

DAC_CR (DAC control register)

31302928272625242322212019181716
ReservedDMAU
DRIE2
DMA
EN2
MAMP2[3:0]WAVE2[1:0]TSEL2[2:0]TEN2BOFF2EN2
rwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
ReservedDMAU
DRIE1
DMA
EN1
MAMP1[3:0]WAVE1[1:0]TSEL1[2:0]TEN1BOFF1EN1
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x00
Reset value: 0x0000 0000

DMAUDRIE1: DAC channel1 DMA Underrun Interrupt enable
Бит устанавливается и сбрасывается программно; значение 1 разрешает генерацию прерывания в случае ошибки DMA Underrun, 0 запрещает прерывание.

DMAEN1: DAC channel1 DMA enable
Бит устанавливается и сбрасывается программно; значение 1 включает режим DMA, 0 отключает.

MAMP1[3:0]: DAC channel1 mask/amplitude selector
Битовое поле, записываемое программно. Используется, если включён один из режимов аппаратной генерации (реализованы генерация псевдошума или генерация треугольных колебаний). Определяет используемую маску в режиме генерации шума и амплитуду в режиме генерации треугольных импульсов.
0000: бит 0 регистра LFSR не маскируется / амплитуда треугольных колебаний 1;
0001: биты [1:0] регистра LFSR не маскируется / амплитуда треугольных колебаний 3;
.
1011: биты [11:0] регистра LFSR не маскируется / амплитуда треугольных колебаний 4095;
т.е., в общем случае, если битовое поле MAMP1[3:0] содержит значение n, где n=0..11, то:
n: биты [n:0] регистра LFSR не маскируется / амплитуда треугольных колебаний 2**(n+1)-1,
здесь оператор «**» означает возведение в степень.

WAVE1[1:0]: DAC channel1 noise/triangle wave generation enable
Битовое поле, изменяемое программно. Позволяет включить один из поддерживаемых аппаратно режимов генерации.
00: режим генерации отключён;
01: включён режим генерации шума;
1x: включён режим генерации треугольных колебаний.
Примечание. Используется только если бит TEN1=1.

TSEL1[2:0]: DAC channel1 trigger selection
Битовое поле, устанавливаемое программно и позволяющее выбрать, какое внешнее по отношению к DAC событие будет запускать процесс преобразования.
000: Timer 6 TRGO event;
001: Timer 3 TRGO event;
010: Timer 7 TRGO event;
011: Timer 5 или Timer 15 TRGO event;
100: Timer 2 TRGO event;
101: Timer 4 TRGO event;
110: External line9;
111: программный запуск (запуск при программной установке в 1 бита SWTRIG1 в регистре DAC_SWTRIGR).
Примечание. Используется только если бит TEN1=1.

BOFF1: DAC channel1 output buffer disable
Устанавливаемый и сбрасываемый программно бит для отключения/включения выходного буфера канала.
0: буфер включен (по умолчанию буфер включен);
1: буфер отключён.
Примечание. Подробнее о преимуществах и недостатках использования буфера было сказано ранее в этой статье.

EN1: DAC channel1 enable
Бит устанавливается и сбрасывается программно, используется для включения канала 1 преобразователя DAC.
0: канал 1 отключён;
1: канал 1 включён.

DAC_SWTRIGR (DAC software trigger register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedSWTRIG2SWTRIG1
ww

Address offset: 0x04
Reset value: 0x0000 0000

SWTRIG2, SWTRIG1: DAC channel2/channel1 software trigger
Бит SWTRIGx устанавливается программно в 1 для программного запуска процесса преобразования, если DAC сконфигурирован для работы в этом режиме (заданы значения TSELx[2:0]=7, TENx=1). Бит сбрасывается в 0 аппаратно после загрузки значения из DAC_DHRx в DAC_DORx.

DAC_DHR12R1 (DAC channel1 12-bit right-aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC1DHR[11:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x08
Reset value: 0x0000 0000

Регистр предназначен для записи 12-битовых данных, выровненных вправо для первого канала DAC.

DAC_DHR12L1 (DAC channel1 12-bit left aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
DACC1DHR[11:0]Reserved
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x0C
Reset value: 0x0000 0000

Регистр предназначен для записи 12-битовых данных первого канала DAC, выровненных влево.

DAC_DHR8R1 (DAC channel1 8-bit right aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC1DHR[7:0]
rwrwrwrwrwrwrwrw

Address offset: 0x10
Reset value: 0x0000 0000

Регистр предназначен для записи 8-битовых данных первого канала DAC, выровненных вправо.

DAC_DHR12R2 (DAC channel2 12-bit right-aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC2DHR[11:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x14
Reset value: 0x0000 0000

Регистр предназначен для записи 12-битовых данных, выровненных вправо для второго канала DAC.

DAC_DHR12L2 (DAC channel2 12-bit left aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
DACC2DHR[11:0]Reserved
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x18
Reset value: 0x0000 0000

Регистр предназначен для записи 12-битовых данных второго канала DAC, выровненных влево.

DAC_DHR8R2 (DAC channel2 8-bit right aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC2DHR[7:0]
rwrwrwrwrwrwrwrw

Address offset: 0x1C
Reset value: 0x0000 0000

Регистр предназначен для записи 8-битовых данных второго канала DAC, выровненных вправо.

DAC_DHR12RD Dual DAC 12-bit right-aligned data holding register()

31302928272625242322212019181716
ReservedDACC2DHR[11:0]
rwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
ReservedDACC1DHR[11:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x20
Reset value: 0x0000 0000

Регистр предназначен для программной записи данных в формате 12 бит (выравнивание вправо) сразу для обоих каналов DAC.

DAC_DHR12LD (DUAL DAC 12-bit left aligned data holding register)

31302928272625242322212019181716
DACC2DHR[11:0]Reserved
rwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DACC1DHR[11:0]Reserved
rwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x24
Reset value: 0x0000 0000

Регистр предназначен для программной записи данных в формате 12 бит (выравнивание влево) сразу для обоих каналов DAC.

DAC_DHR8RD (DUAL DAC 8-bit right aligned data holding register)

31302928272625242322212019181716
Reserved
1514131211109876543210
DACC2DHR[7:0]DACC1DHR[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Address offset: 0x28
Reset value: 0x0000 0000

Регистр предназначен для программной записи данных в формате 8 бит (в случае 8 бит поддерживается только выравнивание вправо) сразу для обоих каналов DAC.

DAC_DOR1 (DAC channel1 data output register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC1DOR[11:0]
rrrrrrrrrrrr

Address offset: 0x2C
Reset value: 0x0000 0000

Регистр только для чтения, содержит выходные данные, преобразуемые первым каналом DAC. Содержимое регистра определяет выходное напряжение преобразователя: DACoutput1=VREF+*DAC_DOR1/4095.

DAC_DOR2 (DAC channel2 data output register)

31302928272625242322212019181716
Reserved
1514131211109876543210
ReservedDACC2DOR[11:0]
rrrrrrrrrrrr

Address offset: 0x30
Reset value: 0x0000 0000

Регистр только для чтения, содержит выходные данные, преобразуемые вторым каналом DAC. Содержимое регистра определяет выходное напряжение преобразователя: DACoutput2=VREF+*DAC_DOR2/4095.

DAC_SR (DAC status register)

31302928272625242322212019181716
ReservedDMAUDR2Reserved
rc_w1
1514131211109876543210
ReservDMAUDR1Reserved
rc_w1

Address offset: 0x34
Reset value: 0x0000 0000

DMAUDR2, DMAUDR1: DAC channel2/channel1 DMA underrun flag.
Бит устнавливается в 1 аппаратно при возникновении ошибки DMA underrun соответственно во втором и первом канале DAC. Сброс бита в 0 осуществляется записью в него 1.

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *