ЦАП на основе резистивной матрицы R-2R и его реализация на микроконтроллере

Параллельный Цифро Аналоговый Преобразователь по схеме R-2R Электроника для всех

Блог о электронике

Порой надо выдать точный аналоговый сигнал, да еще с быстро менющийся. Например, функцию. Раньше я рассматривал как это можно сделать с помощью ШИМ, но у этого метода есть проблема — он очень медленный. В самом деле, чтобы получить один уровнь на ШИМ, нужно, по меньшей мере, 256 тиков таймера. А если надо развернуть функцию в которой 256 отсчетов? Да еще на каждый отсчет по 256 тиков? Это какая же должна быть частота процессора? Да еще надо учесть, что ШИМ требует интегрирующей цепочки с конденсатором. А значит для четкого установления уровня должно пройти еще несколько импульсов, что снижает скорость еще раза в три. Короче, получить что либо быстрей чем 50 ГЦ на ШИМ очень сложно. Я не говорю даже о том, что у ШИМ изза свойств емкостного заряда сильно плывет линейность, так что это приходится учитывать.

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

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

Теоретически, разрядность можно повышать практически до бесконечности. На практике же, уже на десятом разряде возникают проблемы из-за сопротивления ключей, что сказывается на точности и , главное, линейности выходных данных. Но в подавляющем большинстве случаев восьми разрядов хватает за глаза. Тем более их где то еще надо найти, это же целых 8 линий I/O которые надо урвать.

Также не помешает добавить операционный усилитель, включенный повторителем. Чтобы сопротивление нагрузки не вносило искажений. Я поначалу впаял OP07, но получил облом — у меня отрезало все, что ниже 2.5 вольт. Слишком маленькое напряжение питания. Тут нужен усилитель который может работать в режиме Rail-2-Rail то есть выдавать на выходе сигнал с амплитудой от плюса до минуса питания, с минимальным отклонением. При добавлении ОУ, надо учитывать тот факт, что почти у всех операционников максимальное выходное напряжение резко заваливается с ростом частоты — параметр Max Output Swing vs Freq. это показывает. Например, для LM324 выглядит так:

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

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

Первым делом, выдал синус. Синус у меня чисто табличный. 256 значений, саму таблицу нарыл в инете. Функция получилась гладенькая. Прям заглядение.

Читайте также:  Купить ремкомплект рулевой рейки NISSAN PRIMERA (P12) RK - Мир сальников - АвтоВызов

Пробовал брать каждое второе значение из таблицы (при этом она ужалась до 128 значений) — тоже все очень красивое. И лишь когда стал брать чуть ли не каждое 16е значение, то тогда стали заметны лесенки на функции:

И то их можно было сгладить фильтром и опять будет красота. Зато на 8ми мегагерцовой Меге удалось добиться 20кГц синусоидального сигнала 🙂

Вот такой код получился, точнее это фрагмент.

Sine: SetTask TS_Sine ; Повторный вызов через API RTOS. Тут не имеет значения LDS Counter,SinCT ; Загрузить из памяти текущее значение указателя Loop: WDR ; Сброс собаки LDPA Sinus ; Макрос, загружающий в Z адрес таблицы с синусом CLR OSRG ; Сбрасываем рабочий регистр ADD ZL,Counter ; Вычисляем смещение по адресу таблицы ADC ZH,OSRG LPM OSRG,Z ; Грузим в рабочий регистр из таблицы байт OUT PORTD,OSRG ; Выдаем его в порт INC Counter ; Увеличиваем счетчик STS SinCT,Counter ; Сохраняем значение счетчика в память RJMP Loop ; Переход RET ; Так как таблица на 256 значений, то проверку счетчика на переполнение делать не надо, он сам, достчитав до 255, ; обнулится. ; А эта та самая таблица Sinus: .DB 64,65,67,68,70,72,73,75 .DB 76,78,79,81,82,84,85,87 .DB 88,90,91,92,94,95,97,98 .DB 99,100,102,103,104,105,107,108 .DB 109,110,111,112,113,114,115,116 .DB 117,118,118,119,120,121,121,122 .DB 123,123,124,124,125,125,126,126 .DB 126,127,127,127,127,127,127,127 .DB 128,127,127,127,127,127,127,127 .DB 126,126,126,125,125,124,124,123 .DB 123,122,121,121,120,119,118,118 .DB 117,116,115,114,113,112,111,110 .DB 109,108,107,105,104,103,102,100 .DB 99,98,97,95,94,92,91,90 .DB 88,87,85,84,82,81,79,78 .DB 76,75,73,72,70,68,67,65 .DB 64,62,61,59,58,56,54,53 .DB 51,50,48,47,45,44,42,41 .DB 39,38,36,35,34,32,31,30 .DB 28,27,26,25,23,22,21,20 .DB 19,18,17,15,14,13,13,12 .DB 11,10,9,8,8,7,6,5 .DB 5,4,4,3,3,2,2,2 .DB 1,1,1,0,0,0,0,0 .DB 0,0,0,0,0,0,1,1 .DB 1,2,2,2,3,3,4,4 .DB 5,5,6,7,8,8,9,10 .DB 11,12,13,13,14,15,17,18 .DB 19,20,21,22,23,25,26,27 .DB 28,30,31,32,34,35,36,38 .DB 39,41,42,44,45,47,48,50 .DB 51,53,54,56,58,59,61,62

  • Схема преобразователя. Формат Sprint Layout
  • Проект с программой для Mega8

