АЦП последовательного приближения
Аналого-цифровой преобразователь последовательного приближения
В данном примере рассматривается модель аналого-цифрового преобразователя последовательного приближения. В модели представлена возможность изменения вида оцифровываемых сигналов, их частот, амплитуд и других параметров. АЦП последовательного приближения являются средними по скорости оцифровки сигнала - быстрее сигма-дельта АЦП и медленее параллельных, и при этом имеют высокое разрешение вплоть до 16-20 бит, что немного меньше СД АЦП и намного больше параллельных. Сравнительно легкая реализация и, как результат, низкая стоимость с хорошей производительностью делает АЦП последовательного приближения одним из самых популярных выборов в промышленной и любительской электронике и радиотехнике.
Описание работы АЦП последовательного приближения
На рисунке ниже представлена структурная схема АЦП последовательного приближения:
АЦП начинается с устройства выборки и хранения, где происходит запоминание моментальных значений напряжения входного сигнала. Далее с полученной выборкой напряжения происходит процесс двоичного поиска - регистр последовательного приближения формирует код, соответствующий середине двоичной последовательности ("1" в старшем разряде и "0" в остальных). Этот код преобразуется в напряжение с помощью ЦАП, после чего это напряжение и выборка сравниваются. Если напряжение выборки оказывается больше напряжения ЦАП, то бит сохраняется, а если меньше, то бит меняется на "0", после чего следующий бит устанавливается в "1" и процесс повторяется заного. После установления значения самого младшего разряда получившаяся комбинация является оцифровкой одной выборки, после чего начинается процесс двоичного поиска для следующей выборки.
Пример
Пусть напряжение на входе АЦП Uвх = 1,7 В; опорное напряжение схемы Uоп = 2 В; разрядность АЦП N = 4.
Регистр последовательного приближения устанавливает значение на своих выходах 1000, что даст на выходе ЦАП напряжение Uцап = 1 В:
dec(1000) = 8;
8 / 16 * 2 = 1;
Это значение подается на компаратор, где сравнивается со входным: 1,7 > 1 - входное напряжение больше установленного, значит единица в старшем разряде сохраняется. Далее следующий разряд устанавливается в единицу:
1000 -> 1100;
dec(1100) = 12;
12 / 16 * 2 = 1,5;
1,7 > 1,5;
Uвх > Uцап, соответственно и у этого разряда сохраняется единица. Далее:
1100 -> 1110;
dec(1110) = 14;
14 / 16 * 2 = 1,75;
1,7 < 1,75;
Uвх < Uцап, соответственно у этого разряда значение возвращается в ноль. Последний разряд:
1100 -> 1101;
dec(1101) = 13;
13 / 16 * 2 = 1,625;
1,7 > 1,625;
Uвх > Uцап, соответственно и у этого разряда сохраняется единица. Итоговое значение на выходе АЦП составило 1101 (или 1,625 В в аналоговом эквиваленте). Точность можно повысить с помощью увеличения количества разрядов. В производимых заводами микросхемах АЦП последовательного приближения редко можно встретить разрядость меньше восьми.
Для корректной работы АЦП последовательного приближения входное напряжение не должно меняться все время процесса последовательного приближения, именно для этого в схеме необходимо устройство выборки и хранения. У регистра последовательного приближения существует выходной сигнал именуемый сигналом окночания преобразования (EOC, End of Conversion). Часто он подключается к тактовому входу устройства выборки и задержки, благодаря чему выборка следующего моментального входного напряжения происходит только после полного преобразования предыдущей выборки.
Данный вид АЦП имеет свои премущества, такие как низкая стоимость производства, возможность реализовать схему на кристалле малого размера, а также достаточно высокое разрешение. Из недостатков можно выделить не самую высокую скорость преобразования, что не даст производить оцифровку высокочастотных сигналов. Аналого-цифровые преобразователи последовательного приблежения являются самым популярным выбором в микроконтроллерах семейств STM32, ATmega и др.
Исследуемая модель представлена на рисунке ниже:
В данной модели вместо соединения выхода EOC с тактовым входом устройства выборки используется отдельный тактовый генератор с частотой, меньшей чем у тактов треобразования в N раз, где N - разряднось АЦП. С помощью переключателя можно выбрать вид подаваемого на вход АЦП сигнала - синусоидальный или пилообразный. Менять вид сигнала можно также из скрипта в данном примере. Блок "Уровень сигнала" задает усиление или ослабление входного сигнала.
Настройка окружения и запуск модели
Перед началом необходимо проинициализировать необходимые переменные и константы, а также подключить библиотеку для построения графиков:
engee.clear()
using Plots;
plotlyjs();
# время симуляции, с
Tsim = 0.0001 # @param {type:"number"}
# разрядность АЦП
Nbits = 24 # @param {type:"number"}
# частота дискритизации, Гц
Fs = 0.6e7 # @param {type:"number"}
# тактовая частота регистра последовательного приближения, Гц
ADC_clock = Fs * (Nbits + 1);
signalType = "Синусоидальный" # @param ["Синусоидальный", "Линейный нарастающий"]
sineSummary = "Одна гармоника" # @param ["Одна гармоника", "Сумма синусов"]
isSineSignal = signalType == "Синусоидальный" ? true : false;
isSummed = sineSummary == "Одна гармоника" ? false : true;
# первый синус (если включен)
# амплитуда, В
A1 = 0.25 # @param {type:"number"}
# частота, Гц
F1 = Fs / 128
# второй синус (если включен)
# амплитуда, В
A2 = 0.25 # @param {type:"number"}
# частота, Гц
F2 = Fs / 128
# усиление входного сигнала
gain = 1 # @param {type:"number"}
# коэффициент нелинейных искажений
k = 1 # @param {type:"number"}
Tsim - время симуляции, с
Nbits - разрядность АЦП
Fs - частота дискретизации, Гц
signalType - вид тестового сигнала (Синусоидальный или линейный нарастающий)
sineSummary - как будет представлен синусоидальный сигнал: в виде одного синуса или суммы двух
A1 и A2 - амплитуды синусов
gain - коэффициент усиления сигналов
k - коэффициент нелинейных искажений
Частоты синусов расчитываются автоматически исходя из частоты дискритизации и равны 1/128 части от нее.
Запуск модели:
modelName = "SAR_ADC";
model = engee.load("$(@__DIR__)/$(modelName).engee");
engee.set_param!(modelName * "/Ручной переключатель", "PortValue" => isSineSignal);
engee.set_param!(modelName * "/АЦП последовательного приближения", "bits" => Nbits);
engee.set_param!(modelName * "/АЦП последовательного приближения", "distortion" => k);
if(isSummed)
F2 = 0;
end
results = engee.run(modelName,verbose=true);
Осциллограммы входного сигнала и сигнала на выходе АЦП после обратного преобразования:
t = results["input"].time;
out = results["input"].value;
t2 = results["output"].time;
adc = results["output"].value;
Plots.plot(t, out, label="Вход", linewidth=3)
Plots.plot!(t2, adc, label="АЦП", linewidth=3)
Plots.plot!(title = "Осциллограммы", xlabel = "Время, с", ylabel = "Напряжение, В")
На временных диаграммах выше можно заметить, что сигнал на выходе АЦП после обратного преобразования схож по форме с входным сигналом, однако на его осциллограмме наблюдаются "ступеньки", характерные для оцифровованного сигнала, а также небольшой сдвиг по фазе, вызванный невысокой скоростью работы АЦП последовательного приближения.
Построим спектрограмму выходного сигнала:
using EngeeDSP
import EngeeDSP: spectrumAnalyzer
dataIN = collect(workspace_out)
dataADC = collect(workspace_out_1)
saInput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр входного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
saOutput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр выходного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
figIN = step!(saInput, vcat(dataIN[:,2]...))
figADC = step!(saOutput, vcat(dataADC[:,2]...))
display(figIN)
display(figADC)
По умолчанию в параметрах модели разрядность АЦП установлена равной 24 битам, благодоря чему выходной сигнал АЦП крайне схож с входным, что видно на осциллограммах и спектрограммах. Попробуйте уменьшить разрядность АЦП, например, до 8 бит:
Nbits = 8 # @param {type: "number"}
ADC_clock = Fs * (Nbits + 1); # тактовая частота регистра последовательного приближения, Гц
engee.set_param!(modelName * "/АЦП последовательного приближения", "bits" => Nbits);
results = engee.run(modelName,verbose=true);
t = results["input"].time;
out = results["input"].value;
t2 = results["output"].time;
adc = results["output"].value;
Plots.plot(t, out, label="Вход", linewidth=3)
Plots.plot!(t2, adc, label="АЦП", linewidth=3)
Plots.plot!(title = "Осциллограммы", xlabel = "Время, с", ylabel = "Напряжение, В")
Осциллограмма выходного сигнала имеет большее количество характерных ступенек, что лоигчно при уменьшении разрядности АЦП и, соответственно, уменьшению частоты дискритизации входного сигнала.
dataIN = collect(workspace_out)
dataADC = collect(workspace_out_1)
saInput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр входного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
saOutput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр выходного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
figIN = step!(saInput, vcat(dataIN[:,2]...))
figADC = step!(saOutput, vcat(dataADC[:,2]...))
display(figIN)
display(figADC)
На спектрограмме выходного сигнала даже невооруженным взглядом заметно увеличение уровня шума за счет меньшей разрядности АЦП и, соответственно, большего влияние шума квантования.
Также на спектрограмме входного сигнала можно заметить низкий уровень шумов, причем большая их часть появляется за счет дискритизации сигнала для спектрометра. Малошумящий генератор является одним из главных требований при тестировании аналого-цифровых преобразователей в соответствии с общепринятым стандартом IEEE 1241-2011.
Далее увеличим коэффициент нелинейных искажений и построим новые осциллограммы и спектрограммы:
k = 10 # @param {type: "number"}
Nbits = 24 # @param {type: "number"}
ADC_clock = Fs * (Nbits + 1); # тактовая частота регистра последовательного приближения, Гц
engee.set_param!(modelName * "/АЦП последовательного приближения", "bits" => Nbits);
engee.set_param!(modelName * "/АЦП последовательного приближения", "distortion" => k);
results = engee.run(modelName, verbose=true);
t = results["input"].time;
out = results["input"].value;
t2 = results["output"].time;
adc = results["output"].value;
Plots.plot(t, out, label="Вход", linewidth=3)
Plots.plot!(t2, adc, label="АЦП", linewidth=3)
Plots.plot!(title = "Осциллограммы", xlabel = "Время, с", ylabel = "Напряжение, В")
dataIN = collect(workspace_out)
dataADC = collect(workspace_out_1)
saInput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр входного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
saOutput = spectrumAnalyzer(
SampleRate = Fs,
PlotAsTwoSidedSpectrum = false,
ViewType = "spectrum",
Title = "Спектр выходного сигнала",
FrequencySpan = "start-and-stop-frequencies",
StartFrequency = 0,
StopFrequency = 5 * (F1 > F2 ? F1 : F2))
figIN = step!(saInput, vcat(dataIN[:,2]...))
figADC = step!(saOutput, vcat(dataADC[:,2]...))
display(figIN)
display(figADC)
Нелинейные искажения на осциллограмме отчетливо проявляются в виде ограничения сигнала сверху и снизу, в то время как на спектрограмме в области более высоких частот появляются неравномерности, свойственные искажениям.
Заключение
В данном примере была продемонстрирована работа аналого-цирового преобразователя последовательного приближения. Были представлены осциллограммы и спектрограммы входного тестового аналогового сигнала и выходного цифрового, но преобразованного обратно в аналоговый, для более наглядного сравнения.
Увеличение разрядности преобразователя увеличивает точность преобразования сигнала, т.к. АЦП может "распознать" больше различных напряжений на входе. Также за счет увеличения разрядности уменьшается уровень шумов квантования в выходном сигнале.
Уровень линейных искажений в схеме также существенно влияет на выходной сигнал.
Список использованной литературы
- Walt Kester. Mixed-signal and DSP design techniques. ISBN-0-916550-23-0
- Walt Kester, Dan Sheingold, James Bryant. Fundamentals of sampled data systems.
- James Bryant, Walt Kester. Data converter architectures.


