Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лекция №11. Аналоговый компаратор. Аналогово-цифровой преобразователь.
Аналоговый компаратор. Общие сведения
Модуль аналогового компаратора входит в состав всех без исключения микроконтроллеров семейства Mega. Компаратор позволяет сравнивать значения напряжений, присутствующих на двух выводах микроконтроллера. Результатом сравнения является логическое значение, которое может быть прочитано из программы. По результату сравнения может быть сгенерировано прерывание, а также осуществлен захват состояния таймера/счетчика Т1.
Используемые компаратором выводы являются контактами портов ввода/вывода общего назначения (табл. 11).
Таблица 11. Выводы, используемые аналоговым компаратором
Чтобы указанные выводы можно было использовать с компаратором, они должны быть сконфигурированы как входы (соответствующий бит регистра DDRx установлен в 0). Необходимо также отключить внутренние подтягивающие резисторы путем записи лог. 0 в соответствующий бит регистра PORTx.
Функционирование компаратора
Структурная схема аналогового компаратора приведена на Рис. 12. Пунктирной линией обведены узлы, имеющиеся только в моделях с АЦП. ИОН источник опорного напряжения.
Рис. 12. Структурная схема аналогового компаратора
Основное управление компаратором и контроль его состояния осуществляются с помощью регистра ACSR.
Таблица 12. Размещение регистра ACSR
Формат регистра ACSR приведен на Рис. 13, а назначение его битов приведено в Табл. 13.
Рис. 13. Формат регистра ACSR
Таблица 13. Биты регистра ACSR
Если напряжение на выводе AIN0 (неинвертирующий вход) больше напряжения на выводе AIN1 (инвертирующий вход), то результат сравнения будет равен 1. В противном случае результат сравнения будет равен 0. Этот результат (состояние выхода компаратора) сохраняется в бите АСО регистра ACSR.
Если состояние выхода компаратора (бит АСО) изменилось заданным образом, устанавливается флаг прерывания ACI регистра ACSR и генерируется запрос на прерывание. Для разрешения прерывания необходимо установить в 1 бит ACIE регистра ACSR и флаг I регистра SREG.
Разряд ACD отвечает за включение и выключение компаратора. При подаче напряжения питания все разряды регистра ACSR сбрасываются в «0», компаратор включается автоматически при включении микроконтроллера. Для выключения компаратора разряд ACD следует установить в «1».
Какое именно изменение состояния выхода компаратора вызовет прерывание, определяется состоянием битов ACIS1:ACIS0 регистра ACSR согласно Табл. 14.
Таблица 14. Условия генерации запроса на прерывание от компаратора
Помимо генерации прерывания компаратор также может управлять схемой захвата таймера/счетчика Т1. Для этого необходимо установить бит ACIC регистра ACSR в 1. В результате выход компаратора подключится к схеме захвата вместо вывода ICP1 микроконтроллера. Если же бит ACIC сброшен в 0, компаратор полностью отключен от блока захвата таймера/счетчика.
Компаратор может сравнивать сигналы, присутствующие не только на выводах AIN0 и AIN1. Так, вместо вывода AIN0 микроконтроллера к неинвертирующему входу компаратора может быть подключен внутренний источник опорного напряжения (ИОН) величиной 1.22 ±0.1 В. Для этого необходимо установить в «1» разряд ACBG (AINBG в моделях ATmega161x) регистра ACSR. Причем если схема BOD выключена (BODEN = «1»), то между подключением ИОН к компаратору и началом использования компаратора необходимо выждать некоторое время (не более 100 мкс).
Контроль напряжения питания
Микроконтроллеры семейства Мega содержат встроенную схему контроля питания (BOD - Brown-out Detection, затемнение обнаружения), которая выполняет сравнение уровня VCC с фиксированным пороговым значением. Порог срабатывания схемы BOD может выбираться с помощью конфигурационного бита BODLEVEL. Порог равен 2.7В, когда BODLEVEL незапрограммирован, или 4.0В, когда BODLEVEL запрограммирован.
Схема BOD может быть включена или отключена с помощью конфигурационного бита BODEN. Если разрешена работа BOD (BODEN запрограммирован) и уровень VCC снизился ниже порога срабатывания (VBOT- на рисунке 26), то схема BOD переводит микроконтроллер в состояние сброса. Когда VCC достигает значения выше порога срабатывания (VBOT+ на рисунке 26), то запускается счетчик задержки и микроконтроллер начнет работу по истечении времени tTOUT.
Схема BOD реагирует на снижение VCC, если напряжение остается меньшим порога срабатывания дольше, чем период времени tBOD (см. табл. 19).
Рис. 26. Сброс микроконтроллера схемой контроля питания
На инвертирующий вход компаратора может также поступать сигнал с выхода мультиплексора модуля АЦП. То есть, вместо вывода AIN1 микроконтроллера инвертирующий вход компаратора может быть подключен к любому из входов АЦП ADC0…ADC7 (ADC0…ADC5 в моделях ATmega8x). Естественно, в моделях ATmega8515x, ATmega161x и ATmega162x, не имеющих модуля АЦП, эта возможность недоступна.
Подключение выхода мультиплексора АЦП ко входу компаратора осуществляется установкой в «1» разряда ACME регистра специальных функций SFIOR (3-й разряд регистра). Разумеется, модуль АЦП при этом должен быть выключен (разряд ADEN регистра ADCSRA сброшен в «0»). Какой именно из входов АЦП будет использоваться в качестве инвертирующего входа компаратора, определяется разрядами MUX2…0 регистра ADMUX, как показано в Табл. 2.110.
Таблица 2.110. Управление инвертрующим входом компаратора
Аналогово-цифровой преобразователь
Аналогово-цифровой преобразователь (АЦП) один из важных электронных компонентов в измерительном и тестовом оборудовании. АЦП преобразует напряжение (аналоговый сигнал) в код, над которым микропроцессор и программное обеспечение выполняют определенные действия. Даже если Вы работаете только с цифровыми сигналами, скорее всего Вы используете АЦП в составе осциллографа, чтобы узнать их аналоговые характеристики.
Аналого-цифровой преобразователь (АЦП, англ. Analog-to-digital converter, ADC) - устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал). Обратное преобразование осуществляется при помощи ЦАП (цифро-аналогового преобразователя, DAC). Как правило, АЦП - электронное устройство, преобразующее напряжение в двоичный цифровой код. Тем не менее, некоторые неэлектронные устройства с цифровым выходом, следует также относить к АЦП, например, некоторые типы преобразователей угол-код. Простейшим одноразрядным двоичным АЦП является компаратор.
Дискретизация, квантование, кодирование
Аналоговый сигнал является непрерывной функцией времени, в АЦП он преобразуется в последовательность цифровых значений. Сам процесс преобразования включает в себя три основные операции: дискретизацию, квантование и кодирование (рисунок 2).
Операция дискретизации состоит в том, что по заданному аналоговому сигналу S(t) (рисунок 2, a) строится дискретный сигнал S(nT), причем S(nT)=S(t). Физически такая операция эквивалентна мгновенной фиксации выборки из непрерывного сигнала S(t) в моменты времени t=nТ, после чего образуется последовательность выборочных значений {(S(nT)}.
Рис. 2. Аналого-цифровое преобразование: (а) исходный аналоговый сигнал; (б) - дискретизация; (в) квантование.
Такую дискретизацию на практике осуществить невозможно. Реальные устройства, запоминающие значения аналогового сигнала (они называются устройства выборки и хранения - УВХ), не в состоянии зафиксировать мгновенную выборку из непрерывного сигнала, так как время подключения УВХ к источнику сигнала всегда конечно. Кроме того, из-за не идеальности ключей и цепей заряда запоминающей емкости УВХ, значение взятой выборки S(nT) в той или иной степени отличается от величины исходного сигнала S(t). Тем не менее, в абстрактных рассуждениях равенство S(t) = S(nT) считается справедливым.
Поскольку дискретный сигнал S(nT) в моменты времени t=nТ сохраняет информацию об аналоговом сигнале S(t) и в спектре сигнала S(nT) содержится спектр сигнала S(t), то последний, очевидно, может быть восстановлен. То есть непрерывный сигнал S(t) может быть восстановлен по выборке S(nT). Для этого дискретный сигнал достаточно пропустить через фильтр низких частот, полоса которого соответствует полосе частот исходного сигнала.
Условие, при котором восстановление исходного сигнала S(t) по его дискретным значениям S(nT) будет возможным, сформулировано в известной теореме Котельникова (теорема отсчетов):
Если функция S(t) не содержит частот выше некоторой Fm, то она полностью определяется своими мгновенными значениями в моменты времени, отстоящими друг от друга на величину l/(2Fm), т.е.
,
где k - порядковый номер отсчета функции;
- шаг дискретизации по времени;
- мгновенные значения сигнала S(t) в k-ой отсчетной точке;
.
Из теоремы В.А. Котельникова следует, что для однозначного представления функции с ограниченным спектром на интервале времени Т достаточно иметь некоторые n значений этой функции, где .
При выполнении равенства (условия) непрерывная и дискретная функции обратимы между собой, т.е. тождественны. Таким образом, произвольный сигнал, спектр которого не содержит частот выше Fm, может быть представлен в виде последовательности импульсов, амплитуда которых равна значению исходного сигнала в дискретные моменты времени и интервалы между ними .
Эта предельно допустимая максимальная частота Fm в спектре сигнала называется частотой Найквиста Fн.
После того, как сигнал дискретизирован, производится его квантование и кодирование, что, собственно, и является основной операцией при аналого-цифровом преобразовании. На этом этапе по заданному дискретному сигналу S(nT) строится цифровой кодированный сигнал Sц(nT). Также, как и дискретный, цифровой сигнал описывается решетчатой функцией, но в данном случае эта решетчатая функция Sц(nT) является еще и квантованной, т.е. способной принимать лишь ряд дискретных значений, которые называются уровнями квантования (рисунок 2, в). Уровни квантования образуются путем разбиения всего диапазона, в котором изменяется аналоговый сигнал, на ряд участков, каждому из которых присваивается определённый номер. Эти номера кодируются заранее выбранным кодом, чаще всего двоичным, а их число N выбирается равным 2m, где m - разрядность кода.
Если сигнал однополярный, то все 2m уровней будут выражать положительные значения аналогового сигнала. Для двухполярного одна половина (2m/2=2m-1) уровней будет выражать отрицательные значения сигнала, другая (также 2m-1) - положительные.
Квантование может осуществляться двумя способами. Если расстояние между любыми двумя соседними уровнями, которое называется шагом квантования, будет одинаковым, то это линейное квантование. Способ, когда шаг квантования изменяется, - это нелинейное квантование. В дальнейшем будут рассмотрены линейные АЦП.
Поскольку реальные АЦП не могут произвести аналого-цифровое преобразование мгновенно, входное аналоговое значение должно удерживаться постоянным, по крайней мере от начала до конца процесса преобразования (этот интервал времени называют время преобразования).
В настоящее время выпускается большее число интегральных АЦП, которые отличаются конструктивной и функциональной закономерностью, но в основу работы АЦП в настоящее время заложены некоторые стандартные, фундаментальные принципы. При этом в структуре некоторых АЦП присутствует устройство УВХ, в других УВХ отсутствует.
Разрядность АЦП
Разрядность АЦП характеризует количество дискретных значений, которые преобразователь может выдать на выходе. В двоичных АЦП разрядность измеряется в битах. Разрядностью АЦП определяется и его разрешение - минимальное изменение величины входного аналогового сигнала, которое может быть зафиксировано данным АЦП.
АЦП преобразовывает сигнал (напряжение) находящийся в диапазоне измеряемых сигналов. Нижняя и верхняя граница этого диапазона определяются напряжениями, поданными на соответствующие выводы. Для микроконтроллера (МК) со встроенным АЦП, нижняя граница - это уровень GND (0 В), а верхняя - подается на отдельный вывод (AREF- Analog Reference) или используются внутренние источники опорных напряжений.
При диапазоне входных напряжений от 0 В до 5 В и использовании 10-битного АЦП мы имеем следующее разрешение АЦП (рис. 3). Т. е. АЦП в состоянии различить сигналы которые отличаются на 4,9 мВ. При увеличении сигнала на 4,9 мВ - результат преобразования увеличится на 1. Если для такого же диапазона входных сигналов использовать АЦП с большей разрядностью, то можно зафиксировать меньшие значения, т.е. получить более точное значение сигнала (на рисунке 4 представлены значения при использовании 24-битного АЦП).
Рис. 3. Разрешение 10-битного АЦП.
Рис. 4. Разрешение 24-битного АЦП.
При отсутствии различного рода ошибок, разрядность АЦП определяет теоретически возможную точность АЦП. На практике разрешение АЦП ограничено отношением сигнал/шум входного сигнала. При большой интенсивности шумов на входе АЦП различение соседних уровней входного сигнала становится невозможным, то есть ухудшается разрешение. При этом реально достижимое разрешение описывается эффективной разрядностью (Effective Number Of Bits- ENOB), которая меньше, чем реальная разрядность АЦП. При преобразовании сильно зашумлённого сигнала младшие разряды выходного кода практически бесполезны, так как содержат шум.
Параллельные АЦП
Большинство высокоскоростных осциллографов и некоторые высокочастотные измерительные приборы используют параллельные АЦП из-за их высокой скорости преобразования, которая может достигать 5Г (5 * 109) отсчетов/сек для стандартных устройств и 20Г отсчетов/сек для оригинальных разработок. Обычно параллельные АЦП имеют разрешение до 8 разрядов, но встречаются также 10-ти разрядные версии.
Рис. 5 показывает упрощенную блок-схему 3-х разрядного параллельного АЦП (для преобразователей с большим разрешением принцип работы сохраняется).
Рис. 5. АЦП параллельного преобразования.
На рис. 5 входное напряжение попадает в интервал между V3 и V4, таким образом, 4 нижних компаратора имеют на выходе "1", а верхние три компаратора - "0". Дешифратор преобразует (23 - 1) - разрядное цифровое слово с выходов компараторов в двоичный 3-х разрядный код.
Здесь используется массив компараторов, каждый из которых сравнивает входное напряжение с индивидуальным опорным напряжением. Такое опорное напряжение для каждого компаратора формируется на встроенном прецизионном резистивном делителе. Значения опорных напряжений начинаются со значения, равного половине младшего значащего разряда (LSB), и увеличиваются при переходе к каждому следующему компаратору с шагом, равным VREF/2 (Vref- опорное напряжение). В результате для 3-х разрядного АЦП требуется 23-1 или семь компараторов. А, например, для 8-разрядного параллельного АЦП потребуется уже 255 (или (28 - 1)) компараторов.
С увеличением входного напряжения компараторы последовательно устанавливают свои выходы в логическую единицу вместо логического нуля, начиная с компаратора, отвечающего за младший значащий разряд.
Состояния компараторов и выходной сигнал в зависимости от уровня входного напряжения можно увидеть в таблице 1.
Табл. 1. Состояние компараторов и выходные сигналы АЦП
Входное напряжение |
Входы дешифраторов (Д) |
Выходы Д |
||||||||
Uвx/Q |
К7 |
К6 |
К5 |
К4 |
К3 |
К2 |
K1 |
Q2 |
Q1 |
Q2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
3 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
4 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
5 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
6 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
7 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Способ параллельного кодирования обеспечивает наибольшую скорость преобразования, из-за чего его иногда называют способом «мгновенного кодирования». И действительно, время преобразования здесь всего один такт, и ограничено оно лишь быстродействием компараторов и задержкой на шифраторе.
Рис. 6. Структурная схема параллельного биполярного АЦП с синхронизацией шифратора
Для того, чтобы схема могла работать с биполярным сигналом, в месте подключения "земли" (рис. 5) подключается отрицательное опорное напряжение - Uоп. В состав параллельных АЦП входит большое число компараторов с разным быстродействием, то для синхронизации моментов формирования выходного кода шифратор стробируют сигналом частоты дискретизации (рис. 6).
Благодаря одновременной работе компараторов параллельный АЦП является самым быстрым. Например, восьмиразрядный преобразователь типа МАХ 104 позволяет получить 1 млрд. отсчетов в секунду при времени задержки прохождения сигнала не более 1,2 нс. Недостатком этой схемы является высокая сложность. Действительно, N-разрядный параллельный АЦП сдержит 2N-1 компараторов и 2N согласованных резисторов. Следствием этого является высокая стоимость (сотни долларов США) и значительная потребляемая мощность. Тот же МАХ 104, например, потребляет около 4 Вт.
АЦП последовательного приближения
Аналого-цифровой преобразователь последовательного приближения (SAR, Successive Approximation Register) измеряет величину входного сигнала, осуществляя ряд последовательных «взвешиваний», то есть сравнений величины входного напряжения с рядом величин, генерируемых методом дихотомии следующим образом:
1. на первом шаге на выходе встроенного цифро-аналогового преобразователя устанавливается величина, равная 1/2Uref (аналоговый входной сигнал находится в интервале (0 Uref).
2. если сигнал больше этой величины, то он сравнивается с напряжением, лежащим посередине оставшегося интервала, т.е., в данном случае, 3/4Uref. Если сигнал меньше установленного уровня, то следующее сравнение будет производиться с меньшей половиной оставшегося интервала (т.е. с уровнем 1/4Uref).
3. Шаг 2 повторяется N раз. Таким образом, N сравнений («взвешиваний») порождает N бит результата.
Рис. 2. Структурная схема АЦП последовательного приближения.
Рис. 1. Временные диаграммы напряжений на входах компаратора АЦП последовательного приближения
Таким образом, АЦП последовательного приближения состоит из следующих узлов:
1. Компаратор. Он сравнивает входную величину и текущее значение «весового» напряжения.
2. Цифро-аналоговый преобразователь (Digital to Analog Converter, DAC). Он генерирует «весовое» значение напряжения на основе поступающего на вход цифрового кода.
3. Регистр последовательного приближения (Successive Approximation Register, SAR). Он осуществляет алгоритм последовательного приближения, генерируя текущее значение кода, подающегося на вход ЦАП. По его названию названа вся данная архитектура АЦП.
4. Схема выборки-хранения (Sample/Hold, S/H). Для работы данного АЦП принципиально важно, чтобы входное напряжение сохраняло неизменную величину в течение всего цикла преобразования. Однако «реальные» сигналы имеют свойство изменяться во времени. Схема выборки-хранения «запоминает» текущее значение аналогового сигнала, и сохраняет его неизменным на протяжении всего цикла работы устройства.
Достоинством устройства является относительно высокая скорость преобразования: время преобразования N-битного АЦП составляет N тактов. Точность преобразования ограничена точностью внутреннего ЦАП и может составлять 16-18 бит (сейчас стали появляться и 24-битные SAR ADC, например, AD7766 и AD7767).
АЦП В микроконтроллерах ATmega
Модуль 10-разрядного АЦП последовательного приближения входит в состав моделей семейства mega (ATmega8x, ATmega16x, ATmega163x, ATmega32x, ATmega323x, ATmega64x и ATmega128x). Основные параметры этого АЦП следующие:
• абсолютная погрешность: ±2 МЗР;
• интегральная нелинейность: ±0.5 МЗР;
• быстродействие: до 15 тыс. выборок/с.
На входе модуля АЦП всех моделей имеется 8-канальный аналоговый мультиплексор, предоставляющий в распоряжение пользователя 8 каналов с несимметричными входами. Отдельно следует сказать о микроконтроллерах ATmega8x. Микроконтроллеры этой группы, выпускаемые в корпусе DIP-32, имеют только 6 каналов преобразования. Кроме того, во всех моделях ATmega8x два канала (ADC4 и ADC5) являются 8-разрядными.
В моделях ATmega16x, ATmega32x, ATmega64x, Atmega128x входы АЦП могут также объединяться попарно для формирования в общей сложности до 13 каналов с дифференциальным входом. Два канала при этом имеют возможность 20- и 200-кратного предварительного усиления входного сигнала.
Некоторые модели МК при работе с АЦП имеют возможность предварительно усиливать входной сигнал. При коэффициентах усиления 1x и 20x действительная разрешающая способность составляет 8 разрядов, а при коэффициенте усиления 200x - 7 разрядов.
В качестве источника опорного напряжения для АЦП может использоваться как напряжение питания микроконтроллера, так и внутренний либо внешний источник опорного напряжения.
В процессе работы АЦП может функционировать в двух режимах:
• режим одиночного преобразования, когда запуск каждого преобразования инициируется пользователем;
• режим непрерывного преобразования, когда запуск преобразований выполняется непрерывно через определенные интервалы времени.
Функционирование модуля АЦП
Структурная схема модуля АЦП приведена на Рис. 2.89. Элементы схемы, выделенные на рисунке серым цветом, и связанные с ними сигналы присутствуют только в моделях ATmega16x, ATmega32x, ATmega64x, ATmega128x. В остальных моделях неинвертирующий вход компаратора выборки/хранения подключен непосредственно к выходу мультиплексора (показано пунктиром).
Рис. 2.89. Структурная схема модуля АЦП.
Лекция №12. АЦП. Вольтметр на МК AVR
Регистры, используемые для управления модулем АЦП в различных моделях, приведены в Табл. 15.
Формат регистров ADCSRA (ADCSR) и ADMUX приведен на Рис. 15 и Рис. 16, а краткое описание функций их битов приведено в Табл. 16 и Табл. 17 соответственно.
Таблица 15. Регистры управления модулем АЦП
Рис. 15. Формат регистра ADCSRA (ADCSR)
Таблица 16. Биты регистра ADCSRA (ADCSR1)
Рис. 16. Формат регистра ADMUX
Таблица 17. Биты регистра ADMUX
Рис. 9.5. Регистр SFIOR
В моделях ATmega8x и ATmega128x режим работы АЦП (режим одиночного преобразования или режим непрерывного преобразования) определяется состоянием бита ADFR. Если он установлен в 1, АЦП работает в режиме непрерывного преобразования. В этом режиме запуск каждого следующего преобразования осуществляется автоматически после окончания текущего. Если же бит ADFR сброшен в 0, АЦП работает в режиме одиночного преобразования и запуск каждого преобразования осуществляется по команде пользователя.
Во всех моделях, кроме ATmega8x и ATmega128x, запуск АЦП возможен не только по команде пользователя, но и по прерыванию от некоторых периферийных устройств, имеющихся в составе микроконтроллера. Для выбора режима работы в этих моделях используется бит ADATE регистра ADCSRA и биты ADTDS2:0 регистра SFIOR или ADCSRB.
Если бит ADATE сброшен в 0, АЦП работает в режиме одиночного преобразования. Если же бит ADАTE установлен в 1, функционирование АЦП определяется содержимым битов ADTS2:0 согласно Табл. 18.
Таблица 18. Источник сигнала для запуска преобразования
В режимах одиночного и непрерывного преобразований цикл преобразования начинается по первому нарастающему фронту тактового сигнала после установки разряда ADSC. Если используется запуск по прерыванию, то цикл преобразования начинается по первому нарастающему фронту тактового сигнала после установки флага выбранного прерывания. Причем при установке этого флага осуществляется сброс предделителя модуля АЦП. Тем самым обеспечивается фиксированная задержка между генерацией запроса на прерывание и началом цикла преобразования.
Если АЦП работает в режиме непрерывного преобразования, новый цикл начнется сразу же после записи результата. В режиме одиночного преобразования новое преобразование может быть запущено сразу же после сброса разряда ADSC (до сохранения результата текущего преобразования). Однако реально цикл преобразования начнется не ранее чем через один такт после окончания текущего преобразования. Временные диаграммы, иллюстрирующие сказанное, приведены на Рис. 2.93.
Рис. 2.93. Временные диаграммы работы АЦП в режиме одиночного преобразования (а), в режиме запуска по прерыванию (б) и в режиме непрерывного преобразования (в)
При запуске первого преобразования после включения АЦП для выполнения преобразования потребуется 25 тактов, т. е. на 12 тактов больше, чем обычно. В течение этих 12 тактов выполняется «холостое» преобразование, инициализирующее АЦП (Рис. 2.94).
Рис. 2.94. Временные диаграммы работы АЦП при первом преобразовании (режим одиночного преобразования)
Для формирования тактовой частоты модуля АЦП в нем имеется отдельный предделитель. Коэффициент деления предделителя и соответственно длительность преобразования определяется состоянием разрядов ADPS2…ADPS0 регистра ADCSR (см. Табл. 2.116).
Таблица 2.116. Задание коэффициента деления предделителя АЦП
Наибольшая точность преобразования достигается, если тактовая частота модуля АЦП находится в диапазоне 50…200 кГц. Соответственно коэффициент деления предделителя рекомендуется выбирать таким, чтобы тактовая частота модуля АЦП находилась в указанном диапазоне. Если же точности преобразования меньше 10 разрядов достаточно, можно использовать более высокую частоту, увеличивая тем самым частоту выборки. В моделях ATmega8x, ATmega16x, ATmega64x и ATmega128x для этой же цели предназначен разряд ADCHM регистра SFIOR. При установке этого разряда в «1» скорость преобразования АЦП увеличивается. Однако при этом увеличивается и потребление микроконтроллера.
В моделях ATmega8x выводы микроконтроллера, подключенные ко входу АЦП, определяются состоянием разрядов MUX3…MUX0 регистра ADMUX согласно Табл. 2.117. В остальных моделях микроконтроллеров для этой же цели используются разряды MUX4…MUX0 регистра (см. Табл. 2.118). Для каналов с дифференциальным входом указанные разряды определяют также коэффициент предварительного усиления входного сигнала.
Таблица 2.117. Управление входным мультиплексором в моделях ATmega8x
Таблица 2.118. Управление входным мультиплексором в моделях ATmega16x, ATmega163x/32x/323x/64x/128x
Модуль АЦП может использовать различные источники опорного напряжения (ИОН). Выбор конкретного источника опорного напряжения осуществляется с помощью разрядов REFS1:REFS0 регистра ADMUX (Табл. 2.119).
Таблица 2.119. Выбор источника опорного напряжения
Внутренний ИОН подключается к выводу AREF микроконтроллера. Поэтому при его использовании к выводу AREF можно подключить внешний фильтрующий конденсатор для повышения помехозащищенности.
Результат преобразования АЦП.
После завершения преобразования (при установке в «1» флага ADIF регистра ADCSR) его результат сохраняется в регистре данных АЦП. Поскольку АЦП имеет 10 разрядов, этот регистр физически размещен в двух регистрах ввода/вывода ADCH:ADCL, доступных только для чтения. Эти регистры расположены по адресам $05:$04 и при включении микроконтроллера содержат значение «$0000».
По умолчанию результат преобразования выравнивается вправо (старшие 6 разрядов регистра ADCH незначащие). Однако он может выравниваться и влево (младшие 6 разрядов регистра ADCL незначащие). Для управления выравниванием результата преобразования служит разряд ADLAR регистра ADMUX. Если этот разряд установлен в «1», результат преобразования выравнивается по левой границе 16-разрядного слова, если сброшен в «0» по правой границе.
Обращение к регистрам ADCH и ADCL для получения результата преобразования должно выполняться в определенной последовательности: сначала необходимо прочитать регистр ADCL, а затем ADCH. Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор, пока не будет прочитан регистр ADCH. Благодаря этому можно быть уверенным, что при чтении регистров в них будут находиться составляющие одного и того же результата. Соответственно, если очередное преобразование завершится до обращения к регистру ADCH, результат преобразования будет потерян.
С другой стороны, если результат преобразования выравнивается влево и достаточно точности 8-разрядного значения, для получения результата можно прочитать только содержимое регистра ADCH.
Параметры АЦП
Основные параметры АЦП приведены в Табл. 2.120. Все значения указаны для диапазона температур окружающей среды 40…+80°C.
Таблица 2.120. Основные параметры АЦП
Как было сказано АЦП производит преобразования с определенной частотой, кратной основной частоте микроконтроллера. Производитель рекомендует использовать модуль АЦП с частотой 50-200 кГц.
В качестве источника опорного напряжения можно использовать внутренний источник и внешний. Напряжение внутреннего источника (2,3-2,7В) не рекомендуется использовать, по причине низкой стабильности. Внешний источник подключается к ножке AVCC или Aref, в зависимости от настроек программы.
При использовании АЦП ножка AVCC должна быть подключена. Напряжение AVCC не должно отличаться от напряжение питания микроконтроллера более чем на 0,3В. Как было сказано, максимальное измеряемое напряжение равно опорному напряжению(Vref), находится оно в диапазоне 2В-AVCC. Таким образом, микроконтроллер не может измерить более 5В.
Чтобы расширить диапазон измерения, нужно измерять сигнал через делитель напряжения. Например, максимальное измеряемое напряжение 10В, опорное напряжение 5В. Чтобы расширить диапазон измерения, нужно уменьшить измеряемый сигнал в 2 раза.
Формула для расчета делителя выглядит так:
Uвых = Uвх*R2/(R1+R2)
Подставим наши значения в формулу:
5=10*R2/(R1+R2)
(R1+R2)=2*R2
R1=R2
т.е. можно взять любые два одинаковых резистора и подключить их по схеме
Следовательно, когда мы измеряем напряжение через делитель, нужно полученное значение АЦП умножить на коэффициент=Uвых/Uвх.
Полная формула вычисления измеряемого напряжения будет выглядеть так:
U=(опорное_напряжение)*(значение_АЦП)*(коэффициент_делителя)/(число_разрядов_АЦП);
Пример: опорное напряжение = 5В, полученное значение АЦП = 512, коэффициент делителя =2, АЦП 10-разрядный.
(5*512*2)/1024=5В реальное полученное значение напряжения.
Некоторые программисты пишут программу так, чтобы микроконтроллер автоматически вычислял коэффициент делителя, для этого выходной сигнал измеряют образцовым прибором и заносят это значение в программу. Микроконтроллер сам соотносит истинное напряжение каждому значению АЦП, сам процесс однократный и носит название калибровки.
Рассмотрим пример 1.
Пусть частота МК равна 4,096МГц. Выберем частоту АЦП меньше 200 кГц. Этому соответствует делитель частоты СК/32=128кГц (ADPS2:ADPS0 - 101). Разрешим прерывания от АЦП (ADIE = 1) и будем работать в режиме однократного преобразования (ADFR = 0). Бит ADEN = 1, т.к. только включенный МК будет измерять напряжение на входе.
Учитывая все выше сказанное в ADCSRA будет записано следующее значение 10001101 (0х8D).
Для достижения полной 10-битной точности рекомендуется использовать частоты ниже 200 кГц. Частоты выше 200кГц можно использовать если точность не важна, а важна скорость. Например, при частоте 1МГц получаем 8-битное разрешение, а при 2МГц 6-битное.
А теперь в качестве примера приведу функцию инициализации АЦП и функцию, которая будет возвращать измеренное значение на указанном канале. Мне нравится больше писать на Си, поэтому код будет приведен на Си.
//функция инициализации
void ADC_init()
{
//воспользуемся значениями регистров, определенными ранее
ADMUX = 0x00;
ADCSRA = 0x8D;
}
// функция получает в качестве аргумента номер канала и
// возвращает значение на входе
unsigned int ADC_result(unsigned char adc_input)
{
ADMUX=adc_input|(ADMUX&0xF0); // 1111 0000=0xF0
//задержка для стабилизации входного напряжения
delay_us(10);
//начинаем преобразование (ADSC = 1)
ADCSRA| = 0x40; // 100 0000=0x40
//
while((ADCSRA&0x10)==0); // 1 0000=0x10 ждем, пока АЦП
// закончит преобразование (ADIF= 0)
ADCSRA|=0x10; // устанавливаем ADIF
return ADCW; //ADCW - содержит ADCH и ADCL как нам нужно
}
ADCW определен в файле МК (например, iom8.h в WINAVR). Посмотрите, ради интереса, как он там определен. Чтобы получить значение в Вольтах (например для вывода на экран) нужно умножить полученное значение на шаг измерения. Для рассмотренных выше 4.9мВ:
Напряжение_в_Вольтах=0.0049*ADC_result(номер канала)
Еще есть режим при котором процессор уходит в спящий режим и своими шумами не мешает АЦП, а АЦП работает. По окончании преобразования АЦП генерит прерывание и процессор просыпается.
Пример 2: Реализация вольтметра на МК ATmega8.
Подключим дисплей на порт D для отображения информации.
Измерение будет производиться непрерывно в автоматическом режиме, обработка кода в прерывании, опорное напряжение подключаем к ножке AVCC. По сути нужно только обрабатывать получаемые данные.
Измеренные данные хранятся в переменной adc_data[0]. В основном цикле добавим строки:
result=((5.00*adc_data[0])/1024.00); // пересчитываем значение
// АЦП в вольты
sprintf(lcd_buffer,»U=%.2fV»,result); // помещаем во временную
// переменную результат
lcd_puts(lcd_buffer); //выводим на экран
Таким образом, мы всего лишь перевели значение АЦП в вольты и вывели на дисплей.
Результат в протеусе выглядит так:
Резистором можно менять напряжение, измеряемое напряжение выведено на дисплей.
При сборке на реальном железе к ножке Aref нужно подключить конденсатор на 0,1 мкФ.
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40
float result;
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
void main(void)
{
char lcd_buffer[31];
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;
lcd_init(8);
#asm("sei")
lcd_clear();
while (1)
{
lcd_gotoxy(0,0);
result=((5.00*adc_data[0])/1024.00);
sprintf(lcd_buffer,"U=%.2fV",result);
lcd_puts(lcd_buffer);
};
}
Самостоятельно:
(Студенты с чётным номером в журнале группы выполняют второй вариант, с нечётным первый вариант).
Вариант №1.
Получить методом дихотомии цифровое значение аналогового сигнала Vд, изображенного на рисунке, если известно, что используется 8-ми разрядное АЦП последовательного приближения.
Вариант №2.
Получить методом дихотомии цифровое значение аналогового сигнала Vд, изображенного на рисунке, если известно, что используется 8-ми разрядное АЦП последовательного приближения.
Лекция №13. Последовательный периферийный интерфейс - SPI - (Serial Peripheral Interface)
Шина последовательного периферийного интерфейса (SPI) это синхронный полнодуплексный последовательный канал передачи данных, широко используемый для обмена данными на коротких расстояниях между основным устройством, таким как микроконтроллер (MCU), и одним или несколькими подчинёнными устройствами, такими как преобразователи данных, цифровые устройства ввода/вывода, датчики температуры и контроллеры управления питанием.
При использовании в стандартной конфигурации можно достичь высоких скоростей передачи данных, до 20 Мбит/с, не подвергая опасности синхронность тактового сигнала и данных. Однако современные промышленные разработки часто требуют гальванической развязки контроллера и цепей сбора данных и датчиков, потенциалы заземления которых изменяются в широких пределах. Для развязки применяют цифровые развязывающие устройства, которые вносят задержки распространения, которые, находясь в зависимости от частоты тактовых импульсов интерфейса, могут привести к потере синхронизации и, таким образом, к увеличению частоты появления битовых ошибок.
Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) имеет три назначения:
с его помощью может осуществляться обмен данными между микроконтроллером и различными периферийными устройствами, такими как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др.
с его помощью может производиться обмен данными между несколькими микроконтроллерами AVR.
через интерфейс SPI может быть осуществлено программирование микроконтроллера (так называемый режим последовательного программирования).
При обмене данными по интерфейсу SPI микроконтроллер AVR может работать как ведущий (режим Master) либо как ведомый (режим Slave). При работе с этим интерфейсом пользователь может задавать:
• скорость передачи (восемь программируемых значений);
• формат передачи (от младшего бита к старшему или наоборот).
В отличие от стандартного последовательного порта, SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая (ведомая) периферия синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участия в передаче по SPI.
Обычно скорости передачи данных находятся в диапазоне от 1 до 20 Мбит/с, а длина посылки может быть в диапазоне от 8 или 12 бит до величин, кратных этим значениям. Операции передачи данных всегда подразумевают обмен данными. В то время как основное устройство отправляет данные в подчинённое, подчинённое устройство отправляет данные в основное. По этой причине внутренние регистры сдвига основного и подчинённого устройств образуют кольцо (рисунок 1).
Рис. 1. Два регистра сдвига образуют общий для обеих микросхем кольцевой буфер. Данные из памяти основного устройства попадают в память подчинённого устройства, и наоборот
Перед обменом данными основное и подчинённое устройства загружают в свои внутренние сдвиговые регистры данные из памяти. По тактовому сигналу, подаваемому основным устройством, основное устройство сначала отправляет старший значащий бит (MSB) своего регистра сдвига по линии MOSI. В то же время подчинённое устройство считывает первый бит от основного устройства по линии SIMO, записывает его в свой регистр сдвига и отправляет свой MSB по линии SOMI. Основное устройство считывает первый бит подчинённого устройства в линии MISO и сохраняет его в памяти для последующей обработки. Вся процедура обмена данными продолжается до тех пор, пока устройства не обменяются всеми битами, после чего основное устройство оставляет уровень на линии тактового сигнала без изменения и отключает подчинённое устройство с помощью линии /SS.
Функционирование модуля SPI
В состав модуля SPI (рис. 1) входят:
- 8-разрядный сдвиговый регистр SPDR, который принимает байт данных с шины данных микроконтроллера, сдвигает его вправо или влево с выдачей последовательного кода на вывод микроконтроллера, одновременно с выводом принимает последовательный код со входа микроконтроллера и через буферный регистр передает его на шину данных микроконтроллера;
- 8-разрядный регистр управления SPCR и регистр состояния SPSR;
- предварительный делитель частоты;
- схемы управления.
Рис. 1. Блок-схема SPI
Модуль SPI использует четыре вывода микроконтроллера. При включенном модуле SPI режим работы указанных выводов (направление передачи данных) переопределяется согласно Табл. 2.
Табл. 1. Выводы, используемые модулем SPI.
Табл. 2. Переназначение режима работы выводов модуля SPI.
Для управления модулем SPI предназначен регистр управления SPCR. Формат этого регистра приведен на Рис. 2, а краткое описание функций битов регистра приведено в Табл. 3.
Рис. 2. Формат регистра SPCR
Табл. 3. Биты регистра SPCR
Выбор режима (ведущего (master) или ведомого (slave)) определяется установкой бита MSTR управляющего слова SPCR.
При MSTR = 1 порт SPI работает в режиме ведущего. При этом:
вывод MOSI является выходом данных;
вывод MISO - входом данных;
вывод SCK - выходом для импульсов, используемых в качестве сдвиговых при приеме данных ведомым микроконтроллером.
функция вывода SS зависит от состояния разряда DDRB.4. При DDRB.4 = 1 (вывод сконфигурирован как выход) вывод SS порта SPI не подключен к выводу порта РВ4, при DDRB.4 = 0 (вывод сконфигурирован как вход) значение сигнала на входе влияет на работу порта SPI. Если PB4(SS) = 1, порт работает в режиме ведущего, а при появлении сигнала 0 переключается в режим ведомого.
То есть, если вывод SS сконфигурирован как вход, то для обеспечения работы ведущего SPI он должен удерживаться на высоком уровне. Если, в режиме ведущего, вывод SS является входом и какой-то внешней схемой на него подан низкий уровень, то SPI воспримет его как обращение другого ведущего SPI к себе как к ведомому.
Чтобы избежать конфликтной ситуации на шине, система SPI выполняет следующие действия:
Таким образом, когда управляемый прерыванием передающий SPI используется в ведущем режиме, и существует вероятность подачи на вывод SS управляющего сигнала низкого уровня, прерывание должно всегда проверять установлен ли еще бит MSTR. Если же бит MSTR был очищен выбором режима ведомого, то он должен быть установлен пользователем.
Если же SPI работает в режиме ведомого, то вывод SS постоянно работает на вход. Если на вывод SS подан низкий уровень, то SPI активируется и MISO, если это определено пользователем, становится выходом. Все остальные выводы являются входами. Если вывод SS удерживается на высоком уровне, то все выводы являются входами, SPI пассивен, что означает, что он не будет получать входящих данных.
Перевод порта SPI в рабочее состояние осуществляется путем установки бита SPE регистра SPCR.
При MSTR = 0 порт SPI работает в режиме ведомого. При этом:
вывод MOSI является входом данных;
вывод MISO - выходом данных;
вывод SCK - входом для импульсов сдвига;
вывод SS - входом.
Контроль состояния модуля, а также дополнительное управление скоростью обмена осуществляются с помощью регистра состояния SPSR. Биты с 7-го по 1-й этого регистра доступны только для чтения, а 0-й бит как для чтения, так и для записи. Формат этого регистра приведен на Рис, а назначение его битов описано в Табл.
Рис. Формат регистра SPSR
Табл. Биты регистра SPSR.
На рис. 2 приведена схема соединения двух микроконтроллеров для обмена данными по каналу SPI. Передача данных начинается после записи данных в регистр SPDR ведущего микроконтроллера. Порядок выдачи определяется состоянием бита DORD при настройке канала. Если DORD = 1, вывод начинается с младшего разряда (LSB), иначе - со старшего (MSB). После выдачи последнего разряда устанавливается в 1 флаг SPIF (бит 7 регистра состояния SPSR) и одновременно вырабатывается запрос прерывания SPI, если флаг разрешения прерывания SPIE от модуля SPI при настройке канала был установлен в 1. Одновременно с передачей производится прием данных от ведомого микроконтроллера при условии, что на входе SS ведомого присутствует напряжение НИЗКОГО уровня. Таким образом, в каждом цикле сдвига происходит обмен данными между устройствами. По окончании приема данных в ведомом микроконтроллере также устанавливается в 1 флаг SPIF и вырабатывается запрос прерывания SPI при разрешении прерывания. При попытке записи в регистр данных SPDR во время передачи очередного байта устанавливается в 1 флаг WCOL (бит 6 регистра состояния SPSR).
Рис. 2. Межсоединения ведущего и ведомого SPI
Типы подключения к шине SPI
Существует три типа подключения к шине SPI, в каждом из которых участвуют четыре сигнала:
1) Самое простое подключение - участвуют только две микросхемы, рис. 1.
Здесь, ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных. Представленную схему можно упростить исключением линии MISO, если используемая подчиненная ИС не предусматривает ответную передачу данных или в ней нет потребности. Одностороннюю передачу данных можно встретить у таких микросхем как ЦАП, цифровые потенциометры, программируемые усилители и драйверы. Таким образом, рассматриваемый вариант подключения подчиненной ИС требует 3 или 4 линии связи. Чтобы подчиненная ИС принимала и передавала данные, помимо наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние у slave. В противном случае, подчиненная ИС будет неактивна.
Рис. 1. Простейшее подключение к шине SPI
При необходимости подключения к шине SPI нескольких микросхем используется либо:
2) независимое (параллельное) подключение (рис. 2);
3) каскадное (последовательное) (рис. 3).
Независимое подключение
Независимое подключение более распространенное, т.к. достигается при использовании любых SPI-совместимых микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое состояние, задает, с какой подчиненной ИС он будет обмениваться данными.
Главный недостаток необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3+n, где n-количество подчиненных микросхем).
Рис. 2. Независимое подключение к шине SPI
Каскадное подключение
Каскадное включение не требует дополнительных линий, т.к. здесь из нескольких микросхем образуется один большой сдвиговый регистр.
При таком подключении выход передачи данных одной ИС соединяется со входом приема данных другой (рис. 3). Входы выбора микросхем соединены параллельно.
Общее число линий равно 4.
Использование каскадного подключения возможно только в том случае, если его поддержка указана в документации на используемые микросхемы. Чтобы выяснить это, важно знать, что такое подключение по-английски называется 'daisy-chaining'.
Рис. 3. Каскадное подключение к шине SPI
Протокол передачи
Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. В качестве первого фронта в цикле передачи может выступать нарастающий или спадающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:
Эти два бита и образуют номер режима. CPOL является старшим битом, а CPHA младшим. Иногда в документации к устройству явно не указывают номер режима, но его всегда можно легко определить по временным диаграммам.
Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми.
Например, пусть устройство работает в режиме 0 (наиболее распространённый вариант), в таком случае ведомое устройство будет считывать бит данных со входа MOSI по переднему нарастающему фронту синхронизирующего сигнала, а ведущее устройство будет считывать данные от ведомого на входе MISO также по переднему нарастающему фронту. Для большей наглядности для всех четырёх режимов работы приведены осциллограммы.
На этом рисунке показаны сигналы MOSI (синяя линия) и SCK (жёлтая линия). Во всех случаях передаётся число 0x64. Светлые вертикальные линии показывают момент выборки данных. Рассмотрим режим 2, для которого, как мы помним, CPOL=1, а CPHA=0. Таким образом, синхронизирующий сигнал изначально имеет высокий уровень, а выборка производится по переднему фронту (в данном случае спадающему). Сигнал ~CS представляет собой просто «провал» на всём протяжении передачи данных.
Частота тактового сигнала SCK и, соответственно, скорость передачи данных по интерфейсу определяется состоянием разрядов SPR1:SPR0 регистра SPCR и разряда SPI2X регистра SPSR (Табл. 2.137). Разумеется, речь идет о микроконтроллере, работающем в режиме «Master», т. к. именно он является источником тактового сигнала. Для устройства, находящегося в режиме «Slave», состояние этих разрядов безразлично.
Таблица 2.137. Задание частоты тактового сигнала SCK
Примечание: fCLK тактовая частота микроконтроллера.
Следует иметь в виду, что функционирование микроконтроллера в режиме «Slave» гарантируется только на частотах, меньших или равных fCLK/4.
Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому, к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно.
Сравнение с шиной I²C
Для стыковки микросхем не меньшей популярностью пользуется 2-проводная последовательная шина I2C.
I²C последовательная шина данных для связи интегральных схем, разработанная фирмой Philips в начале 1980-х как простая шина внутренней связи для создания управляющей электроники. Используется для соединения низкоскоростных периферийных компонентов с материнской платой, встраиваемыми системами и мобильными телефонами. Название представляет собой аббревиатуру слов Inter-Integrated Circuit.
I²C использует две двунаправленных линии последовательная линия данных (SDA, Serial DAta) и последовательная линия тактирования (SCL, Serial CLock). Стандартные напряжения +5 В или +3,3 В, однако допускаются и другие.
Классическая адресация включает 7-битное адресное пространство с 16 зарезервированными адресами. Это означает до 112 свободных адресов для подключения периферии на одну шину.
Основной режим работы 100 кбит/с; 10 кбит/с в режиме работы с пониженной скоростью. Cтандарт допускает приостановку тактирования для работы с медленными устройствами.
После пересмотра стандарта в 1992 году становится возможным подключение ещё большего количества устройств на одну шину (за счёт возможности 10-битной адресации), а также большую скорость до 400 кбит/с в скоростном режиме. Соответственно, доступное количество свободных узлов выросло до 1008.
Тактирование при последовательной передаче данных
Процедура обмена начинается с того, что ведущий формирует состояние СТАРТ: генерирует переход сигнала линии SDA из ВЫСОКОГО состояния в НИЗКОЕ при ВЫСОКОМ уровне на линии SCL. Этот переход воспринимается всеми устройствами, подключенными к шине, как признак начала процедуры обмена. Генерация синхросигнала это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине. Процедура обмена завершается тогда, когда ведущий формирует состояние СТОП переход состояния линии SDA из низкого состояния в ВЫСОКОЕ при ВЫСОКОМ состоянии линии SCL.
Состояния СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после фиксации состояния СТАРТ. Шина считается освободившейся через некоторое время после фиксации состояния СТОП. При передаче посылок по шине I2C каждый ведущий генерирует свой синхросигнал на линии SCL.
После формирования состояния СТАРТ, ведущий опускает состояние линии SCL в НИЗКОЕ состояние и выставляет на линию SDA старший бит первого байта сообщения. Количество байт в сообщении не ограничено. Спецификация шины I2C разрешает изменения на линии SDA только при НИЗКОМ уровне сигнала на линии SCL. Данные действительны и должны оставаться стабильными только во время ВЫСОКОГО состояния синхроимпульса.
Для подтверждения приема байта от ведущего-передатчика ведомым-приемником в спецификации протокола обмена по шине I2C вводится специальный бит подтверждения, выставляемый на шину SDA после приема 8 бита данных.
Передача 8 бит данных от передатчика к приемнику завершаются дополнительным циклом (формированием 9-го тактового импульса линии SCL), при котором приемник выставляет низкий уровень сигнала на линии SDA, как признак успешного приема байта.
Подтверждение при передаче данных обязательно, кроме случаев окончания передачи ведомой стороной. Соответствующий импульс синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA на время синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильном НИЗКОМ состоянии.
На уровне битов, устройство, такое как микроконтроллер без встроенных аппаратных цепей I2C или с ограниченными цепями, может замедлить частоту синхроимпульсов путем продления их НИЗКОГО периода. Таким образом, скорость передачи любого ведущего адаптируется к скорости медленного устройства.
Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу. В обычном режиме используется 7-битная адресация.
Процедура адресации на шине I2C заключается в том, что первый байт после сигнала СТАРТ определяет, какой ведомый адресуется ведущим для проведения цикла обмена.
Исключение составляет адрес «Общего вызова», который адресует все устройства на шине. Когда используется этот адрес, все устройства в теории должны послать сигнал подтверждения. Однако, устройства, которые могут обрабатывать «общий вызов», на практике встречаются редко.
Первые семь битов первого байта образуют адрес ведомого. Восьмой, младший бит, определяет направление пересылки данных. «Ноль» означает, что ведущий будет записывать информацию в выбранного ведомого. «Единица» означает, что ведущий будет считывать информацию из ведомого.
После того, как адрес послан, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от бита направления.
Адрес ведомого может состоять из фиксированной и программируемой части.
Основные проблемы с использованием I2C шины возникают именно из-за того, что «начинающие» разработчики не учитывают того факта, что ведущий (часто микропроцессор) не имеет монопольного права ни на одну из линий шины.
Контрольная работа №2. Работа с шестнадцатибитными таймерами-счётчиками.
Постановка задачи.
Запрограммировать широтно - импульсную модуляцию (ШИМ), где на выходе выдаётся сигнал, ширина импульса которого увеличивается от периода к периоду на 0.5 сек.
Длительность периода составляет 5 сек., а стартовая ширина импульса 0.5 сек. Если будет достигнуто максимальное значение ширины импульса 4.5 сек, то ширина импульса снова начинает уменьшатся на 0.5 сек, пока значение не станет равно нулю. Этот процесс повторяется периодически.
Лекция №14. Применение шине I2C
I²C находит применение в устройствах, предусматривающих простоту разработки и низкую себестоимость изготовления при относительно неплохой скорости работы.
Список возможных применений:
Cравнение SPI с шиной I2C
Для стыковки микросхем не меньшей популярностью пользуется 2-проводная последовательная шина I2C.
Преимущества интерфейсов SPI и I2C
Преимущества шины SPI |
Преимущества шины I2C |
Простота протокола обуславливает высокую надежность и быстродействие передачи. Быстродействие шины SPI измеряется десятками МГц. Она идеальна для потоковой передачи больших объемов данных. Широко используется в высокоскоростных ЦАП/АЦП, драйверах светодиодных дисплеев и микросхемах памяти. |
Шина I2C остается двухпроводной, независимо от количества подключенной к ней микросхем. |
Все линии шины SPI являются однонаправленными, что существенно упрощает решение задачи преобразования уровней и гальванической изоляции микросхем |
Возможность мультимастерной работы, когда к шине подключено несколько ведущих микросхем. |
Простота программной реализации протокола SPI. |
Протокол I2C является более стандартизованным, поэтому, пользователь I2C-микросхем более защищен от проблем несовместимости выбранных компонентов. |
SPI (продолжение)
Скорость передачи устанавливается для ведущего микроконтроллера с помощью битов SPR1, SPR0 регистра SPCR. Используемые для сдвига импульсы вырабатываются в результате деления тактовой частоты СКL на коэффициент К согласно табл. 3.
Таблица 3. Выбор коэффициента деления К.
В модуле SPI реализована одинарная буферизация при передаче и двойная при приеме. Это означает, что готовый для передачи байт данных не может быть записан в регистр данных SPI до окончания предыдущего цикла обмена. При попытке изменить содержимое регистра данных во время передачи флаг WCOL регистра SPSR устанавливается в 1. Сбрасывается этот флаг после чтения регистра SPSR с последующим обращением к регистру данных SPI.
Соответственно, при приеме данных принятый байт должен быть прочитан из регистра данных SPI до того, как в сдвиговый регистр поступит последний бит следующего байта. В противном случае первый байт будет потерян.
В примере показана инициализация SPI как мастера и организация простой передачи данных. В примере DDR_SPI должен быть заменен на имя фактического регистра направления данных, управляющий выводами интерфейса SPI (для ATmega128 DDRB). DD_MOSI, DD_MISO и DD_SCK также должны быть заменены на имена соответствующих бит регистров направления данных, связанных с этими выводами. Например, если MOSI размещен на выв. PB2, то DD_MOSI необходимо заменить на DDB2, а DD_SСК на DDB1.
Пример кода на Си (инициализация SPI как мастера и организация простой передачи данных) |
void SPI_MasterInit(void) { /* Установка MOSI и SCK на вывод, все остальные на ввод */ // DD_MOSI=DDRB.2, DD_SСК=DDRB.1, DDR_SPI=DDRB DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); /* Разрешение SPI в режиме мастера, установка скорости связи fck/16 */ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); } void SPI_MasterTransmit(char cData) { /* Запуск передачи данных */ SPDR = cData; /* Ожидание завершения передачи данных */ while(!(SPSR & (1<<SPIF))) ; } |
В следующем примере показано как инициализировать SPI как slave и как выполнить простой прием данных.
Пример кода на Си (инициализация SPI как slave и организация простого приёма данных) |
void SPI_SlaveInit(void) { /* Установка MISO на вывод и всех остальных на ввод */ // DD_MISO=DDB3, DDR_SPI=DDRB DDR_SPI = (1<<DD_MISO); /* Разрешение SPI */ SPCR = (1<<SPE); } char SPI_SlaveReceive(void) { /* Ожидание завершения передачи */ while(!(SPSR & (1<<SPIF))); /* Чтение принятых данных и выход из процедуры */ return SPDR; } |
PAGE 66