З.Ы.
Но синус это не прикольно. В конце концов, его можно и аналоговыми методами получить не сильно напрягаясь. А с ЦАП можно по таблицам задать любую форму. Вот, например,

А это рок концерт. Вид со сцены.

А напоследок, дабы меня не упрекали что тема сисек не раскрыта…

R2Racing – это компания, созданная энтузиастами тюнинга автомобилей

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

Основное направление деятельности R2Racing это тюнинг и техническое обслуживание автомобилей, естественно мы занимаемся и поставкой запчастей. За нашими плечами богатый опыт тюнинга автомобилей марок Honda, Nissan, Toyota, Aston Martin, Bentley, Dodge и других производителей авто, но, конечно же, особое внимание мы уделяем автомобилям Хонда и Ниссан – с этого начинали.

Мы можем не только подготовить автомобиль с точки зрения механики двигателя и подвески, но и настроить мотор на наиболее приемлемом для стоящей задачи блоке управления (Vi-PEC, AEM, Hondata, UniChip, UpRev) на собственном диностенде. Ежедневный опыт настройки моторов и увеличения мощности двигателей для моторспорта весьма помогает в оптимальном выборе комплектующих для тюнинг-проектов.

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

Основной специализацией R2Racing является подготовка двигателей для автоспорта с последующей настройкой на диностенде. Принципы увеличения мощности одинаково применимы к любому двигателю, но, чем эффективней мотор от рождения, тем благодарнее он будет к тюнингу. Именно поэтому мы по большей части занимаемся моторами Honda / Acura и Nissan / Infiniti. Не так много в мире серийных машин, выдающих более, чем 110 лс с одного литра объема в атмосферном варианте…… Перейти

Читайте также:  Нива особенности решетки радиатора - Ремонт и тюнинг Шевроле

Мощностной стенд Dyno Dynamics, несмотря на небольшие барабаны, обеспечивает отсутствие пробуксовки даже для очень мощных автомобилей. Это достигается наличием Square cut knurl Roller surface (квадратная насечка на барабане) и Heavy duty traction control system (Динамический контроль букса).

Через наш стенд прошли такие мощностные машины , как Dodge Viper Pro-Charger 1250 Nm и Toyota Soarer 985 hp.… Перейти

Да, мы занимаемся чип-тюнингом, но не в укоренившимся понимании этого слова. Мы не заливаем сделанные неизвестно кем чужие прошивки, мы пишем свои программы на базисе немалого опыта в настройке гоночных моторов и используя диностенд Dyno Dynamics. Программа пишется на основе заводской прошивки, и мы меняем только те параметры, которые считаем нужным. Зная, как все устроено внутри прошивки, мы в состоянии подкорректировать ее именно под конкретный сетап. Основное наше оборудование – DIM Sport, Piasini, AlienTech (Италия).… Перейти

R 2R ЦАП. Практическое применение

Для преобразования цифрового сигнала в аналоговый, используют устройства под названием цифро-аналоговые преобразователи. Как правило, они существуют в виде отдельных микросхем которые порой труднодоставаемы. Если к ЦАПу не предъявляются серьёзные требования, то его можно сделать самостоятельно из обычных резисторов. Называется такой ЦАП — R 2R. Своё название он получил из-за номиналов применяемых в нём резисторов с сопротивлениями R и 2*R. Сопротивления по идее могут быть любыми, но в разумных пределах разумеется. Если поставить очень большие например по несколько мегаом, то нагрузка которая подключена к выходу, внесет существенные искажения в сигнал. Напряжение начнёт проседать. Я взял резисторы с сопротивлениями 1Ком и 2Ком (просто первое что попалось под руку). Hint: Если есть много резисторов одного сопротивления, то получить сопротивление вдвое меньшее, можно просто запараллелив два одинаковых резистора. Для такого ЦАПа желательно использовать резисторы с 1%-м допуском. У меня к сожалению таких не нашлось, и я использовал обычные. На моей отладочной плате этот ЦАП выглядит так:

