Ну, для начала - чем цифровой сигнал отличается от аналогового.
На аналоговый можно посмотреть воочию - например, это звуковая канавка на грампластинке. Или линия на экране осциллографа. Или вообще любой график на бумажке (почти любой). Это аналоговый сигнал, в нём каждому моменту времени соответствует какое-то определённое и, вообще говоря, любое значение сигнала.
Цифровой сигнал - это совокупность нулей и единиц (цифр), обозначающих какое-то число. Вот это число и соответствует значению сигнала в некоторый момент времени. В другой момент времени будет уже другое число.
И даже из этого примитивного введение понятны две вещи: во-первых, цифровой сигнал дискретен по времени: его отсчёты соответствуют только определённым моментам времени. Во все другие он предполагается неизменяющимся с момента последнего измерения. Во-вторых, он дискретен по амплитуде: мы же не можем представить цифровые данные с бесконечно высокой точностью, значит, там какое-то конечное число разрядов. А раз так, то этим ограниченным числом разрядом можно представить только ограниченное число возможных значений. Ну вот если у нас есть всего три десятичных разряда, то можно представить числа только от 0 до 999, всё. Чем точнее мы хотим иметь цифровые данные, тем больше нам нужно разрядов.
На практике это означает, что шкала преобразования (как Ц-А, так и А-Ц) всегда конечна - есть какой-то максимальный сигнал, который можно преобразовать. Всё, что больше, либо непредставимо (выходит за рязрядность устройства, если это цифра), либо не может быть адекватно преобразовано (если это аналоговый сигнал: он превышает максимально допустимый для данного АЦП).
Теперь к сабжу. Сперва - как из цифры получить (восстановить) аналоговый сигнал.
Для этого каждому разряду цифрового слова надо поставить в соответствие какой-то электрический сигнал с определённым "весом". Самому старшему разряду мы сопоставим сигнал, равный половине шкалы, следующему - равный четверти шкалы, ну и так далее, каждый следующий разряд вдвое меньше предыдущего. И тогда, если у нас есть какой-то двоичный код, то по нему, как по шаблону, можно взять нужные кирпичики и тем самым сгенерировать любой выходной аналоговый сигнал в пределах шкалы (полная шкала - когда все двоичные разряды - единицы).
Вот пусть есть такая цепь:
Она называется R-2R лестницей. Предположим, что все нижние концы находятся под потенциалом земли (это и на самом деле так; физическая реализация этого трюка сейчас не важна). Тут можно элементарно доказать, что ток, который протекает через каждый следующий резистор 2R, ровно вдвое меньше, чем через предыдущий.
Тогда понятно, что выбирая, какие ключи замкнуты, а какие разомкнуты, можно в выходной шине Iout1 создать любой ток (конечно, только из допустимого дискретного набора) в пределах от 0 до максимально возможного, который будет почти что равен Uref/2R. "Почти что" - потому что от Uref/2R он будет отличаться на ток, протекающей через самое последнее звено лестницы.
Вот таким замысловатым способом можно восстановить аналоговый сигнал из цифрового, и тем точнее, чем больше у нас звеньев лестницы (чем больше разрядов преобразования). Если цифровой код меняется достаточно быстро (гуглим теорему Котельникова), а разрядов достаточно много - например, 16 (как в CD), - то восстановление будет достаточно точным. А если после этого ЦАП поставить фильтр нижних частот, то он сгладит ступеньки в выходном сигнале.
Конечно, можно и по-другому реализовать цифро-аналоговое преобразование (например, иметь набор готовых токов, отличающихся в 2 раза, и суммировать эти токи - опять же через токовые ключи). Это будет токовый ЦАП, у него есть определённые плюсы.
<hr />
Теперь к обратной задаче: как из аналогового сигнала сделать цифровой.
Для начала - что такое компаратор. Это схемка, у которой есть два аналоговых входа (обозначаемых обычно + и -) и один цифровой выход. Работает он просто: если сигнал на входе + превышает сигнал на входе "-", то на выходе - лог. 1. Если меньше - лог. 0.
А-Ц преобразование делается сравнением входного сигнала с каким-то опорным. Самый простой метод - это АЦП прямого счёта. Вот пусть у нас есть интегратор, на который подаётся опорное напряжение, и счётчик импульсов от тактового генератора. Запустим в какой-то момент времени и интегратор, и счётчик. Выход интегратора будет линейно изменяться со временем (интеграл от константы). И компаратор сравнивает этот линейно изменяющийся сигнал с входным, аналоговым. В какой-то момент линейно нарастающий сигнал превысит входной, и опа! - компаратор сработает и остановит счётчик. Тем самым на счётчике заторчит код, который будет соответствовать значению входного сигнала.
Вуаля, задачка решена.
Конечно, тут сразу видны ограничения такого метода. Во-первых, он медленный. Всё то время, пока интегратор интегрирует, а счётчик считает, входной сигнал не должен меняться. Если у нас входной сигнал шустрый, быстро меняющийся (= с широкоим спектром), то реализовать такой АЦП практически невозможно.
Во-вторых, он неточный. Его точность зависит от параметров интегратора, а они зависят от температуры. Поэтому на практике применяют метод двойного интегрирования, когда сначала интегрируется входной сигнал, а потом на тот же интегратор подаётся опорный сигнал, но с противоположным знаком, и счётчик считает на этом обратном ходе. В момент, когда напряжение интегратора станет равным нулю, срабатывает компаратор.
Этот метод ещё медленее, но ровно так устроены АЦП почти всех мультиметров. Потому что там некуда торопиться :)
Для преобразования реальных сигналов звука или изображения применяются другие способы. Самые быстрые АЦП - это АЦП прямого преобразования. Вот рассмотрим ещё одну схемку:
Лестница из резисторов формирует набор уровней сравнения. На линейку компараторов (их до фига: для 10-разрядного преобразования нужно 1023 компаратора) поступают вот эти уровни сравнения - и входной сигнал. Понятно, что все компараторы, для которых входной сигнал превышает какой-то уровень, будут в состоянии "1", а все прочие - в состоянии "0". Такой код называется термометрическим. Поскольку на выходе нужен привычный двоичный код - ну, там, 8 или 10 разрядов, - то этот термометрический код нужно преобразовать - чем и занимается блок преобразователя кода.
Что тут можно сказать: что это самый быстрый способ преобразования. Цифровой код на выходе появляется через время задержки компаратора и время задержки преобразователя кода. Кроме того, тут не нужна никакая тактовая частота - код появляется и изменяется сам (на практике выходной цифровой сигнал тактируется, но по другим причинам). Но этот же способ и самый сложный - ведь с повышением разрядности на 1 сложность схемы (и мощность потребления!) увеличивается вдвое. Поэтому такие АЦП применяются крайне редко, когда скорость преобразования важнее цены, которую за это приходится платить.
Ну и масса разных прочих схем - АЦП с последовательным приближением, конвейерные, сигма-дельта... но подробный рассказ про это тут вряд ли уместен.
Да и 7000 знаков закончились...