Известно несколько различных способов преобразования аналогового сигнала в цифровой код. Для большинства способов сигнал, подлежащий оцифровке, должен оставаться постоянным в течение всего времени аналого-цифрового преобразования. Поэтому большинство АЦП в качестве входной цепи используют так называемое устройство выборки и хранения (УВХ). УВХ — это электронная цепь с накопительным конденсатором, которой до начала преобразования заряжается до уровня измеряемого напряжения, затем напряжение на конденсаторе остается неизменным в течение времени преобразования. По способу преобразования различают следующие типы АЦП:
• последовательного приближения;
• двойного интегрирования;
• прямого счета;
• параллельные АЦП.
Мы рассмотрим только способ последовательного приближения, поскольку именно этот способ используется в модуле аналого-цифрового преобразователя МК семейства 68HC12/HCS12. Если у читателя возникнет желание познакомиться с другими способами преобразования, то он может обратиться к книге авторов Pack и Barret [2002].
4.21.1. АЦП последовательного приближения
а) Функциональная схема
б) Диаграмма, поясняющая принцип действия АЦП последовательного приближения
Рис. 4.82. Аналого-цифровой преобразователь последовательного приближения
Структурная схема АЦП последовательного приближения представлена на рис. 4.82. Алгоритм функционирования АЦП последовательного приближения рассмотрим на примере. Предположим, что вывод низкого уровня опорного напряжения VRLнашего АЦП подключен к потенциалу 0 В, а вывод высокого уровня опорного напряжения VHL — к потенциалу 5,0 В. АЦП формирует на выходе 8-разрядный двоичный код. Число различных кодов, которыми может быть представлен результат оцифровки, составляет 28 = 256. Разрешающая способность нашего АЦП составляет:
(5,0 – 0,0)/256 = 19,53 мВ
Процесс аналого-цифрового преобразования по способу последовательного приближения многотактный. Число тактов, необходимое для выполнения одного преобразования, равно числу двоичных разрядов в представлении результата. Таким образом, в нашем примере на выходе АЦП будет сформирован восьмиразрядный двоичный код результата после завершения восьмого такта преобразования. Процесс преобразования запускается по сигналу Start.
Диаграмма рис. 4.82 отражает процесс формирования цифрового кода в АЦП последовательного приближения. На каждом такте формируется один двоичный разряд результата: на первом такте — старший разряд D7, на втором такте — разряд D6 и т.д., заканчивая младшим разрядом D0 на восьмом такте.
На первом такте в регистре последовательного приближения устанавливается код K1=10000000b. Этот код поступает на вход цифро-аналогового преобразователя (ЦАП), опорное напряжение которого равно UREF=URH–URL=5,0 В.
На выходе ЦАП установится напряжение UDAC=UREF×K1/28=2,5 В. Аналоговый компаратор сравнивает измеряемое напряжение UINP с напряжением на выходе ЦАП UDAC. Если UINP>UDAC, то на выходе компаратора формируется логическая 1. Если UINP<UDAC, на выходе компаратора устанавливается логический 0. Сигнал с выхода компаратора поступает на вход регистра последовательного приближения. Его значение определяет код на выходе регистра последовательного приближения в следующем такте преобразования. Если на выходе компаратора 1, то во втором такте преобразования регистр сформирует код K2 = 11000000b, если 0, то K2 = 01000000b. Иными словами, значение формируемого в текущем такте преобразования двоичного разряда равно значению логического сигнала на выходе компаратора.
На рис. 4.82 показаны возможные уровни напряжения на выходе ЦАП во втором, третьем и четвертом тактах работы АЦП. Количество уровней увеличивается с ростом номера такта, так как увеличивается число возможных комбинаций кодов на выходе регистра последовательного приближения. Так во втором такте при значении кода K2 = 11000000b на выходе ЦАП будет сформировано напряжение 3,75 В, а при коде K2 = 01000000b — 1,25 В. На восьмом такте число возможных уровней на выходе ЦАП составит 256.
АЦП последовательного приближения имеют ряд достоинств и недостатков. К достоинствам следует отнести следующие свойства:
Время преобразования не зависит от амплитуды входного сигнала и определяется только частотой тактирования и числом двоичных разрядов результата. Постоянное время преобразования удобно в микропроцессорной технике, поскольку позволяет разработчику точно рассчитать время выполнения отдельных программных фрагментов.
При получении каждого цифрового отсчета аналого-цифровое преобразование выполняется полностью сначала, результат предыдущего преобразования не оказывает влияния на последующее преобразование. Это свойство чрезвычайно важно в многоканальных модулях АЦП микроконтроллеров. Так при последовательном подключении двух измеряемых сигналов мультиплексором к одному АЦП оба измерения будут за два цикла преобразования, каждый цикл равен восьми тактам. Никаких дополнительных циклов не потребуется.
В качестве недостатков АЦП последовательного приближения следует отметить их относительно низкую скорость преобразования и достаточно сложную структуру.
1. Какому напряжению на входе АЦП соответствует код код результата «все единицы». Равно ли это измеряемое напряжение напряжению полной шкалы, т.е. UREF=URH–URL?
Ответ: Максимальный код на выходе АЦП соответствует значениям напряжения входного сигнала UINP>UREF(1–2–n). Так для 12-разрядного преобразователя с напряжением опоры 10,0 В максимальный код на выходе, равный 1111 1111 1111b, будет соответствовать напряжению входного измеряемого сигнала UINP>UREF(1–2–n)=10,0(1–2–12)=9,99756 В. Поскольку полученное значение крайне близко к UREF, то часто говорят, что максимальный код соответствует напряжению полной шкалы UREF. Однако, как мы установили, максимальный код в действительности несколько меньше напряжения полной шкалы.
4.22. Подсистема аналого-цифрового преобразования МК 68HC12
В этом разделе мы рассмотрим подсистему аналого-цифрового преобразования в составе микроконтроллеров семейства 68HC12. Эту подсистему именуют модулем ATD (Analog-To-Digital). Структура модуля представлена на рис. 4.83.
Рис. 4.83. Структура модуля аналого-цифрового преобразователя ATD в составе МК 68HC12
Модуль ATD — восьмиканальный, он имеет восемь входов AN0…AN7 для подключения аналоговых сигналов. В каждый момент времени аналоговый мультиплексор коммутирует один из восьми сигналов AN0…AN7 ко входу АЦП модуля ATD. Для преобразования аналогового сигнала в 8-разрядный цифровой код АЦП использует способ последовательного приближения. Ошибка преобразования составляет ±1 младшего разряда, т.е. ±1/256 полной шкалы преобразования: ±1/256 UREF= ±1/256 (URH–URL).
Модуль ATD может работать как в режиме однократного преобразования, так и в режиме многократного преобразования. При однократном преобразовании модуль выполняется одно преобразование сигнала с заданным номером канала, после чего модуль ожидает следующего программного запуска. При многократном преобразовании модуль ATD ведет непрерывную оцифровку входного сигнала с заданным номером. После завершения одного преобразования немедленно автоматически запускается следующее. Третий режим работы модуля ATD — режим измерительной сессии. В этом режиме в регистры управления модуля ATD записывается последовательность номеров каналов, которые подлежат оцифровке. После поступления от программы сигнала запуска сначала оцифровывается канал с первым указанным номером. Затем аналоговый мультиплексор автоматически подключает ко входу АЦП канал со вторым запрограммированным номером. Запускается следующее преобразование. И так до окончания запрограммированной последовательности каналов.
Для управления процессом оцифровки восьми аналоговых сигналов предназначены регистры специальных функций модуля ATD, которые объединены в массив из 32 однобайтовых ячеек памяти. Диапазон измерения может варьироваться разработчиком, поскольку выводы для подключения опорных напряжений VHLи VRL выведены на ножки корпуса МК.
4.22.1 Структура и порядок функционирования
Модуль ATD использует линии порта AD в качестве входов AN0…AN7 для подключения измеряемых аналоговых сигналов. Обслуживание модуля ATD — альтернативная функция линий PAD0…PAD7 порта AD. Поэтому на рисунках функциональной схемы МК и модуля ATD (рис. 4.83) эти линии обозначаются AN0/PAD0… AN7/PAD7.
Аналоговые сигналы поступают на вход аналогового мультиплексора. Мультиплексор коммутирует один из аналоговых сигналов на вход АЦП последовательного приближения. Номер коммутируемого канала выбирается программно посредством установки определенных битов в регистрах специальных функций модуля ATD.
Запуск АЦП на преобразование осуществляется программной установкой бита в регистре управления ATDCTL5. После завершения преобразования полученный код загружается в один из регистров результата ADR0H…ADR7H. Номер регистра результата для каждого преобразования выбирается в соответствии с номером измеряемого канала. После завершения преобразования также устанавливаются флаги в регистре состояния ATDSTAT.
АЦП тактируется импульсной последовательностью с выхода делителя частоты fBUS. Выводы VRH и VRL предназначены для подключения внешних источников прецизионного напряжения. Разность напряжений на этих входах URH–URLопределяет напряжение полной шкалы преобразования модуля ATD. Если напряжение входного аналогового сигнала UINP≤URL, то на выходе АЦП будет формироваться код $00. При UINP≥URH, результирующий код АЦП будет равняться $FF. Формат представления кода — прямой однобайтовый беззнаковый.
При изучении модуля ATD сначала может показаться, что процесс управления аналого-цифровым преобразованием достаточно сложен и состоит из многих операций. Мы покажем Вам, что это не так, и для этого проведем аналогию между изучаемым процессом и процессом выпечки пирожных. Для выпечки пирожных (или преобразования измеряемого напряжения в код) проделайте следующие действия:
• Включите духовку (для включения модуля ATD бит ADPU в регистре ATDCTL2 следует установить в 1);
• Прогрейте духовку в течение некоторого времени (после включения ATD следует организовать задержку на 100 мкс для завершения переходных процессов в аналоговых цепях и стабилизации системы тактирования АЦП);
• Определите, какую начинку Вы будете добавлять в пирожные: — грецкие орехи, мармелад и т.д. (определите, какой режим аналого-цифрового преобразования Вы будете использовать, и установите соответствующие биты регистров ATDCTL4 и ATDCTL5);
• Положите пирожные в духовку (установите биты регистра ATDCTL5). Они будут готовы через некоторое заранее установленное таймером время. Об окончании приготовления сообщит звуковой сигнал (В регистре ATDSTAT установится флаг SCF).
• Готовые пирожные выложите на блюдо (цифровой код буден помещен в регистры данных). Пирожные готовы для еды, а результат оцифровки для дальнейшего использования в расчетах.
4.22.2. Регистры управления модуля ATD
Ранее мы отметили, что все регистры специальных функций модуля ATD объединены в блок из шестнадцати 16-разрядных слов. Этот блок занимает в памяти 32 однобайтовых ячейки с последовательными адресами. По смысловому назначению все регистры можно разбить на четыре группы:
• Регистры управления. Эти регистры используются для выбора режима работы модуля ATD, для указания номера подлежащего оцифровке канала, для запуска АЦП на преобразование.
• Регистры состояния. Двухбайтовый регистр состояния содержит группу флагов, которые отражают текущее состояние модуля ATD: находится ли он в состоянии преобразования, какой канал преобразуется, или все преобразования уже завершены.
• Регистры результата. Модуль ATD содержит восемь 8-разрядных регистров результата (по числу аналоговых входов модуля). После завершения очередного преобразования полученный код загружается в соответствующий номеру канала регистр результата ADR0H…ADR7H.
• Тестовые регистры. Двухбайтовый регистр ATDTEST предназначен для специальных операций в процессе обязательного тестирования МК на фабрике-производителе. Доступ к этому регистру возможен только в специальном режиме работы МК. В обычном пользовательском режиме работы этот регистр для чтения и для записи недоступен.
Приступим теперь к более подробному рассмотрению формата регистров специальных функций модуля ATD.
Эта группа регистров предназначена для управления режимами работы модуля аналого-цифрового преобразования. Группа объединяет шесть регистров управления ATDCTL0…ATDCTL5. Один из регистров (ATDCTL2) используется для включения модуля ATD в работу, поскольку аппаратные средства МК при выходе из состояния сброса отключают этот модуль для уменьшения энергии потребления. После того, как модуль ATD включили, следует выдержать паузу в 100 мкс, прежде чем подавать сигнал начала преобразования. Задержка в 100 мкс необходима, чтобы завершились переходные процессы включения в аналоговых цепях модуля. Регистры управления используются для выбора между режимами однократного или многократного преобразования, а также для назначения номера канала, подлежащего оцифровке. В режиме многократного преобразования может быть запрограммирована последовательность номеров каналов, которые будут оцифровываться друг за другом автоматически, без дополнительного вмешательства прикладной программы. Или многократные измерения могут проводиться для одного канала. Регистры управления 0, 1 и 3 по своему функциональному назначению используются достаточно редко, поэтому мы рассмотрим их кратко. Напротив, регистры 2, 4 и 5 активно используются в прикладных программах, поэтому будут рассмотрены подробно.
Регистр управления ATDCTL0 располагается в памяти по адресу $0060. Этот регистр предназначен для принудительного останова аналого-цифрового преобразования, для чего в регистр под управлением программы должен быть записан определенный код. Этот режим крайне редко используется в прикладных программах. Не будем использовать его и мы в наших учебных примерах. Регистр управления ATDCTL1 располагается в памяти по адресу $0061. Он используется только в специальных случаях тестирования ИС МК.
Рис. 4.84. Формат регистра ATDCTL2
Регистр управления ATDCTL2 располагается в памяти по адресу $0062. Этот регистр в первую очередь используется для включения модуля ATD. Он также содержит флаг окончания преобразования и несколько битов разрешения режимов. Формат регистра приведен на рис. 4.84. Назначение отдельных битов регистра следующее:
ADPU:
Бит разрешения работы модуля ATD. После сброса бит ADPU установлен в 0, и модуль ATD отключен от системы питания. Для включения модуля следует установить бит ADPU в 1. Модуль ATD будет готов к работе через 100 мкс.
AFFC:
Бит выбора режима сброса флагов модуля ATD. Если этот бит установлен в 0, то все установленные флаги сбрасываются обычным способом, т.е. посредством записи 1 в разряд установленного флага. Если же бит установлен в 0, то для всех флагов модуля разрешается как обычный способ сброса, так и ускоренный. Ускоренный способ сброса для каждого флага будет рассмотрен несколько позже.
AWAI:
Бит разрешения работы модуля ATD, когда микроконтроллер находится в состоянии пониженного энергопотребления типа WAIT. Если бит установлен в 0, то модуль ATD продолжает свою работу в состоянии WAIT. При AWAI = 1 работа модуля ATD с состоянии WAIT приостанавливается для понижения энергопотребления.
ASCIE:
Бит разрешения прерывания по флагу окончания преобразования АЦП. Если этот бит установлен в 1, и флаг окончания преобразования ASCIF установился в 1, то генерируется запрос на прерывание. Если бит ASCIE = 0, то прерывания по флагу ASCIF запрещены и его состояние следует контролировать программно.
ASCIF:
Флаг окончания преобразования АЦП. Автоматически устанавливается в 1, если ранее начатое аналого-цифровое преобразование завершено, и полученный код загружен в один из регистров результата. Если прерывания по данному флагу разрешены (ASCIE = 1), то генерируется запрос на прерывание.
Генерация запроса на прерывание с собственным вектором особенно полезна при работе модуля ATD в режиме измерительной сессии. В этом режиме АЦП выполняет несколько последовательных преобразований после единственного запуска под управлением программы. При использовании прерывания МК в течение всего времени преобразования может исполнять другие действия прикладной программы управления. Когда многократное аналого-цифровое преобразование будет завершено, установится флаг окончания преобразования ASCIF, будет выставлен запрос на прерывание, и МК, исполняя подпрограмму прерывания, считает коды оцифровки из регистров результата в память МК. Альтернативой такой организации взаимодействия прикладной программы с модулем ATD является многократный опрос флага ASCIF после программного запуска АЦП. Когда программа обнаружит, что флаг установился, регистры результата как и в предыдущем случае будут считаны. Однако в течение всего времени преобразования МК будет занят обслуживанием АЦП и не сможет исполнять других фрагментов прикладной программы.
Регистр управления ATDCTL3 располагается в памяти по адресу $0063. Этот регистр содержит два бита FRZ1:FRZ0, которые используются для организации работы АЦП в отладочном режиме работы.
Рис. 4.85.
Регистр управления ATDCTL4 располагается в памяти по адресу $0064. Формат регистра управления ATDCTL4 приведен на рис. 4.85. Этот регистр позволяет регулировать время выборки для устройства выборки и хранения на входе АЦП последовательного приближения. Полное время преобразования 8-разрядного АЦП в составе модуля ATD складывается из четырех интервалов:
• Интервал начального запуска, состоит из 2 периодов частоты тактирования модуля ATD;
• Неизменяемый интервал выборки аналогового сигнала, состоит из 4 периодов частоты тактирования модуля ATD;
• Регулируемый интервал выборки аналогового сигнала, его длительность программируется посредством установки битов SMP1:SMP0 в регистре управления ATDCTL4;
• Интервал преобразования напряжения на выходе устройства выборки и хранения аналого-цифровым преобразователем, состоит из 10 периодов частоты тактирования модуля ATD.
Рис. 4.86. Структура системы тактирования модуля ATD
Структурная схема подсистемы тактирования модуля ATD представлена на рис. 4.86. На вход подсистемы поступает импульсная последовательность PCLK с частотой fBUS. Эта импульсная последовательность поступает на вход программируемого делителя частоты.
Частота тактирования модуля аналого-цифрового преобразования ATDclock формируется из PCLK путем деления двумя делителями частоты. Коэффициент деления первого делителя переменный, определяется пятью битами PRS4…PRS0 регистра ATDCTL4. Численное значение коэффициента равно десятичному эквиваленту пятиразрядного двоичного кода PRS4…PRS0 плюс 1.
Например, если в разрядах PRS4…PRS0 записан код 00101b, то коэффициент деления равен шести (5+1). Коэффициент деления второго делителя равен двум. Поэтому в рассматриваемом примере частота тактирования модуля ATD составит fBUS/12.
Биты SMP1:SMP0 определяют регулируемый интервал выборки аналогового сигнала. Мы уже установили, что полное время одного аналого-цифрового преобразования равно 16 периодов частоты модуля ATD плюс регулируемый интервал выборки. На рис. 4.87 представлены четыре возможные комбинации кодов в разрядах SMP1:SMP0 и соответствующие им времена регулируемого интервала выборки и полного времени преобразования. Из рис. 4.87 следует, что минимальное время одного аналого-цифрового преобразования составляет 18 периодов, а максимальное — 32 периода частоты тактирования модуля ATD.
SMP1:SMP0 | Время выборки (периоды ADTclock) | Полное время 8-разрядного преобразования (периоды ADTclock) |
---|---|---|
00 | 2 | 18 |
01 | 4 | 20 |
10 | 8 | 24 |
11 | 16 | 32 |
Рис. 4.87. Выбор времени аналого-цифрового преобразования в модуле ATD
Бит S10BM определяет разрядность аналого-цифрового преобразования. При S10BM=0, АЦП в составе модуля формирует 8-разрядный код измеряемого сигнала, при S10BM=1 разрядность кода равна 10.
Рис. 4.88. Формат регистра ATDCTL5
Регистр управления ATDCTL5 используется для выбора режима работы модуля ATD, его биты определяют номер канала измеряемого сигнала, а также осуществляют запуск АЦП на преобразование. Регистр ATDCTL5 располагается в памяти по адресу $0065, его формат представлен на рис. 4.88. Назначение отдельных битов регистра следующее:
S8CM:
Этот бит определяет число аналого-цифровых преобразований в одной последовательности. При S8CM = 0 число преобразований равно 4, при S8CM = 1 число преобразований составляет 8.
SCAN:
Бит включения сканирования. При SCAN = 0 производятся четыре или восемь последовательных измерений (одна измерительная последовательность) и заполняются четыре/восемь регистров результата. При SCAN = 1 измерения производятся непрерывно, после завершения одной последовательности автоматически запускается следующая. Регистры результата заполняются по мере поступления новых данных.
MULT:
Бит выбора многоканального или одноканального режима работы. При MULT = 0 АЦП выполняет четыре/восемь последовательных измерений по одному каналу, выбранному в зависимости от комбинации битов CD…CA. При MULT = 1 измерения производятся последовательно для группы из четырех/восьми каналов, выбираемых в зависимости от комбинации битов CD:CC. При этом каждому каналу соответствует определенный регистр результата.
CD, CC, CB, CA:
Эти биты предназначены для выбора каналов, подключаемых к АЦП. Соответствие различных комбинаций битов CD…CA и номеров каналов, подлежащих оцифровке, устанавливает таблица рис. 4.89.
S8CM | CD | CC | CB | CA | Номер канала | Регистр результата при MULT=1 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | AN0 | ADR0 |
0 | 1 | AN1 | ADR1 | |||
1 | 0 | AN2 | ADR2 | |||
1 | 1 | AN3 | ADR3 | |||
0 | 0 | 1 | 0 | 0 | AN4 | ADR0 |
0 | 1 | AN5 | ADR1 | |||
1 | 0 | AN6 | ADR2 | |||
1 | 1 | AN7 | ADR3 | |||
0 | 1 | 0 | 0 | 0 | Зарезервирован | ADR0 |
0 | 1 | Зарезервирован | ADR1 | |||
1 | 0 | Зарезервирован | ADR2 | |||
1 | 1 | Зарезервирован | ADR3 | |||
0 | 1 | 1 | 0 | 0 | VRH | ADR0 |
0 | 1 | VRL | ADR1 | |||
1 | 0 | (VRH+VRL)/2 | ADR2 | |||
1 | 1 | Зарезервирован | ADR3 | |||
1 | 0 | 0 | 0 | 0 | AN0 | ADR0 |
0 | 0 | 1 | AN1 | ADR1 | ||
0 | 1 | 0 | AN2 | ADR2 | ||
0 | 1 | 0 | AN3 | ADR3 | ||
1 | 0 | 0 | AN4 | ADR4 | ||
1 | 0 | 1 | AN5 | ADR5 | ||
1 | 1 | 0 | AN6 | ADR6 | ||
1 | 1 | 1 | AN7 | ADR7 | ||
1 | 1 | 0 | 0 | 0 | Зарезервирован | ADR0 |
0 | 0 | 1 | Зарезервирован | ADR1 | ||
0 | 1 | 0 | Зарезервирован | ADR2 | ||
0 | 1 | 1 | Зарезервирован | ADR3 | ||
1 | 0 | 0 | VRH | ADR4 | ||
1 | 0 | 1 | VRL | ADR5 | ||
1 | 1 | 0 | (VRH + VRL)/2 | ADR6 | ||
1 | 1 | 1 | Зарезервирован | ADR7 |
Рис. 4.89. Выбор номера канала для оцифровки
Анализируя таблицу рис. 4.89, обратите внимание, что выделенные цветом разряды не оказывают влияния на номер выбранного канала, если бит MULT установлен в 1. Таким образом, при MULT = 1 измерения проводятся для последовательности из четырех каналов, если S8CM = 0. Номера каналов определяются комбинацией битов CD:CC. Если S8CM = 1, то при MULT = 1 измерения проводятся для последовательности из восьми каналов. Номера каналов определяются значением бита CD.
Если бит MULT установлен в 0, то все CD…CA определяют номер канала, для которого будут произведены четыре (при S8CM = 0) или восемь (при S8CM = 1) последовательных преобразований.
Также обратите внимание, что при S8CM:CD = 01/10b ко входу АЦП подключаются сигналы линий VHLи VRL, что позволяет измерить текущее значение опорного напряжения и тем самым повысить точность аналого-цифрового преобразования.
Перед рассмотрением следующих групп регистров специальных функций модуля ATD, проверьте степень усвоения материала в процессе ответа на следующие вопросы.
1. Какой код должен быть записан в регистр управления ATDCTL2 для того, чтобы включить модуль ATD и назначить обычный способ сброса флагов событий в модуле?
Ответ: Для включения модуля флаг ADPU должен быть установлен в 1. Этот флаг располагается в разряде 7 регистра. Для назначения обычного способа сброса флагов событий модуля следует установить бит AFFC в 0. Бит AFFC располагается в разряде 6 регистра. Поэтому в регистр управления ATDCTL2, располагающийся по адресу $0062, должен быть записан код 10000000 b или $80.
2. Запишите выражение на Си для выполнения инициализации регистра ATDCTL2 кодом предыдущего вопроса.
Ответ:
ATDCTL2 = 0x80;
3. Какой код должен быть записан в регистр управления ATDCTL5 для того, чтобы назначить для модуля режим многократного преобразования, при этом измерительная последовательность должна производить оцифровку 8 входных сигналов.
Ответ: Для организации заказанного режима следует установить бит S8CM в 1 (бит 6 регистра ATDCTL5), бит SCAN также в 1 (бит 5), бит MULT в 1 (бит 4), бит CD в 0 (бит 3), остальные биты CC, CB и CA значения не имеют.
Обобщая, в регистр управления ATDCTL5, расположенный по адресу $0065, должен быть записан код 01110000 b или $70.
4. Запишите выражение на Си для выполнения инициализации регистра ATDCTL5 кодом предыдущего вопроса.
Ответ:
ATDCTL5 = 0x70;
5. Каковы преимущества использования АЦП в режиме преобразования с 10-разрядным выходным кодом относительно 8-разрядного кода оцифровки?
Ответ: При 10-разрядном выходном коде разрешающая способность АЦП выше. Она составляет 4,88 мВ по сравнению с 19,53 мВ для 8-разрядного кода. Численные значения разрешающей способности приведены для UREF=5,0 В.
Рис. 4.90. Формат регистра состояния ATDSTAT
Регистр состояния ATDSTAT — это двухбайтовый регистр, который располагается в памяти по адресам $0066 и $0067. Регистр содержит в себе группу флагов, которые отражают текущее состояние аналого-цифрового преобразования в модуле ATD. Формат регистра представлен на рис. 4.90.
Флаг SCF (Sequence Complete Flag) автоматически устанавливается в 1, если все преобразования назначенной измерительной последовательности завершены. Если модуль находится в режиме однократного преобразования, то бит SCF установится после завершения исполнения измерительной последовательности из 4 или 8 преобразований. При работе модуля в режиме многократного преобразования, бит SCF установится после завершения первой измерительной последовательности.
Бит AFFC в регистре управления ATDCTL2 определяет способ сброса всех флагов в регистре состояния, в том числе и бита SCF. Если бит AFFC установлен в 0, то бит SCF обнуляется автоматически при выполнении операции записи в регистр управления ATDCTL5 для запуска новой измерительной последовательности. Если же бит AFFC установлен в 1, то бит SCF также сбрасывается автоматически при чтении одного из регистров результата.
Биты CC2…CC1 вместе составляют трехразрядный двоичный счетчик, который показывает номер текущего аналого-цифрового преобразования и, как следствие, номер регистра результата, в который будет занесен код очередного преобразования.
Каждый из восьми флагов завершения преобразования CCF7…CCF0 соответствует одноименному регистру результата ADR7H…ADR0H (бит CCF7 регистру ADR7H, бит CCF6 регистру ADR6H и т.д.). Биты CCF7…CCF0 устанавливаются автоматически, когда в процессе выполнения измерительной последовательности произошла запись в одноименный регистр результата. Если флаг AFFC установлен в 1, то биты CCF7…CCF0 сбрасываются автоматически при чтении одноименного регистра результата. При AFFC = 0 биты CCF7…CCF0 сбрасываются при чтении регистра состояния ATDSTAT, т.е. регистра с этими битами. Биты CCF7…CCF0 предназначаются для программного опроса с целью выяснения, завершилось или нет определенное аналого-цифровое преобразование в составе измерительной последовательности.
Обслуживание модуля ATD — альтернативная функция линий порта AD. Линии порта AD могут использоваться не только в качестве аналоговых входов модуля ATD, но и как линии порта ввода общего назначения. Каждый порт МК обладает регистром данных. Для порта AD 8-разрядный регистр данных PORTAD располагается в памяти по адресу $006F, формат этого регистра приведен на рис. 4.91. При выполнении операции чтения регистра данных порта логические сигналы на линиях AN7/PAD7…AN0/PAD0 отображаются в соответствующих разрядах регистра PORTAD.
Рис. 4.91. Формат регистра данных порта PORTAD
После завершения каждого преобразования в составе измерительной последовательности результат преобразования помещается в один из восьми регистров результата ADR0H…ADR7H. Номер регистра определяется режимом работы модуля ATD и разрядами CD…CA регистра управления ATDCTL5 (рис. 4.89). Регистры результата ADR0H…ADR7H восьмиразрядные, в памяти располагаются по адресам $0070…$007E. Формат регистров ADR0H…ADR7H приведен на рис. 4.92.
Рис. 4.92. Формат регистров результата модуля ATD
В регистрах ADR0H…ADR7H результат аналого-цифрового преобразования представляется в прямом коде без знака. Диапазон возможных значений кодов — 0…255. Для представления результата в абсолютных единицах необходимо код результата разделить на число единиц полной шкалы, а затем умножить на напряжение полной шкалы:
UIZM = KIZM/256×UREF
1. Код измеренного напряжения на выходе 8-разрядного АЦП равен 10001010b. Потенциалы на входах опорных напряжений АЦП составляют URH=5,0 В и URL=0 В. Каково значение измеренного напряжения в Вольтах?
Ответ: Десятичный эквивалент двоичного кода 10001010b равен 138. Поэтому измеренное напряжение равно:
UIZM = KIZM/256×UREF = (138/256) (5,0 – 0) = 2,69 В
Двухбайтовый регистр ATDTEST располагается в памяти по адресам $0068 и $0069. Доступ к этому регистру возможен только в специальном режиме работы МК. В обычном пользовательском режиме работы этот регистр для чтения и для записи недоступен.
4.22.3. Пример программирования модуля ATD
Для того чтобы воспользоваться модулем аналого-цифрового преобразования ATD для измерения уровня напряжения на нескольких аналоговых входах МК, необходимо выполнить следующие действия:
• Подключить источники стабилизированного напряжения ко входам опорного напряжения VRFи VRL. Необходимо помнить, что напряжение на входе высокого уровня опорного напряжения VRFне должно превышать 5,0 В, а на входе низкого уровня VRLнапряжение должно быть не менее 0 В. Кроме того, разность напряжений на входах VRFи VRL, равная напряжению полной шкалы АЦП UREF= URH–URL, не должна быть менее 2,5 В;
• Подключить источники измеряемых аналоговых сигналов ко входам AN0…AN7. Напряжение измеряемых сигналов должно находиться в диапазоне 0 В = USS≤UIZM≤UDD=5,0 В;
• Осуществить внутреннюю коммутацию напряжения питания к модулю ATD. Для этого записать 1 в бит ADPU регистра управления ATDCTL2. Адрес регистра — $0062;
• Выдержать паузу в 100 мкс для завершения переходных процессов в модуле ATD. В рассматриваемом ниже программном фрагменте мы покажем, как организовать такую задержку;
• Назначить режим работы модуля ATD посредством записи необходимых слов инициализации в управляющие регистры модуля;
• Запустить измерительную последовательность посредством записи в регистр управления ATDCTL5;
• Контролировать ход преобразования, используя флаги регистра состояния модуля ATDSTAT;
• Когда измерительная последовательность будет завершена, считать данные из регистров результата ADR0H…ADR7H в память МК;
• Если экономия энергии важна для Вашего применения, следует выключить модуль ATD, установив бит ADPU регистра ATDCTL2 в 0.
Мы рассмотрим программную реализацию действий по управлению модулем аналого-цифрового преобразования на примере простейшего цифрового вольтметра.
Программный фрагмент voltmeter.c производит измерение аналогового сигнала на входе AN6. Измерительная последовательность состоит из четырех преобразований. Режим измерения однократный. Результаты четырех последовательных преобразований одного и того же сигнала располагаются в четырех регистрах результата ADR0H…ADR3H. Эти измерения усредняются, что позволяет снизить влияние шумов. Полученный 8-разрядный двоичный код преобразуется к истинному значению измеряемого напряжения, умноженному на 100 d. Умножение на нормирующий коэффициент (100 в десятичной системе счисления) необходимо, чтобы использовать в программе целочисленные форматы представления данных. Полученный результат содержит одну десятичную цифру целой части измеренного напряжения, это единицы Вольт. А также две цифры десятичной дробной части. Это десятые и сотые доли Вольт в представлении результата. Промежуточные результаты исполнения программы, а также измеренное напряжение выводятся на экран персонального компьютера.
/*------------------------------------------------------------------------*/
/* filename: voltmeter.c */
/* В этом примере реализован простейший цифровой вольтметр. */
/* Программа выполняет одно измерение и выводит данные на экран */
/* персонального компьютера. Для того, чтобы выполнить следующее измерение*/
/* следует перезапустить программу */
/*------------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
#include
#define DECIMAL 0х2Е /*определить код точки на экране*/
#define V 0х56 /*определить код символа "V" для экрана*/
/*используемые функции*/
void delay_100us(void);
void ADC_convert(void);
void delay_5ms (void);
void main(void) {
printf("HELLO\n"); /*вывести приветствие на экран*/
ATDCTL2 = 0х80; /*включить питание модуля, запретить */
/*прерывания от модуля*/
printf("ADC\n");
delay_100us(); /*задержка 100мкс*/
printf("warmed up\n");
ATDCTL3 = 0х00; /*обеспечить доступ к модулю в отладочном режиме*/
ATDCTL4 = 0х01; /*установить 2 такта для времени выборки*/
/*и коэффициент деления, равный 4*/
printf("ready\n");
ADC_convert(); /*реализовать цифровой вольтметр*/
}
/*---------------------------------------------------------------------*/
/* Функция ADC_convert 4 измерения, усредняет их, вычисляет абсолютное */
/* значение напряжения, а затем преобразует результат в коды ASCII для */
/* вывода на экран */
/*---------------------------------------------------------------------*/
void ADC_convert(void) {
unsigned int sumadr;
unsigned int avg_bin_voltage;
unsigned int int_voltage;
unsigned int ones_int;
unsigned int tenths_int;
unsigned int hundreths_int;
char ones;
char tenths;
char hundreths;
ATDCTL5 = 0х06; /*4 преобразования в последовательности, канал 6*/
/* Ожидать завершения измерительной последовательности*/
while((ATDSTAT & 0х8000) != 0х8000) {
;
}
/* Вывести коды преобразования на экран для контроля */
printf("%x %x %х %х\n" , ADR0H, ADR1H, ADR2H, АDR3Н);
/* Взять среднее от 4 измерений для устранения шума*/
sumadr = ADR0H + ADR1H + ADR2H + ADR3H;
avg_bin_voltage = sumadr/4;
/*Преобразовать результат из двоичного кода к абсолютному значению,*/
/* умноженному на 100 D, получится число в диапазоне от 0 до 500 D*/
int_voltage = (100*avg_bin_voltage/255) * 5;
/*Выделить старший разряд результата и преобразовать в код ASCII */
/* Правило преобразования: десятичная цифра +48*/
ones_int = int_voltage/100;
ones = (char) (ones_int + 48);
/*Выделить второй разряд результата (десятые доли) и преобразовать в
код*/
/* ASCII */
tenths_int = (int_voltage ones_int*100)/10;
tenths = (char) (tenths_int + 48);
/*Выделить третий разряд результата (сотые доли) и преобразовать в
код*/
/* ASCII */
hundreths_int = (int_voltage ones_int*100 tenths_int*10) / 1;
hundreths = (char) (hundreths_int + 48);
/*Вывести значение измеренного напряжения на экран */
printf("%c.%c%cV\n", ones, tenths, hundreths);
}
/*-----------------------------------------------------------------------*/
/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/
/* межмодульных магистралей МК составляет 8 МГц */
/*-----------------------------------------------------------------------*/
void delay_100us(void) {
int i;
for (i=0; i<50; i++) {
asm("nop");
}
}
/*------------------------------------------------------------------*/
/* Функция delay_5ms формирует задержку в 5мс, частота тактирования */
/* межмодульных магистралей МК составляет 8 МГц */
/*------------------------------------------------------------------*/
void delay_5ms(void) {
int i;
for (i=0; i<50; i++) {
delay_100us();
}
}
/*------------------------------------------------------------------*/
4.22.4. Обслуживание прерываний от модуля ATD
В рассмотренном примере использовался метод программного опроса триггера завершения измерительной последовательности SCF в регистре состояния ATDSTAT. В этом же регистре располагаются флаги CCF7…CCF0, которые устанавливаются автоматически, когда в процессе выполнения измерительной последовательности произошла запись в одноименный регистр результата. Флаги CCF7…CCF0 могут быть программно опрошены с целью выяснения, завершилось или нет определенное аналого-цифровое преобразование в составе измерительной последовательности. В относительно медленных приложениях такая необходимость отсутствует, поскольку малое быстродействие объекта управления позволяет прикладной программе дождаться окончания всей измерительной последовательности, и лишь затем начать выборку из регистров модуля ATD кодов результатов для проведения дальнейших расчетов.
Если же прикладная программа обслуживает достаточно динамичный объект, то может возникнуть необходимость выборки из регистров результата данных в процессе исполнения измерительной последовательности. Именно тогда и следует воспользоваться флагами завершения преобразования в отдельных каналах CCF7…CCF0. Прикладная программа должна запустить измерительную последовательность на исполнение, а затем контролировать состояние флага первого преобразуемого канала. Когда флаг установится, соответствующий регистр результата может быть считан. При этом во время выборки из памяти первого результата, будет продолжаться аналого-цифровое преобразование следующего сигнала. И так до завершения всей измерительной последовательности.
Программный опрос или поллинг (в англоязычной терминологии) — не единственный способ взаимодействия прикладной программы с модулем аналого-цифрового преобразования. Модуль ATD способен генерировать запросы на прерывание по завершению исполнения измерительной последовательности. Прерывания разрешаются посредством установки бита ASCIE регистра ATDCTL2 в 1. При этом запрос на прерывание генерируется, если устанавливается бит ASCIF в том же регистре. Этот же бит следует сбросить в подпрограмме прерывания, чтобы по завершению следующей измерительной последовательности был сгенерирован новый запрос. Обратите внимание на некоторую особенность битов состояния модуля ATD. Существует два бита завершения исполнения измерительной последовательности: бит ASCIF в регистре управления ATDCTL2 и бит SCF в регистре состояния ATDSTAT. При этом первый бит используется в прерываниях, а второй при программном опросе.
4.23. Особенности модуля ATD в составе МК семейства HCS12