Дельта-Сигма АЦП для МК на примере ATtiny2313
Автор: Куркин Алексей aka Gudd-Head В данной статье я попытаюсь объяснить принцип работы дельта-сигма (ДС, называемого также сигма-дельта) аналогово-цифрового преобразователя (АЦП) и показать, как его можно прикошачить к любому (как мне кажется) микроконтроллеру (МК). Почему в качестве МК была выбрана именно эта тинька? Просто потому, что она у меня завалялась, да ещё и в DIP-корпусе, удобном для макетирования! А ещё у неё нет встроенного АЦП. К тому же, судя по размеру посвящённой ей темы форума [1], она приобрела народную любовь. Плюс ко всему, буду стараться не использовать дорогие и труднодоставаемые компоненты. Современный ДС АЦП состоит из дельта-сигма модулятора и цифрового преобразователя — децимирующего цифрового фильтра, который, в свою очередь, состоит из фильтра нижних частот (ФНЧ) и дециматора (рис. 1) [2].
Рис.1. Структура дельта-сигма АЦП В отличие от АЦП других видов, в дельта-сигма АЦП отсчеты берутся не в точках дискретизации, а на интервалах и являются, следовательно, средними значениями преобразуемого сигнала на этих интервалах. Дискретизация сигнала происходит на частоте, значительно превышающую удвоенную верхнюю частоту спектра полезного сигнала (в десятки и сотни раз). Оба этих факта позволяют значительно понизить спектральную плотность средней мощности шума квантования в полосе полезного сигнала. Выходным сигналом преобразующего (децимирующего) фильтра, и, соответственно, АЦП в целом, является N-разрядный цифровой сигнал, частота следования отсчетов которого равна частоте передискретизации Fd, которая в М раз меньше тактовой частоты модулятора Fs (Fs=M·Fd). М называется коэффициентом децимации, причем обычно он выбирается таким образом, чтобы частота передискретизации была близка к удвоенной верхней частоте спектра полезного сигнала. Из соображений удобства аппаратной реализации фильтра обычно М выбирается равным 2^N, где N — целое. Преимуществом дельта-сигма АЦП перед другими типами АЦП также является тот факт, что, в соответствии с теоремой Котельникова, частотный спектр преобразуемого сигнала должен лежать диапазоне частот от 0 до Fd/2, поэтому на входе большинства АЦП других типов ставят ФНЧ с соответствующей полосой пропускания. Для ДС АЦП данное требование к фильтру ослаблено: при той же ширине спектра сигнала, его входная фильтрация может быть осуществлена с пологим спадом в пределах частот от Fd/2 до Fs/2 и, соответственно, фильтр не будет вносить существенных частотных и фазовых искажений в полосе пропускания. Лишь затем, в децимирующем фильтре осуществляется эффективная цифровая фильтрация с полосой пропускания от 0 до Fd/2. При этом число звеньев фильтра должно быть как минимум на единицу больше порядка модулятора. Простейший децимирующий фильтр мы реализуем программно в МК, а вот модулятор придётся сделать внешний. Рассмотрим структурную схему модулятора первого порядка (см. рис. 2) [3]. Модулятор представляет собой синхронизированный частотой дискретизации fтакт преобразователь «напряжение-частота» с непрерывным интегрированием и уравновешиванием заряда.
Рис.2. Структурная схема дельта-сигма модулятора первого порядка Порядок модулятора определяется количеством интеграторов и сумматоров. Увеличение порядка модулятора позволяет увеличить соотношение сигнал/шум. Работа этой схемы основана на вычитании из входного сигнала Uвх(t) величины сигнала на выходе цифро-аналогового преобразователя (ЦАП), полученной на предыдущем такте работы схемы. Полученная разность интегрируется, а затем преобразуется в код параллельным АЦП невысокой разрядности. Последовательность кодов поступает на цифровой фильтр нижних частот. В простейшем случае АЦП и ЦАП однобитные, т.е. АЦП представляет собой тактируемый компаратор, а ЦАП – «переключатель» между опорными напряжениями –Uоп и +Uоп (рис.3).
Рис.3. Структурная схема простейшего дельта-сигма АЦП первого порядка Итак, нам необходимы аналоговые сумматор/вычитатель и интегратор, тактируемый компаратор, однобитный ЦАП и цифровой фильтр. Как уже говорилось выше, цифровой фильтр мы реализуем на МК. Компаратор есть у тиньки, однако не будем к нему привязываться, т.к. у других МК его нет (к тому же, как будет показано далее, он всё равно не подойдёт). Сумматор/вычитатель реализуем на операционном усилителе (ОУ), на нём же сделаем и интегратор по классическим схемам [4]. Получается что-то похожее на рис.4. Входной сигнал подаётся на R1, напряжение с выхода АЦП — на R3. Да, ещё хорошо бы добавить перед R1 повторитель — можно, опять же, на ОУ — для увеличения входного сопротивления. Итого нам потребуется как минимум 3 операционника.
Рис.4. Сумматор/вычитатель и интегратор ДСМ Будем считать, что оцифровываемый входной сигнал у нас неотрицательный. В качестве отрицательного опорного напряжения –Uоп возьмём потенциал общего провода — 0 В. За положительное опорное напряжение +Uоп примем напряжение питание контроллера. Тогда в качестве однобитного ЦАПа будем использовать порт вывода контроллера.Проанализируем возможные напряжения в узлах схемы, изображённой на рис.4. Входной сигнал, равно как и напряжение на выходе ЦАПа лежит в диапазоне 0…+Uоп. Значит, на входе интегратора следует ожидать напряжение от –Uоп до +Uоп. Интегратор у нас инвертирующий, но это не страшно, т.к. это можно учесть простой сменой полярности компаратора. К сожалению, входы контроллера не переносят отрицательного напряжения, поэтому не получится использовать встроенный в 2313 компаратор. Однако, компаратор элементарно организовать — да! — опять же, на ОУ. Итого получается ровно 4 опера. Почему ровно? Да потому что они выпускаются по 4 шт. в одном 14-ти выводном корпусе! Экономия площади печатной платы (ПП). Хотя, наверное, 4 корпуса microSOT23-5 могут быть и меньше. Но счетверённый ОУ есть у меня в корпусе DIP! Однако у всех четырёх операционников питание одинаковое. А это значит, что на выходе компаратора на ОУ мы будем иметь ±Uоп. Причём +Uоп соответствует логической единице, а –Uоп — логическому нулю. Чтобы не сжечь порт микроконтроллера отрицательным напряжением с выхода ОУ, поставим между ними быстродействующий диод (например, 1N4148: время переключения 4 нс [5]) и на всякий случай притянем порт к земле резистором (т.н. «pull-down») для разряда всяких гадких паразитных емкостей, чтобы МК корректно отрабатывал логический «0». Номиналы резисторов?.. Возьмём, к примеру, 10 кОм: не много и не мало для цифровой техники. Номинал конденсатора обсудим позже. Полученная схема изображена на рис.5. На схеме не показаны цепи питания и т.п. Рис.5. Сумматор/вычитатель, интегратор и компаратор ДСМ На неинвертирующий вход ОР1 подаётся входное аналоговое напряжение, на R3 — сигнал с выхода контроллера, а сигнал с D1 и R6 заводится в МК. Для демонстрации того, как должен работать модулятор, я набросал его блок-схему (рис.6) в пакете Simulink программы Matlab.
Рис.6. Блок-схема ДСМ в программе Simulink Назначение блоков схемы, изображённой на рисунке 6, слева направо: Ramp и Quantizer — источник линейно нарастающего сигнала и квантователь являются источником входного сигнала «лесенка»; сумматор/вычитатель (ОР2 на рис.5); Gain1 и Integrator— интегратор (ОР3 на рис.5, с помощью усилителя Gain1 задаётся постоянная времени интегрирования R5·С1); Sign — компаратор (ОР4 на рис.5); Saturation — ограничитель (отрицательного) сигнала (на рис.5 его роль выполняет диод D1); Gain2 — усилитель, для наглядности масштабирует сигнал; Zero-Order Hold — устройство выборки-хранения, совместно с компаратором Sign образуют «тактируемый компаратор» (однако тактового входа как такового у него нет, считаем что он работает на одной определённой частоте), его роль будет выполнять МК. Для наблюдения за сигналами подключен виртуальный трёхканальный осциллограф Scope, его осциллограмма приведена на рисунке 7.
Рис.7. Осциллограмма работы схемы, изображённой на рис.6 Первый канал показывает ступенчато нарастающий входной сигнал, на второй канал заводится сигнал с выхода интегратора, а на третий — с выхода модулятора. Из рисунка видно, что максимальное (по абсолютному значению) напряжение на выходе интегратора появляется при максимальном/минимальном входном напряжении, т.к. в этом случае на входе интегратора присутствует напряжение ±Uоп. Интегратор будет работать в линейном режиме, если в течение одного такта ДСМ при максимальном напряжении на входе, на выходе оно не превысит паспортное значение максимально возможного выходного напряжения операционного усилителя Umax (ОР3 на рис.5). Другими словами, критерием выбора С1 (на рис.5) является выполнение неравенства
, где Тдсм — длительность одного такта модулятора (Тдсм = 1/fтакт = 1/Fs). При этом не следует брать С1 намного бОльшим, т.к. при этом увеличивается постоянная интегрирования, и напряжение на выходе интегратора будет колебаться в районе нуля с маленькой амплитудой. Как следствие, сильнее будут проявляться неидеальности ОУ: напряжение смещения, входные токи смещения и их разность и т.п. На мой взгляд, С1 следует выбрать таким, чтобы за один такт модулятора напряжение на выходе интегратора нарастало на 85…95% от Umax. Сигнал на выходе модулятора чем-то похож на результат широтно-импульсной модуляции (ШИМ), но с шириной импульса кратной длительности одного тактового импульса. Опорное «напряжение» схемы, изображённой на рис.6 (для наглядности назовём сигнал напряжением, однако сама модель инвариантна к природе сигнала: он может быть даже цифровым) равно 5 В, первая ступенька имеет величину 1 В, т.е. входной сигнал равен 1/5·Uоп. Такое простое соотношение приводит к тому, что четыре такта модулятор выдаёт «0», и каждый пятый такт «1». С точностью, да наоборот происходит когда выходной сигнал равен 4 В, т.е. 4/5·Uоп. В этих двух случаях отличий от классической ШИМ нет. Когда на входе 2 или 3 вольта, на выходе модулятора соответственно две или три «1» из любых пяти бит (идущих подряд тактов). Но! Обратите внимание: они по возможности чередуются с нулями, в то время как обычная ШИМ дала бы последовательности «11000» и «11100» соответственно. Другими словами, происходит больше переключений между «0» и «1», т.е. выходной сигнал модулятора содержит больше высокочастотных составляющих, которые легче отфильтровать! Говоря умным языком, применение такой структуры модулятора приводит к появлению т.н. эффекта вытеснения шума квантования в область высоких частот. В качестве примера на рис.8 показана оценка спектральной плотности средней мощности (СПСМ) сигнала одноразрядного ДСМ второго порядка, имеющего тактовую частоту 100 МГц, при частоте входного сигнала 24,4 кГц (длительность выборки 2^20) [2]. Сопоставляя две эти цифры: тактовую 100 МГц (!) и сигнал «всего лишь» 24 кГц, можно закатать губу на то, что в итоге мы получим точный и при этом быстрый АЦП.
Рис.8. СПСМ выходного сигнала ДС модулятора и ИКМ АЦП той же разрядности Видно, что в отличие от импульсно-кодовых АЦП (ИКМ АЦП), СПСМ шума квантования носит не равномерный характер, а увеличивается с ростом частоты. При этом в низкочастотной области спектра СПСМ шума квантования значительно ниже, чем у импульсно-кодовых АЦП с той же разрядностью и частотой дискретизации. Подавляя высокочастотные компоненты шума квантования с помощью ФНЧ, можно получить на выходе АЦП цифровой сигнал с высоким отношением сигнал/шум, т.е. с высокой разрядностью. Итак, нам необходимо реализовать цифровой децимирующий фильтр. Tiny2313 является «всего лишь» 8-ми разрядным контроллером с сокращённым набором команд (по-буржуйски RISC) [6], т.е. далеко не цифровой сигнальный процессор (DSP), у которого уже есть набор готовых команд для цифровой фильтрации. Так что придётся немного поизгаляться. Фильтр работает на тактовой частоте модулятора, поэтому он должен обладать достаточно простой структурой, так что реализуем ФНЧ с конечной импульсной характеристикой (КИХ). Одним из возможных решений является решение использовать ФНЧ, не имеющий в своем составе умножителей, такой тип фильтр в англоязычной литературе получил название sinc-фильтров, поскольку АЧХ фильтра пропорциональна sin(ωt)/ωt:
(1). Передаточная характеристика фильтра в Z-области:
(2). Хотел написать что-то вроде «из (2) видно, что»… Но, думаю, видно будет далеко не многим. Если попробовать объяснить в двух словах, то z^(-i) — это входной сигнал, задержанный на i тактов. Т.е. нам необходимо просуммировать М значений сигнала, задержанного на 0, 1, …, N-2, N-1 тактов. В классической аппаратной реализации это делается с помощью подобия последовательно-параллельного регистра сдвига и сумматора (см. рис.9).
Рис.9. Структурная схема sinc-фильтра В общем случае, выходной сигнал Y[n] меняется с каждым тактом входного. Очевидно, что разрядность Y[n] выше, чем X[n]. Применительно к нашему случаю, разрядность входного сигнала (с выхода ДСМ) равна единице. Максимальный выходной сигнал будет в том случае, когда на входе будет последовательность единиц. При этом в сумматоре будет число N, для представления которого необходимо L разрядов (2^L > N). Реализовать такой фильтр высокого порядка непосредственно в МК достаточно проблематично. Однако если вспомнить, что следом за фильтром у нас идёт дециматор, то всё значительно упрощается. Если коэффициент децимации М у нас будет равняться числу входов сумматора N, то в качестве сумматора можно будет использовать аккумулятор (рис.10)!
Рис.10. Структурная схема аккумулятора Реализовать аккумулятор в МК достаточно просто: надо лишь прибавлять значение входного сигнала к содержимому какого-либо регистра. А процесс децимации будет заключаться в том, чтобы каждые М тактов (после прихода М бит) X[n] выдавать значение Y[n] разрядности L и обнулять аккумулятор. На рисунке 11 показана амплитудно-частотная характеристика (АЧХ) такого фильтра при М = 65535 (MathCAD подвисал почти на три минуты чтобы построить такое).
Рис.11. АЧХ sinc-фильтра при N = 65535 Итак, вырисовывается следующий алгоритм работы МК: 0) инициализация; 1) считываем бит с выхода модулятора; 2) передаём его значение на выход; 3) прибавляем этот бит к значению аккумулятора; 4) увеличиваем значение счётчика; 5) если счётчик не дотикал до М, то переход к п.1; 6) получили результат в аккумуляторе. Минимальная инициализация включает в себя обнуление аккумулятора и счётчика. Как видно, на каждый такт модулятора уходит минимум 5 тактов микроконтроллера, а если учесть, что некоторые команды выполняются более одного такта, то и все 10 (десять)! При тактовой частоте МК 1 МГц на накопление 65535 отсчётов (раз преимуществом дельта-сигма АЦП является повышенная точность, попробуем проверить так ли это и получить разрешение 16 бит) у нас уйдёт две трети секунды!!! Хотя для вольтметра постоянного тока вполне сгодится. Рассмотрим теперь подробней каждый пункт, ориентируясь на ассемблер AVR. Будет рассмотрен наилучший случай с точки зрения быстродействия и занятости портов МК: использованы РА0 и РА1 ATtiny2313. Порт А трёхбитный, но старший бит используется в качестве ресета. Для остальных случаев будут даны рекомендации, а код закомментирован. 0. Один цикл работы 16-ти битного АЦП мне удалось впихнуть в 9 тактов МК (теоретически, можно уместиться в 8). На это у меня ушло 6 регистров: два под результат, два для счётчика, один для вычислений и один «нулевой» (не R0, а просто в нём всё время одни нули, т.е. 0b00000000). Счётчик декрементный, т.е. каждый такт модулятора уменьшает своё значение. Для счётчика необходимо выбрать пару регистров Rd+1:Rd, d={24, 26, 28, 30} (т.е. те, которые попадают под действие команд ADIW и SBIW). Я выбрал R24 и R25 чтобы не занимать регистры X, Y и Z. Пара регистров под результат — любая соседняя. Была выбрана пара R20 и R21. Для «нулевого» регистра подойдёт любой, выбран R0. Регистр для вычислений — любой из 16-ти старших регистров общего назначения (РОН), выбран R16. Итак, необходимо обнулить три регистра и установить два. Чтобы не запутаться, присвоим им имена. //подключаем заголовочный файл .include //обзываем регистры .def zeroreg = R0 ;нулевой регистр .def tmp = R16 ;для вычислений .def resultL = R20 ;младший байт результата .def resultH = R21 ;и старший .def countL = R24 ;младший байт счётчика .def countH = R25 ;и старший //настраиваем порты ввода-вывода SBI DDRA,0 ;портА.0 на выход //CBI DDRA,1 ;по умолчанию портА.1 настроен на вход //итак, поехали! ADC_start: ;ставим метку начала преобразования для удобства перехода NOP ;просто чтобы не забыть, ниже напишу зачем CLR zeroreg ;обнулили «нулевой» регистр //если R0 больше нигде не используется, то его достаточно обнулить один раз CLR resultL ;обнуляем результат CLR resultH ;(оба байта) SER countL ;устанавливаем счётчик, SER countH ;т.е. записываем в него $FFFF = 65535 1. Считываем бит с выхода модулятора. Тут всё просто: сохраняем в tmp значение регистра PINA. 1 такт. ADC_count: ;метка начала цикла фильтрации IN tmp, PINA ;считываем значение 2. Передаём значение принятого бита на выход, т.е. выполняем роль тактового компаратора. Сигнал от модулятора поступает на РА1, а в обратную связь заводится с РА0. Хочу сказать, что неспроста! Как уже говорилось, порт А у 2313 трёхбитный, вместо старшего бита функционирует сброс. Так что, во-первых, не надо бояться выставить что-нибудь не то, а во-вторых, достаточно потратить один такт и сдвинуть содержимое tmp на один разряд вправо и передать на выход (2-й и 3-й такты): LSR tmp ;сдвигаем вправо на один разряд OUT PORTA, tmp ;передаём значение на выход. Вот здесь можно сэкономить один такт, если передавать значение в другой порт (с другим буквенным индексом, но с тем же номером!), тогда не потребуется сдвига. Однако трогать другие порты мне не хотелось, поэтому задействован только порт А. 3. Прибавить значение принятого бита к аккумулятору. Ещё одна прелесть порта А у Тиньки в том, что старшие неиспользуемые биты читаются как нули. Поэтому не надо накладывать маску на tmp (имея в виду что-то вроде ANDI tmp, 0b00000001) чтобы не пролезли лишние единицы! А это экономия такта МК. Плюс ко всему, значение принятого бита у нас хранится в младшем разряде регистра. Нам не придётся тратить такты и сдвигать его! И это значит, что мы можем просто сложить значения двух регистров: tmp и аккумулятора. Хотя на самом деле всё не так просто: придётся суммировать двухбайтный регистр с однобайтным. Сделаем это в два захода: сначала сложим младший байт результата с регистром tmp (в котором хранится пришедший бит от дельта-сигма модулятора), а потом старший байт с флагом переноса С, если произошло переполнение. В списке команд Тиньки я не нашёл команду сложения регистра с флагом переноса, только сложение двух регистров с учётом флага переноса. Тут-то и потребуется «нулевой» регистр: сложим его с учётом переноса со старшим байтом результата. Если переполнения не было (С = 0), то значение countH не изменится. В противном случае увеличится на единицу (4-й и 5-й такты). //ANDI tmp, 0b00000001 ;в общем случае обнуление лишних единиц ADD resultL, tmp ;прибавляем значение принятого бита к младшему байту ADC resultH, zeroreg ;прибавляем флаг переноса (если есть) к старшему байту Если для ввода-вывода используется третий-четвёртый-пятый вывод порта, то для экономии времени вычислений теоретически есть смысл не сдвигать принятый бит в младший разряд, а использовать для результата три байта (регистры: resultL, resultM, resultH). Т.е. по-прежнему сложить принятый бит с младшим байтом результата (ADD resultL, tmp), но потом два раза сложить с учётом флага переноса средний и старший байты (ADC resultM, zeroreg; ADC resultH, zeroreg) c «нулевым» регистром. А по окончании преобразования просто сдвинуть значащие 16 бит в какие-либо два регистра. 4. Инкремент/декремент счётчика. Тут тоже ничего особенного. На этот раз есть команды сложения/вычитания слова (двухбайтного числа) с константой. Однако, при желании увеличить разрядность, надо будет подумать (6-й и 7-й такты). SBIW countL, 1 ;декремент двухбайтного счётчика 5. Проверка условия окончания преобразования. Поскольку счётчик декрементный, то если его значение не равно нулю, то переходим к п.1, т.е. к метке ADC_count (8-й и 9-й такты). BRNE ADC_count ;переход на метку ADC_count, если не ноль 6. Итак, в resultH и resultL получили результат. Всё, далее можем делать с ним всё, что хотим. В самом начале, после метки ADC_start, мы поставили «нопчик». На место этого NOP’a можно поставить что-нибудь полезное. Например, глобально запретить прерывания, если они разрешены (CLI). Потому что любой незапланированный выход из цикла преобразования сведёт всю точность на нет. Может быть, кому-нибудь захочется поджечь светодиодик на время преобразования или ещё что. Ну и кое-что ещё… Поскольку роль тактируемого компаратора у нас выполняет МК только в цикле преобразования, вне этого цикла внешняя схема (рис.5) «замирает». Это равносильно тому, что мы разрываем цепь отрицательной обратной связи (ООС), что приводит к уходу интегратора (ОР3 на рис.5) в насыщение до ±Umax. Следовательно, несколько первых тактов модулятор выходит из насыщения в рабочую область, и несколько первых бит могут внести ошибку в результат преобразования. Значит, до входа в цикл необходимо хотя бы попытаться вывести модулятор в рабочую область. Сделать это проще всего, проинвертировав сигнал, идущий от МК к ДСМ. Иными словами, необходимо считать значение выходного порта, проинвертировать его и снова отправить на выход, затем подождать, и только потом входить в цикл (метка ADC_count). Сколько времени ждать? Это зависит от входного сигнала. Однако, до начала преобразования мы о нём ничего не знаем. Рассмотрим экстремальные случаи. В первом случае после того, как мы дёрнем ногой МК, на входе интегратора будет максимально возможное (по модулю) напряжение, во втором — вдвое меньше, в третьем — минимально возможное. На рисунке 12 показана осциллограмма напряжения на выходе интегратора (в предположении, что он насытился до -Umax) для этих случаев.
Рис.12. К выбору длительности задержки По вертикали шкала нормирована на Umax, по горизонтали — на длительность одного такта ДСМ. Постоянная времени интегратора выбрана такой, чтобы за один такт напряжение нарастало не более, чем на 90% от Umax. Из рисунка видно, что если длительность задержки будет чуть больше (в данном случае на 10%) длительности двух тактов модулятора, то на момент входа в цикл преобразования напряжение на выходе интегратора будет лежать в пределах от -Umax до +Umax. Таким образом, повысится точность измерений в районе Uоп/2. Итак, количество тактов задержки МК должно быть такое же, как в двух тактах модулятора плюс 5…15 процентов (зависит от постоянной времени интегратора). Код: LDI tmp, 0b00000001 ;т.к. младший разряд порта А настроен на выход, OUT PINA, tmp ;дёргаем ногой записью «1» в регистр PIN NOP ;задержки по вкусу, можно организовать цикл, … ;можно делать что-нибудь полезное: например, NOP ;обнулять/устанавливать регистры, запрещать прерывания Хотя если на что-то важное не будет хватать памяти на пару команд, это можно выкинуть. В железе всё это проверялось на макетной плате. Основная часть схемы показана на рис.13.
Рис.13. Основная часть схемы макетной платы для тестирования Операционник — TL084CN (входное сопротивление 10^12 Ом, т.е. миллион мегаом!!! [7]). Р1 — многооборотный, типа 3106. Питание (±5 В) — от двух телефонных зарядок, не очень стабилизированных. МК работает на частоте 500 кГц от встроенного генератора. Результат преобразования выводится на жидкокристаллический индикатор (ЖКИ) 0802 прямо в хексе. С такой прошивкой и схемой удалось добиться эффективного разрешения более 15 бит — младший разряд иногда «дёргается». Столь низкая частота тактирования МК связана с удобством отображения информации (данные обновляются примерно раз в секунду по окончании преобразования) и не самой высокой скоростью нарастания использованного ОУ (13 В/мкс). Самые высокие требования по быстродействию предъявляются к сумматору/вычитателю (ОР2 на рис.5 и 13): время его переключения должно быть много меньше длительности одного такта модулятора. Напоследок ещё одна фишка. Допустим, опорное напряжение (которое выдаёт контроллер, в данной схеме) у нас 4,789 В. Тогда если мы в счётчик вместо $FFFF (2^16 - 1) при инициализации запишем $BB12 (47890), то результат преобразования у нас будет сразу в десятых долях милливольта!!! Очень удобно, как мне кажется. Конечно, немного пострадает точность… но если сильно не злоупотреблять (хотя бы не опускаться ниже 2^15), то ничего страшного. С другой стороны, если таким образом сделать время измерения кратным 20 мс, то за счёт усреднения должно минимизироваться влияние электросети (50 Гц) на результат измерения. Итак, подведём итоги.
Достоинства: 1) простота аппаратной и программной реализации; 2) высокая разрешающая способность (зависит от времени преобразования); 3) дешевизна; 4) возможность программно установить код максимального числа (в т.ч. не равного 2^N-1); 5) толерантность к отрицательному входному напряжению.
Недостатки: 1) необходимость двуполярного напряжения питания; 2) медлительность (время преобразования пропорционально разрешающей способности).
Перспективы и пути дальнейшего развития. Было бы интересно поиграться с опорным напряжением: сделать его более стабильным и/или двуполярным (тогда можно было бы оцифровывать и отрицательные напряжения). Конечно же, раскочегарить МК до обещанных 20 МГц (с другим контроллером можно и больше) и посмотреть, как ведёт себя АЦП. Плюс ко всему, при необходимости одновременной оцифровки 2-х, 3-х или 4-х сигналов, это можно делать в одном цикле. Таким образом, время преобразования увеличится на 60, 120 и 170 процентов соответственно вместо 100, 200 и 300 процентов, если оцифровывать каждый сигнал по отдельности. Интересно было бы сделать нормальный децимирующий фильтр на ПЛИС или DSP. Тогда уже можно было бы говорить и про оцифровку переменного сигнала.
Ссылки/литература: 1. ВСЁ по прошивке и программированию AT90S2313/ATTiny2313 2. Уткин М.Н. Дипломная работа магистра "Разработка и исследование децимирующего фильтра с малой потребляемой мощностью для аналого-цифрового преобразователя", СПбГПУ, 2009 г., 89 с. 4. Применение операционных усилителей 5. 1N4148; 1N4448 High-speed diodes 6. 8-bit Microcontroller with 2K Bytes In-System Programmable Flash 7. General Purpose J-FET Quad Operational Amplifiers Все вопросы в Форум.
Эти статьи вам тоже могут пригодиться: |
|
|||||||||||||||
|
||||