Как оно работает
Каждый вход ЦАПа имеет свой «вес». Входы расположены в порядке уменьшения веса слева направо. Т.е. левый вход оказывает самое большое влияние на выходной сигнал следующий за ним вдвое меньше итд. Ну а самый последний (правый) вход изменяет выходной сигнал на ничтожные милливольты. Если известна комбинация бит поступающая на вход ЦАПа, то рассчитать напряжение очень легко. Предположим, что на входе у нас число 10010101 тогда выходное напряжение можно рассчитать по формуле

Uвых=Uпит * (1 * 1/2 + * 1/4 + *1/8+ 1*1/16 +*1/32+1*1/64+*1/128+1*1/256)

Формула простая, и мозг ни кому взорвать не должна. Согласно ей, напряжение на выходе будет равно 2.91 вольта. Uпит — напряжение питания микроконтроллера. При расчете использовалось значение 5 вольт. Таким образом, восьмибитный ЦАП способен выдать 256 различных напряжений с шагом около 20 милливольт, что вполне неплохо.

Применение
Применений у данного данного ЦАПа несколько. К примеру можно сделать генератор сигналов различной формы. Например пилы:

Читайте также:  Проверка комплектации по vin коду bmw, Вин код автомобиля декодер, Идентификация vin мерседес, Прове

или скажем треугольника:

ну или можно вывести сигнал эротической экзотической формы:

А можно еще выводить звук. Звук конечно не самого хорошего качества, но для создания какого-нибудь дверного звонка, его вполне достаточно. Проще всего воспроизводить звук формата WAV т.к. он не сжат ни какими аудиокодеками и не потребуется его декодировать перед воспроизведением. Из-за того что звук ни чем не сжат, размер звукового файла не внушает оптимизма. Во флеш микроконтроллера много не влезет. Для эксперимента по выводу звука через ЦАП было решено заюзать SD карту памяти на 2 гб. Не буду рассказывать всех тонкостей работы с картой, (возможно напишу об этом подробно в следующий раз) хочу лишь дать возможность оценить качество звучания такого ЦАПа (звук 8 бит 16 кГц моно):

Преимущества и недостатки
К преимуществам можно отнести:

  • Возможность увеличения разрядности
  • Неплохая частота дискретизации
  • Схемотехническая простота и повторяемость

Недостатки тоже есть :

  • Качество ЦАПа сильно зависит от применяемых резисторов
  • Сопротивление ключей порта микроконтроллера вносят искажения
  • Громоздкость на плате

Благодарности
Спасибо DiHalt’у за функцию выводящую последнюю осциллограмму 😉

R 2R ЦАП. Практическое применение: 28 комментариев

Хех.. Лучше ещё добавь нормальную запись звука с ЦАПа:)
Например повесить вывод ЦАПа на вход микрофона и записать и дать прослушать чтобы можно было понять:)

Я сначала так и хотел, но джека не нашлось к сожалению.

я вообше думал что услышу 8 бит музыку
типо: «дырынь тынь тынь» )))

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

А он и забирает. Последние разряды вообще почти ничего не решают =)

дааа, помню самопальные «звуковухи», сделанные по такому принципу… вешались на LPT-порт.
есть одно «но» — так как выходное сопротивление этой схемы больше, чем хотелось бы, буфер на выходе явно не помешает.
касательно искажений — ну, до 8 бит звучит вполне ничего так. 🙂 и работает быстро. для улучшения характеристик можно использовать 1% резисторы, что обычно и делают.

Звуковуха не ковокс называлась?

Вот Вы заняли 8 ног микроконтроллера, и ножками дергаете. На мой взгляд, неэффективное рещение. Гораздо рациональнее было бы использовать ШИМ с усреднением через фильтр. А тут уже простор для фантазии: точность большая не нужна — берем RC-фильтр, а поточнее — можно Баттерворта 4 порядка рассчитать. Благо информации по ним хватает.

Зато при помощи r2r ЦАПа можно получить неплохие частоты выходного сигнала. Но на счёт большого кол-ва занимаемых ног это минус.

почему не шим- на мой взгляд эта схема гораздо меньше потребляет тока.. да и сигнал глаже шима полюбому.. иногда надо не только музыку слушать но и задавать точные напряжения без помех от шима.
еще один неявный плюс этой схемы экономия одного таймера.
что касается съедания старшими нолями младших едениц, то можно просто переводить выводы в z-состояние.
еще один вариант использования данной схемы-довольно таки высокоскоростной АЦп: если подключить его к компаратору.
В общем, мне схема понравилась. сразу вспомнил молодость и первые ковоксы.

Приветик, а кто может подсказать программный код для данного приборчика)).

Ссылка на основную публикацию
Adblock detector