Как работать с АЦП и ЦАП
в микроконтроллерах SiLabs
Елена ЛАМБЕРТ
Одним из бурно развивающихся направлений в электронной промышленности является создание полностью интегрированных систем управления, включающих блоки для аналоговой и цифровой обработки сигнала. Большой спрос на сложные системы управления с высокоскоростными и точными аналоговыми и цифровыми преобразованиями определяет их развитие. Необходимым компонентом таких систем являются блоки для оцифровки аналоговых сигналов с целью их дальнейшей обработки. Компания SiLabs (www.silabs.com) — один из мировых производителей микросхем для совместной обработки аналоговых и цифровых сигналов. В данной статье рассматриваются принципы работы с интегрированными АЦП и ЦАП одного из 8-разрядных микроконтроллеров SiLabs (ранее выпускавшихся под маркой Cygnal), а также приводятся примеры программирования этих блоков.
Общие сведения
Восьмиразрядные микроконтроллеры SiLabs имеют следующие особенности:
• высококачественная аналоговая периферия;
• знакомый многим разработчикам набор команд x51 на высокопроизводительном ядре;
• надежность и устойчивость в работе;
• низкое энергопотребление;
• миниатюрность корпусов микросхем;
• минимальное количество требуемых внешних элементов.
Удачное сочетание этих характеристик и высокое качество продукции Cygnal способствовали быстрому росту продаж микроконтроллеров и их дальнейшему развитию. В 2000 году компания выпустила микроконтроллер размером 3x3 мм, а в начале 2002 года— самый быстрый (и по сегодняшний день)
8-разрядный микроконтроллер с производительностью до 100 MIPS.
С момента приобретения Cygnal компанией Silicon Laboratories (SiLabs) коллектив уже бывшей компании Cygnal достиг новых высот: в 2003 году был выпущен микроконтроллер с 24-разрядным сигма-дельта АЦП,
а в 2004 году — микроконтроллер с 16-разрядным АЦП последовательного приближения с частотой выборки до 1 млн отсчетов в секунду (Msps).
Все продукты компании пользуются высокими оценками экспертов в области аналоговой и цифровой обработки сигналов. По результатам исследований Annual Creativity in Electronics (ACE) Awards 2005, проводимых независимым еженедельником EE Times, микроконтроллер C8051F064 признан «Продуктом года» среди микросхем для аналоговой обработки сигналов. И это уже не говоря о том, что C8051F064 — микроконтроллер. Следует добавить, что изучение платформы SiLabs уже начинают включать в обязательную программу изучения некоторых кафедр высших учебных заведений, работающих в области измерительной техники.
Параметры точности и быстродействия аналоговых блоков микроконтроллеров SiLabs зачастую превосходят параметры отдельных АЦП и ЦАП той же ценовой категории. В качестве примера можно привести АЦП AD7677, точность которого немного уступает точности АЦП микроконтроллера
C8051F064, а стоимость в три раза превышает стоимость C8051F064.
В таблице 1 приведены параметры АЦП некоторых микроконтроллеров SiLabs.
C8051F020 — микроконтроллер общего назначения
В данной статье в качестве «базового» устройства будем рассматривать микроконтроллер C8051F020 фирмы SiLabs. Как видно из таблицы 1, он уступает другим микроконтроллерам SiLabs по характеристикам АЦП, но является неплохим примером для демонстрации работы аналоговой подсистемы, имеющейся на кристалле.
В аналоговую подсистему рассматриваемого микроконтроллера входят один 8-разрядный и один 12-разрядный АЦП последовательного приближения, а также два 12-разрядных ЦАП. C8051F020 содержит операционный усилитель с программируемым коэффициентом усиления (PGA), аналоговый мультиплексор (8 каналов и 9 каналов), 2 компаратора, источник опорного напряжения и температурный датчик. Эти узлы показаны на рис. 1.
Для поддержки работы АЦП и ЦАП кристалл содержит источник опорного напряжения 2,43 В, который имеет температурную нестабильность 15 ppm/°C. Максимальный ток нагрузки источника опорного напряжения составляет 200 мкА. При использовании внешнего источника опорного напряжения этот блок может быть программно отключен.
Важной особенностью АЦП SiLabs является то, что для осуществления аналогово-цифровых преобразований не нужно останавливать цифровую подсистему микроконтроллера. Аналоговая и цифровая подсистемы
Таблица 1. Таблица параметров АЦП некоторых кристаллов SiLabs
АЦП последовательного приближения Сигма-дельта АЦП
Семейство C8051F300 C8051F330 C8051F020 C8051F005 C8051F064 C8051F350
Разрешение 8 бит 10 бит 8 бит 12 бит 12 бит 16 бит 24 бит
Частота выборки, ере 500k 200k 500 1000 100k 1M 1000
Сигнал/шум+искажения (SINAD) 48 дБ 55,5 дБ 47 дБ 66 дБ 66 дБ 89 дБ 2,4 мкВ*
Интегральная нелинейность, LSB ±0,5 ±0,5 ±1 ±1 ±0,5 ±0,75 ±15 ppm
Дифференциальная нелинейность, LSB ±0,5 ±0,5 ±1,0 ±1,0 ±1,0 ±0,5 -
Смещение ±0,5 LSB ±1 LSB ±0,5 LSB ±3 LSB ±3 LSB 0,008% FS 0,002% FS
Источника опорного напряжения, В - 2,4 2,43 2,4 2,4 2,5
Примечания:
* при коэффициенте усиления, равном 1, и частоте выборки 10 отсчетов в секунду; FS — full scale, погрешность полной шкалы (мультипликативная погрешность);
LSB — least significant bit, младший значащий разряд (МЗР).
/RST
MONEN ЕЬ
XTAL1 В— XTAL2 IEH-
VREF КН-VREFD й—
DAC1 КН-
DAC0
VREF0 AI N0.0 AINO. 1 AI N0.2 AI N0.3 AI N0.4 AIN0.5 AIN0.6 AIN0.7
CP0+
СР0-
CP1+
CP1-
► ► JTAG Logic Boundary Scan
► и Debug HW
=D-
VDD
Monitor
WDT
External
Oscillator
Cirouit
Internal
Oscillator
System
Clock
VREF
8
0
5
1
С
о
г
e
“Г
SFR Bus
64 kbyte FLASH
256 byte RAM
Port I/O
Config.
UART0 «
U ART 1
Timers 0,
1,2,4
ТітегЗ/ RTC
P0,P1,
Latches
Crossbar
Config.
4 kbyte RAM
External Data Memory Bus
ЧІ
л
ADC
500ksps
(8-Bit)
A
M
U
X
■И Po.o
P0.7
I P1.0/AIN1.0 I P1.7/AIN1.7
I P2.0 I P2.7
I P3.0 I P3.7
№---►
A ; i\ / ADC
M SS>—►< lOOksps
U X ^ \ (12-bit)
►I TEMP
I P4 Latch
a>
P4 Ай
DRV
«—►El
«—HEI
I P5 LatcîT
ЭД
P5
DRV
I P6 LatclT
P6
DRV
P5.0/A8
Ай P5.7/A15 P6.0/A0
P6.7/A7
I P7 LatcîT
ЭД
P7
DRV
«—►El P7.0/D0 «—HEI P7.7/D7
Рис. 1. Блок-схема C8051F020
ANALOG PERIPHERALS
10/12-bit lOOksps
ADC
8-bit [500ksps ADC
VOLTAGE
COMPARATORS
DIGITAL I/O
UART0
UART1
SMBus
SPI Bus
PCA
Timer 0
Timer 1
Timer 2
Timer 3
Timer 4
PortO
Port 1
Port 2
Port 3
HIGH-SPEED CONTROLLER CORE
8051 CPU (25 MIPS)
64 KB ISP FLASH
4352 В SRAM
JTAG
22 DEBUG CLOCK SANITY
INTERRUPTS CIRCUITRY CIRCUIT CONTROL
Рис. 2. Блок-схема микроконтроллера C8051F02x
разделены на кристалле таким образом, что работа последней не вносит помех в работу первой.
Для задания режимов работы узлов кристалла используются регистры специальных функций (SFR), позволяющие упростить
работу с аналоговой периферией. Все настройки осуществляются программно путем записи соответствующих значений в регистры. В следующем разделе реализация данной идеологии будет рассмотрена более детально.
Не следует забывать, что С8051Р020 является микроконтроллером. Из его характеристик отметим следующее. Он позволяет получить пиковую производительность 25 М1Р8, содержит ИазЬ-память программ объемом 64 кбайт, а также 4352 байт ОЗУ. Цифровая подсистема кристалла включает пять 16-разрядных счетчиков-таймеров, сторожевой таймер, последовательные интерфейсы (два ИЛИТ, вМВш и БРШш) (рис. 2). Для внутрисхемной отладки и программирования предназначен интерфейс ГГЛО. Микроконтроллер имеет 64 линии ввода-вывода и выпускается в корпусе TQFP100. Диапазон питающих напряжений составляет 2,7-3,6 В, рабочий температурный диапазон — индустриальный (-40...+85 °С).
Наличие интерфейса внешней памяти, который может работать в мультиплексированном и немультиплексированном режимах, позволяет увеличивать объем оперативной памяти. Ширина шины адреса интерфейса внешней памяти составляет 16 бит, шины данных — 8 бит.
Программирование АЦП и ЦАП
12-разрядный АЦП (АЦП0)
Подсистема АЦП0, показанная на рис. 3, состоит из 9-канального аналогового мультиплексора (AMUX0), операционного усилителя с программируемым коэффициентом усиления (PGA0) и 12-разрядного АЦП последовательного приближения (SAR). Максимальная частота дискретизации АЦП0 составляет 100 тысяч отсчетов/сек, которая определяется частотой системного тактового сигнала, деленной на значение, задаваемое битами AD0SC регистра ADC0CF.
Работа АЦП0 разрешается установкой бита AD0EN (ADC0CN.7) в 1. Если этот бит имеет значение 0, то подсистема АЦП0 находится в режиме низкого энергопотребления. Все режимы работы AMUX0, PGA0 и АЦП конфигурируются через регистры специальных функций (SFR).
8 каналов AMUX0 доступны для измерений внешнего сигнала, а 9-й подключен к температурному датчику на кристалле. Каждая пара входов мультиплексора может быть запрограммирована для работы либо в дифференциальном, либо в однопроводном режиме. AMUX0 по умолчанию инициализируется в однопроводном режиме. AMUX0 управляется двумя регистрами SFR:
регистром выбора канала AMX0SL и конфигурационным регистром AMX0CF (см. ниже раздел «Регистры специальных функций»).
PGA0 усиливает сигнал с выхода AMUX0 с коэффициентом, определенным конфигурационным регистром АЦП0 ADC0CF (см. табл. 7). PGA0 может быть запрограммирован с коэффициентом 0,5, 1, 2, 4, 8 или 16. По умолчанию коэффициент усиления равен 1.
Если АЦП разрешен, и сигналы на запуск преобразований не поступают, то, тем не менее происходит непрерывная выборка входного сигнала АЦП0. При установке бита AD0TM (регистра управления режимом выборки-хранения АЦП0 ADC0CN) в 1 АЦП0 функционирует в энергосберегающем режиме выборки-хранения. В этом режиме каждому преобразованию предшествует период выборки, равный 3 периодам частоты преобразования SAR0 (после сигнала запуска преобразования АЦП). При использовании внешнего сигнала CNVSTR для запуска АЦП в энергосберегающем режиме выборки-хранения АЦП0 осуществляет выборку только при низком сигнале CNVSTR, а преобразование запускается по переднему фронту CNVSTR (рис. 4). Режим выборки может быть отключен при переходе кристалла в энергосберегающий режим (standby или спящий режим).
При изменении конфигурации АЦП0 (например, изменение параметров PGA и MUX) для осуществления корректного преобразования необходимо учитывать минимальное время установки, обусловленное сопротивлением MUX, емкостью накопительных конденсаторов АЦП, сопротивлением внешнего источника сигнала, а также требуемой точностью преобразования. В data sheet приведена примерная формула расчета времени установки в зависимости от требуемой точности установления сигнала АЦП0. Так как в энергосберегающем режиме выборки после запуска каждого преобразования выборка длится 3 периода частоты преобразования АЦП, то для большинства приложений эти 3 периода будут перекрывать время установки. Минимальное значение времени установки составляет 1,5 мкс. Запуск преобразования АЦП0
Преобразование может быть запущено четырьмя разными способами в зависимости от состояния битов AD0CM1 и AD0CM0 в регистре ADC0CN (см. табл. 8):
1)программно (записью 1 в ADOBUSY);
2) по переполнению Таймера 2;
3) по переполнению Таймера 3;
4) по внешнему сигналу (по переднему фронту на CNVSTR).
Бит AD0BUSY устанавливается в 1 во время преобразования и сбрасывается в 0 после завершения преобразования. Задний фронт AD0BUSY инициирует прерывание (если разрешено) и устанавливает флаг прерывания AD0INT. Преобразованные данные сохраняются в регистры ADC0H и ADC0L и могут быть выровнены либо по левому, либо по правому краю в этой паре регистров в зависимости от состояния бита AD0LJST (ADC0CN.0):
• Если AD0LJST = 0, то результат преобразования АЦП выравнивается по правому краю пары регистров и будет храниться в ADC0H[3:0]:ADC0L[7:0]. Причем ADC0H[7:4] является знаковым разрядом ADC0H.3 для дифференциальных данных, в противном случае он принимает значение 0000b.
• Если AD0LJST = 1, то результат выравнивается по левому краю и будет храниться в ADC0H[7:0]:ADC0L[7:4] иADC0L[3:0] = = 0000b.
Примеры:
• Если выходное слово данных ADC0 = FFFH (111111111111 b) и AD0LJST = 0, то в регистр результата будет записано ADC0H:ADC0L = = 0FFFH (0000111111111111).
• Если AD0LJST = 1, то ADC0H:ADC0L = = FFF0H (1111111111110000b).
Формат результата преобразования 12-разрядного АЦП
Связь входных аналоговых значений с данными в регистре результата преобразования АЦП0 можно вычислить по следующей формуле (при AD0LJST = 0):
CNVSTR . ( AD0STM11:0]= 10)
Частота преобразования Г АЦП (SAR)
ADC0TM=1
ADC0TM=0
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
□лшшшплшшшишлл
Выборка Преобразование Энергосберегающий режим
/ Выборка /или преобразование Преобразование Выборка
Низкое' энергопотребление или преобразование
Рис. 4. Временная диаграмма 12-разрядного АЦП с запуском по внешнему сигналу
ADCOCode = Vinxr^= x2”.
VKtt
где Vin — значение напряжения входного аналогового сигнала (В); Gain — коэффициент усиления PGA0; VREF — значение опорного напряжения (В); n — разрядность результата, n = 12 для однопроводных и n =11 для дифференциальных входов.
Рассмотрим пример, где AIN0 используется как вход в однопроводном режиме (AMX0CF = 00H и AMXSL = 00H), а коэффициент усиления равен 1. Результаты преобразования для различных значений входного сигнала приведены в таблице 2.
Таблица 2
Значение входного напряжения AIN0-AGND, В ADC0H:ADC0L (AD0LJST = 0) ADC0H:ADC0L (AD0LJST = 1)
VREF х 4095 VRE x 409б 0FFFH FFF0H
VREF 2 0800H 8000H
VREF x 2047 VRtF X 4096 07FFH 7FF0H
0 0000H 0000H
Таблица 3
AIN0-AIN1, В ADC0H:ADC0L (AD0LJST = 0) ADC0H:ADC0L (AD0LJST = 1)
VREF x 2047 VRtF X 2048 07FFH 7FF0H
VREF 2 0400H 4000H
VREF X 2048 0001H 0010H
0 0000H 0000H
-VREF X 204s FFFFH (-1d) FFF0H
VREF 2 FC00H(-1024d) C000H
-VREF F800H (-2048d) 8000H
в 1 определение окончания преобразования можно производить опросом бита АБОЮТ (АОС0СМ5). Рекомендуемая последовательность действий при процедуре опроса:
1. Сброс АБОЮТ в 0.
2. Установка AD0BUSY в 1.
3. Ожидание 1 в АБОЮТ.
4. Обработка результата преобразования АЦПО.
Пример 1
Установка Уге£
Разрешение внутреннего источника опорного напряжения, а также выбор опорного значения напряжения для АЦПО с вывода VREF0
MOV REF0CN, #00000011b
Тактовая частота 16 МГц от внутреннего генератора
MOV OSCIN,
MOV A,
JNB ACC.4,
#10000111Ь ; Разрешение внутреннего ; генератора (16 МГц)
; опрос IFRDY->1 (ожидание ;запуска генератора)
OSCIN
IFRDY_wait
Конфигурирование АЦП0 для использования AIN0 в однопроводном режиме Другие входы не используются.
Если AIN0 и AIN1 используются как входы в дифференциальном режиме (AMX0CF = 01H и AMXSL = 00H) и коэффициент усиления равен 1, получим следующие результаты (табл. 3).
MOV ADC0CF, #10000000b
MOV AMX0CF, #00H
MOV AMX0SL, #00H MOV ADC0CN, #10001101b
Задание режимов работы АЦПО рекомендуется выполнять в следующей последовательности:
1. Задание конфигурации опорного напряжения (REF0CN).
2. Установка тактовой частоты преобразования SAR0 и коэффициента усиления РОАО (ADC0CF).
3. Задание конфигурации входных каналов мультиплексора (AMX0CF).
4. Выбор требуемого входного канала мультиплексора (AMX0SL).
5. Установка соответствующего бита управления, выбор режима запуска преобразования и разрешение работы АЦПО (ADC0CN). Другие входные каналы мультиплексора
(шаг 3) могут быть выбраны при процедуре обработки прерывания (ISR) в АЦПО после преобразования входного сигнала на текущем канале и сброса бита AD0INT. Сигнал на заново выбранном канале будет преобразован в следующем цикле. После инициализации преобразования установкой AD0BUSY
Тактовая частота преобразования SAR0941 кГц, коэф. усиления = l 8 входов в однопроводном режиме
Выбор входа AIN0 Разрешение АЦП0 (режим непрерывной выборки, преобразование инициализируется по переполнению Таймера 2, данные выровнены по левому краю).
Пример 2: измерение температуры с использованием встроенного температурного датчика (9-й канал АЦПО). У микроконтроллера C8051F020 точность внутреннего осциллятора невысокая и составляет 20%, поэтому в данном примере используется тактовый генератор с внешним кварцевым резонатором.
//-- Используется Таймер 3 (прерывания по переполнению)
//-- Используется внешний кварцевый резонатор 22.1184 МГц:
//-- Измерения проводятся датчиком температуры
//-- на кристалле сиспользованием АЦП0
//-- ADCOJTemp.C
#include <c8051f020.h>
//----------------------------------------------------------
// Определение 16-битных регистров SFR для C8051F020 //----------------------------------------------------------
// Значение перезагрузки Таймера 3 // счетчик Таймера 3 // данные АЦП0
sfrl6 TMR3RL=0x92; sfrl6 TMR3=0x94; sfrl6 ADC0=0xbe;
//---------------------------------------------------------------
// Глобальные константы
//---------------------------------------------------------------
#define SYSCLK 22118400 //-- Внешний кварцевый резонатор //-- на 22МГц
sbit LED = Р1л6; //-- светодиод подключен к P1.6
unsigned int ADC0_reading; //- переменная для хранения //--значения АЦП0
//-- прототипы функций-------------------------------------------
void Init_Clock(void); //-- Инициализация тактового
//-- генератора с внешним кварцем void Init_Port(void); //-- Конфигурация цифрового
//-- коммутатора Crossbar //-- ипортов GPIO void Init_ADC0(void) ; //-- Инициализация АЦП0
void Init_Timer3(unsigned int counts); //-- Запуск Таймера 3 void Timer3_ISR(void); //-- Функция обработки прерывания //-- Таймера 3
//---------------------------------------------------------------
void main(void)
{
//-- Запрещение глобальных прерываний //-- (предпочтительно запрещать //-- все прерывания до окончания //-- инициализации)
WDTCN = 0xDE; //- Запрещение сторожевого таймера WDTCN = 0xAD;
Init_Clock() ;
Init_Port() ;
Init_ADC0() ;
LED = 0; //- Отключение светодиода LED
//-- Инициализация Таймера 3 в режиме автоматической
//-- перезагрузки с генерацией
//-- прерываний по переполнению
Init_Timer3(SYSCLK/12/10);
EA = 1; //-- Разрешение глобальных прерываний
while(1) //-- Бесконечный цикл
{
}
}
//------------------------------------------------------------
void Init_Clock(void)
{
OSCXCN =0x67; //-- 0110 0111b
//-- Биты управления тактового генератора с внешним
// кварцем (XFCN2-0) устанавливаются в 111,
// т.к. частота кварца >6.7 МГц
// Биты режима работы генератора с внешним кварцем // (XOSCMD2-0) устанавливаются в110 //-- ожидание установки в 1 вывода XTLVLD //-- (стабилизации тактовой частоты) while ( !(OSCXCN & 0x80));
0SCICN=0x88; //-- 1000 1000b (задание режимы
//-- работы тактового //-- генератора с внешним кварцевым резонатором)
//- Бит 2 : Внутренний генератор отключен(IOSCEN = 0)
//- Бит 3 : Генератор с внешним кварцем используется //- как системная тактовая частота // (CLKSL = 1)
//- Бит 7 : Разрешение детектора исчезновения тактового //- сигнала (MSCLKE = 1)
}
//-----------------------
void Init_Port(void)
//-- инициализация Crossbar и портов //-- GPIO
XBR1=0x00
XBR2=0x40
//-- Глобальное разрешение Crossbar //-- ивключение резисторов «подтяжки» //-- (weak pull-ups). По умолчанию //-- на каждой линии встроен резистор //-- «подтяжки» (около 100 кОм)
//-- к линии питания VDD, который можно //-- запретить глобально P1MDOUTI=0x40; //-- разрешение линии P1.6 (светодиод) //-- в режиме push-pull
}
//-----------------------------------------------------------
//-- Конфигурация Таймера 3 на автоматическую перезагрузку //-- и генерацию прерывания
//-- через интервал, определенный <counts>, используя SYSCLK/12 //-- в качестве единицы отсчета void Init_Timer3 (unsigned int counts)
{
TMR3CN=0x00; //-- Остановка Таймера; Сброс TF3 (фла-
га переполнения Таймера 3);
//- SYSCLK/12 используется в качестве единицы отсчета
TMR3RL = -counts; //-- Инициализация значения перезагрузки TMR3 = 0xffff; //-- Установка на немедленную перезагрузку EIE2 1= 0х01; //-- Разрешение прерываний от Таймера 3
TMR3CNI= 0х04; //-- Запуск Таймера 3 установкой TR3 // (TMR3CN.2) в1
}
//-----------------------------------------------------------
void Init_ADC0(void)
{
REF0CN = 0x07; //-- Разрешение внутреннего источника //-- опорного напряжения,
//-- выбор опорного значения для АЦП0 //-- свывода VREF0,
//-- включение встроенного //-- температурного датчика ADC0CF= 0x81; //-- частота преобразования SAR0?1.3 МГц, //-- усиление=2 AMX0SL= 0x08; //-- Выбор температурного датчика ADC0CN= 0x84; //-- Разрешение АЦП0, режим //-- непрерывной выборки Режим преобразования инициируется по переполнению на таймере 3, данные АЦП0 выровнены по правому краю
//
//
//
}
//------------------------------------------------------------------
//- Функция обработки прерывания (ISR) void Timer3_ISR (void) interrupt 14
{
TMR3CN &= ~(0x80); //-- сброс флага TF3
//-- ожидание окончания преобразования АЦП0 while ( (ADC0CN& 0x20) ==0) //-- опрос AD0INT->1 ADC0_reading = ADC0; //-- чтение данных АЦП0
ADC0CN S= 0xDF; //- сброс AD0INT
Переполнение Таймера 3 используется для инициализации преобразования АЦП0. Прерывание (ЕШ2.0) от Таймера 3 также разре-
EA = 0
шено. Следовательно, переход к процедуре обработки прерывания (ISR) Таймера 3 выполняется одновременно с запуском преобразования АЦП. В начале процедуры происходит сброс TF3 (флага переполнения Таймера 3) и далее опрашивается флаг AD0INT (ожидается его установка в 1). Флаг AD0INT устанавливается в 1 после завершения преобразования АЦП. Далее значение преобразования АЦП считывается из регистра АЦП0 и записывается в переменную ADC0_reading.
Если нужно посмотреть значение переменной ADC0_reading в момент отладки программы, следует войти в окно редактора кода интегрированной среды разработки (IDE) Silicon Labs и нажатием правой кнопки мыши на имени переменной добавить ее в окно просмотра (Watch). При остановке программы данные в окне просмотра обновляются, отображая последнее значение переменных.
Вместо использования метода опроса (как показано в вышеприведенном программном коде) также могут быть использованы прерывания от АЦП0, которые разрешаются установкой бита EADC0 (EIE2.1). Процедура обработки прерываний для АЦП0 будет вызываться каждый раз при завершении преобразования. При процедуре обработки прерываний необходимо считывать регистр АЦП0 и сохранять его значение, а уже после этого сбрасывать флаг AD0INT.
Пример 3: измерения аналоговых сигналов с использованием прерываний. Инициализа-ционный код АЦП и соответствующей процедуры обработки прерывания приведены ниже.
//-- ADC0_Temp_ISR.C
//---------------------------------------------------
void Init_ADC0(void)
{
REF0CN = 0х07; //-- Разрешение внутреннего источника //-- опорного напряжения,
//-- выбор опорного напряжения для АЦП0 //-- с вывода VREF0
//-- внутренний температурный датчик включен. ADC0CF= 0х81; //-- Частота преобразований SAR0 =1.3МГц,
//-- коэф. усиления =2 AMX0SL= 0х08; //-- Выбор температурного датчика ADC0CN= 0х84; //-- Разрешение АЦП0, режим непрерывной
//-- выборки, преобразование инициализируется //-- по переполнению Таймера 3, данные АЦП0 //-- выровнены по правому краю EIE2 1= 0х02; //-- Разрешение прерываний от АЦП
}
//---------------------------------------------------
void ADC0_ISR(void) interrupt 15
{
ADC0_reading = ADC0;
AD0INT = 0; //-- сброс флага прерываний окончания
//-- преобразования АЦП0
}
Таблица 5. Выбор канала AMUX0
Бит Символ Описание
7-4 - Не используется, Read = 0000, Write = не важно
3-0 AMX0AD3-0 AMX0 биты адреса 0000-1111: входы АЦП выбираются согласно таблице 5
Регистр AMUX0SL, биты 3-0 (AMX0AD3-0)
0000 0001 0010 0011 0100 0101 0110 0111 1xxx
0000 AIN0 AIN1 AIN2 AIN3 AIN4 AIN5 AIN6 AIN7 Темп. датчик
0001 Темп. датчик
0010 AIN0 AIN1 +(AIN2) -(AIN3) AIN4 AIN5 AIN6 AIN7 Темп. датчик
0011 +(AIN0) -(AIN1) +(AIN2) -(AIN3) AIN4 AIN5 AIN6 AIN7 Темп. датчик
0100 AIN0 AIN1 AIN2 AIN3 +(AIN4) -(AIN5) AIN6 AIN7 Темп. датчик
Регистр AMX0CF, Биты 3-0 0101 +(AIN0) -(AIN1) AIN2 AIN3 +(AIN4) -(AIN5) AIN6 AIN7 Темп. датчик
0110 AIN0 AIN1 +(AIN2) -(AIN3) +(AIN4) -(AIN5) AIN6 AIN7 Темп. датчик
0111 +(AIN0) -(AIN1) +(AIN2) -(AIN3) +(AIN4) -(AIN5) AIN6 AIN7 Темп. датчик
1000 AIN0 AIN1 AIN2 AIN3 AIN4 AIN5 +(AIN6) -(AIN7) Темп. датчик
1001 +(AIN0) -(AIN1) AIN2 AIN3 AIN4 AIN5 +(AIN6) -(AIN7) Темп. датчик
1010 AIN0 AIN1 +(AIN2) -(AIN3) AIN4 AIN5 +(AIN6) -(AIN7) Темп. датчик
1011 +(AIN0) -(AIM) +(AIN2) -(AIN3) AIN4 AIN5 +(AIN6) -(AIN7) Темп. датчик
1100 AIN0 AIN1 AIN2 AIN3 +(AIN4) -(AIN5) +(AIN6) -(AIN7) Темп. датчик
1101 +(AIN0) -(AIN1) AIN2 AIN3 +(AIN4) -(AIN5) +(AIN6) -(AIN7) Темп. датчик
1110 AIN0 AIN1 +(AIN2) -(AIN3) +(AIN4) -(AIN5) +(AIN6) -(AIN7) Темп. датчик
1111 +(AIN0) -(AIN1) +(AIN2) -(AIN3) +(AIN4) -(AIN5) +(AIN6) -(AIN7) Темп. датчик
АМиХО (АМХОСБ), регистр конфигурации АЦПО (АБСОСБ), управляющий регистр АЦПО (АБСОСК).
дмхови Регистр выбора канала ДМиХО
Входы мультиплексора (А1Ш-АВД7) могут быть запрограммированы для работы либо в дифференциальном, либо в однопроводном режиме. Это позволяет выбирать наиболее подходящий режим измерения, а также производить изменение режимов «на лету».
9-й канал мультиплексора подключен к температурному датчику на кристалле. В таблице 5 приведены все возможные комбинации режимов работы каналов АМИХ.
Таблица 6. АМХ0СР:
Конфигурационный регистр АМиХО
Таблица 7. ADC0CF: Регистр конфигурации АЦП0
Бит Символ
Биты установки частоты преобразования БАМ АЦП0
Частоту преобразования SAR0 получают из системной тактовой частоты по следующей формуле:
. вувак ,
AD0SC=
CTKZ
где AD0SC — 5-битное значение AD0SC4-0 и CLKSAR0 — требуемая частота преобразований SAR0 АЦП0
Внутренний усилитель с программируемым коэффициентом усиления (PGA) АЦП0
000: Коэф.= 1 001: Коэф.= 2 010: Коэф.= 4 011: Коэф.= 8 10x: Коэф.= 16 11x: Коэф.= 0,5
Регистры специальных функций (SFR) АЦП0
Опишем регистры выбора канала AMUX0 (AMX0SL), конфигурационный регистр
Таблица 4. AMX0SL — регистр выбора канала AMUX0
Бит Символ Описание
7-4 - Не используется, Read = 0000, Write = не важно
3 AIN67IC Конфигурационные биты пары входов AIN6, AIN7 0: AIN6 и AIN7 - однопроводные входы 1: дифференциальный вход AIN6-AIN7 (+, —)
2 AIN45IC Конфигурационные биты пары входов AIN4, AIN5 0: AIN4 и AIN5 - однопроводные входы 1: дифференциальный вход AIN4-AIN5 (+, —)
1 AIN23IC Конфигурационные биты пары входов AIN2, AIN3 0: AIN2 and AIN3 - однопроводные входы 1: дифференциальный вход AIN2-AIN3 (+, —)
0 AIN01IC Конфигурационные биты пары входов AIN0, AIN1 0: AIN0 and AIN1 - однопроводные входы 1: дифференциальный вход AIN0-AIN1 (+, -)
Для каналов, сконфигурированных как дифференциальные входы, слова результата преобразования АЦП0 имеют формат двоичного дополнительного кода.
Максимальная частота работы блока последовательного приближения (вАМ) АЦП0 составляет 2,5 МГц.
clksaro -
SYSCLK
ADOSC+Г (см таблицу 7)
Таким образом, если системная тактовая частота равна 16 МГц, и биты АБ08С4-0 установлены в 10000Ь, то частота преобразования вАМ = 16 МГц / 17 = 941,176 кГц. Следовательно, если в АЭС0СР записано значение 10 000 000, то частота преобразования 8АМ будет примерно равна 941 кГц, а коэффициент усиления РСА0 равен 1.
Регистры АЭС0Н и АЭС0Ь используются для хранения слов данных старших и младших значащих разрядов соответственно.
Для улучшения точности измерения АЦП предусмотрена функция программируемого «оконного детектора». В регистрах микроконтроллера программируются нижнее и верхнее значения отслеживаемого напряжения. Регистры А0С0СТН, А0С0СТЬ, АЭС0ЬТН и АЭС0ЬТЬ являются регистрами значений верхнего и нижнего порога выходного сигнала АЦП0 соответственно. В случае, если напряжение на входе АЦП выйдет за пределы заданных пороговых значений, генерируется соответствующее прерывание, избавляя пользовательскую программу от необходимости «рутинного» циклического опроса.
Описание
AD0SC4-0
AMP0GN2-0
Таблица 8. ADC0CN — управляющий регистр АЦП0 (адресуется побитно)
AD0EN Бит разрешения АЦП0 0: АЦП0 запрещен; 1: АЦП0 разрешен.
AD0TM Бит режима выборки АЦП0 0: Постоянная выборка входного аналогового сигнала до начала преобразования. АЦП должен быть разрешен. 1: Выборка при низком уровне внешнего сигнала на CNVSTR, преобразование запускается по переднему фронту на CNVSTR.
AD0INT Флаг прерывания по окончанию преобразования АЦП Примечание: Этот флаг должен быть сброшен программно в 0. 0: АЦП0 не закончил преобразование данных после последнего сброса этого флага. 1: АЦП0 завершил преобразование данных.
AD0BUSY Бит занятости АЦП0 0: Преобразование АЦП0 завершено или в настоящий момент не осуществляется. AD0INT устанавливается в 1 по заднему фронту AD0BUSY. 1: АЦП0 осуществляет преобразование.
3-2 AD0CM1-0 Выбор способа запуска преобразования АЦП0 Если AD0TM=0, то преобразование АЦП0 инициализируется: 00: При записи «1» в AD0BUSY. 01: По переполнению Таймера 3. 10: По переднему фронту внешнего сигнала на CNVSTR. 11: По переполнению Таймера 2. Если AD0TM=1: 00: Выборка запускается по записи «1» в AD0BUSY, длится 3 такта, далее следует преобразование. 01: Выборка запускается по переполнению Таймера 3 и длится 3 такта, далее следует преобразование. 10: АЦП0 осуществляет выборку при низком уровне на CNVSTR, преобразование запускается по переднему фронту внешнего сигнала на CNVSTR. 11: Выборка запускается по переполнению Таймера 2, длится 3 такта SAR, далее следует преобразование.
1 AD0WINT Флаг прерываний окна сравнения АЦП0 Примечание: Этот бит должен сбрасываться программно
0 AD0LJST Выбор выравнивания в АЦП0 0: Данные регистров ADC0H:ADC0L выровнены по правому краю. 1: Данные регистров ADC0H:ADC0L выровнены по левому краю.
8-разрядный АЦП (АЦП1)
Подсистема АЦП1 состоит из 8-канального аналогового мультиплексора (AMUX1), операционного усилителя с программируемым коэффициентом усиления (PGA1) и 8-разрядного АЦП последовательного приближения (SAR) (рис. 5). Схема работы с АЦП1 аналогична схеме работы с АЦП0, но есть отличия в некоторых деталях. Например, АЦП1 не поддерживает режим программируемого оконного детектора и имеет 5 режимов запуска преобразования (вместо 4). Максимальная скорость преобразования АЦП1 такая же, как у АЦП0, и составляет 100 ksps.
АЦП1 разрешается установкой бита AD1EN (ADC1CN.7) в 1. Если этот бит имеет значение 0, то подсистема АЦП1 находится в режиме низкого энергопотребления. Режимы преобразования данных AMUX1, PGA1 и АЦП1 конфигурируются через регистры специального назначения SFR.
8 каналов AMUX1 доступны для измерения внешнего сигнала и могут быть сконфигурированы только в однопроводном режиме. Канал мультиплексора выбирается регистром AMX1SL SFR. PGA1 усиливает выходной сигнал AMUX1 в число раз, определенное регистром конфигурации ADC1CF АЦП1 (возможные значения коэффициен-
— Write to AD1 BUSY
— Timer 3 Overflow —CNVSTR
— Timer 2 Overflow -Write to ADO BUSY
(synchronized with ADCO)
Рис. 5. Функциональная блок-схема АЦП1
тов усиления 0,5, 1, 2 или 4; по умолчанию, коэффициент равен 0,5).
Так как входы АЦП коммутируются на внешние выводы при помощи цифрового коммутатора (Crossbar), то аналоговые входы должны быть сконфигурированы установкой в 0 соответствующих битов в регистре P1MDIN. Вывод AIN1 выводится на Порт 1, в противном случае по умолчанию выводы Порта 1 устанавливаются в режим цифровых входов-выходов.
Пример:
Запуск преобразования АЦП1
Преобразование может запускаться пятью различными способами, в соответствии с установленными режимами запуска преобразования АЦП1 (АБ1СМ2-О) в регистре АБС1С№
1. Программно, записью 1 в AD1BИSY.
2. По переполнению Таймера 2.
3. По переполнению Таймера 3.
4. По внешнему сигналу (переднему фронту на CNVSTR).
5. Записью '1' в AD0BИSY (АБСОСК4) (инициализация преобразования АЦП1 и АЦПО одной программной командой).
12-разрядные ЦАП (ЦАПО и ЦАП1)
Подсистема ЦАП состоит из двух 12-разрядных ЦАП с потенциальными выходами: ЦАПО и ЦАП1. Оба ЦАП функционально идентичны и каждый конфигурируется через соответствующие регистры управления: БАСОСК и БАС1СК На рис. 6 показана функциональная блок-схема обоих ЦАП. Время установки сигнала на выходе ЦАП не превышает 1О мкс, при этом существует возможность синхронизации выходов ЦАП сигналами таймера.
В соответствии с входными значениями кода (от ОООН до БЕРН) выходной сигнал ЦАП будет принимать значения напряжения от О В до VREР. Опорное значение для каждого ЦАП подается на вывод VREFD.
Формирование вьходного сигнала
Команда на обновление значения выходного напряжения ЦАП формируется четырьмя способами:
MOV PlMDIN,#00000111b ; P1.7 — P1.3: аналоговый вход ; PI.2 — P1.0: цифровой вход
DACxDF 2-0 = ООО:
DACxH DACxL
I I I I MSB I I I I I I I I I I LSB
001:
DACxH DACxL
I I I MSB I I I I I I I I I I LSB I
010:
DACxH DACxL
I I MSB I I I I I I I I I I LSB I I
011:
DACxH DACxL
I MSB I I I I I I I I I I LSB I I I
1xx:
DACxH DACxL
MSB I I I I I I I I I I LSB I I I I
МБВ — старший значащий разряд; 1_БВ — младший значащий разряд.
Рис. 7. Формат данных ЦАП
Таблица 9. DACOCN — регистр управления ЦАП0
Бит Символ Описание
7 DAC0EN Бит разрешения ЦАП0 0: ЦАП0 запрещен. ЦАП0 в режиме низкого энергопотребления и вывод выхода всостоянии высокого импеданса. 1: ЦАП0 разрешен. ЦАП0 в рабочем состоянии и вывод выхода активен.
6-5 - Не используется. Read = 00, Write = не важно
4-3 DAC0MD1-0 Биты режима ЦАП0 Обновление выходного сигнала ЦАП происходит: 00: при записи в регистр DAC0H. 01: по переполнению Таймера 3. 10: по переполнению Таймера 4. 11: по переполнению Таймера 2.
2-0 DAC0DF2-0 Биты формата данных ЦАП0 (см. рис. 7) 000: Старшие 4 бита слова данных ЦАП0 в DAC0H[3:0], младшие 8 битов в DAC0L[7:0]. 001: Старшие 5 битов слова данных ЦАП0 в DAC0H[4:0], младшие 7 битов в DAC0L[7:1]. 010: Старшие 6 битов слова данных ЦАП0 в DAC0H[5:0], младшие 6 битов в DAC0L[7:2]. 011: Старшие 7 битов слова данных ЦАП0 в DAC0H[6:0], младшие 5 битов в DAC0L[7:3]. 1xx: Старшие 8 битов слова данных ЦАП0 в DAC0H[7:0], младшие 4 бита в DAC0L[7:4].
1. По запросу (запись в старший байт регистра слова данных ЦАПх, БАСхН, х = О или 1).
2. По переполнению Таймера 2.
3. По переполнению Таймера 3.
4. По переполнению Таймера 4.
Режим обновления выходного сигнала ЦАП по запросу является режимом по умолчанию. В этом режиме данные на выходе ЦАП обновляются при записи в регистр БАСхН.
Данные, записанные в БАСхЬ, сохраняются, но не отображаются на выходе ЦАП до записи данных в БАСхН. Поэтому для записи 12-разрядного слова данных в АЦП сначала следует записать регистр БАСхЬ, а потом БАСхН.
ЦАП могут быть использованы в 8-разрядном режиме с записью данных только в БАСхН (при этом БАСхЬ устанавливают обычно в ООН).
В режиме обновления выходного сигнала ЦАП по переполнению таймера выходной сигнал ЦАП обновляется независимо от процессора. Записанные в пару регистров ЦАП значения (БАСхЬ и БАСхН) сохраняются до переполнения соответствующего таймера. После этого содержимое БАСхН:БАСхЬ копируется во входные «защелки» ЦАП, обновляя значение на выходе.
Режим обновления выходного сигнала ЦАП по переполнению таймера удобно использовать для формирования периодического выходного сигнала, например, синусоиды с определенной выходной частотой. Формат входных данных
Формат 12-разрядного слова в регистрах БАСхН и БАСхЬ может быть сконфигурирован установкой соответствующих битов БАСхБР (БАСхСЩ2:О]). Пять вариантов формата слов показаны на рис. 7.
2. Запись в регистры входных данных требуемого 12-разрядного цифрового значения (БАСхН и БАСхЬ).
3. Установка соответствующего режима формирования входных данных и формата слов данных, разрешения ЦАПх фАСхСК7).
4. При необходимости конфигурирование и запуск соответствующих таймеров.
Пример
Установка Уге£
Разрешение внутреннего источника опорного напряжения. Выводы 1 и 2 порта 122 (^е£) отладочной платы для С8051Р020 должны быть подключены
к внутреннему источнику опорного напряжения, генерируемому на вход VREFD
MOV REF0CN, #00000011b
Конфигурирование и запуск ЦАП0
MOV DAC0H, #0FFh
MOV DAC0L, #0h
MOV DAC0CN, #10010100b
Разрешение ЦАП0 в режиме выравнивания по левому краю и обновления
по переполнению Таймера 4
Установка Таймера 4
Примечание: Системная тактовая частота = 22.1184МГц, тактовый генератор с внешним кварцем
ORL СКСОК #ОО1ОООООЬ ; Таймер 4 использует системную ; тактовую частоту MOV RCAP4L, #ОРЬ ; Установка времени перезагрузки
; в ОхРРОР
MOV RCAP4H, #ОРРЬ ; РРРР-РРОР = SYSCLK/ частота
; отсчетов ЦАП
; Частота отсчетов ЦАП =9216ОГц MOV ^4, RCAP4L ; Установка младшего байта
; Таймера 4 (^4) до запуска таймера MOV ТН4, RCAP4H ; Установка старшего байта Таймера 4
; (ТН4)
MOV Т4СОК #ООООО1ООЬ ; Запуск Таймера 4 в режиме
; 16-разрядной автоперезагрузки
формата слов данных на входе ЦАП осуществляется программно через регистр специальных функций (таблица 9).
DAC0H и DAC0L используются для хранения старшего и младшего байта слова данных ЦАП0 соответственно. Регистры специальных функций (SFR) ЦАП1 аналогичны SFR ЦАП0.
Заключение
Микроконтроллер C8051F020 удобно использовать во встраиваемых применениях, требующих высокой производительности, большой памяти программ и хороших характеристик АЦП/ЦАП. Следует добавить, что микроконтроллер C8051F020 был выпущен достаточно давно, в настоящее время фирма SiLabs выпускает новые микроконтроллеры с лучшими характеристиками, например C8051F064 с двумя 16-разрядными АЦП со скоростью преобразования 1 Msps, или C8051F350 с 24-разрядным сигма-дельта АЦП.
В заключение можно сказать, что микроконтроллеры с интегрированными АЦП и ЦАП являются удобным решением для систем сбора и обработки данных от многих датчиков. Уступая чисто аналоговой обработке только в быстродействии, такой микроконтроллер отличается большой функциональной гибкостью и точностью благодаря наличию обширной аналоговой и цифровой периферии, что значительно упрощает разработку конечного устройства. ■
Литература
Задание режимов работы ЦАП
Конфигурирование ЦАП необходимо выполнять в следующей последовательности:
1. Конфигурация опорного напряжения №ЕР0С№).
Регистры специальных функций (SFR) ЦАП0
Разрешение работы ЦАП, выбор режима обновления сигнала на выходе ЦАП, выбор
1. Data sheet C8051F02x.pdf (www.silabs.com)
2. Application Note AN122: Annotated 'C' examples for the 'F02x Family (www.silabs.com)
3. Moi Tin Chew, Gourab Sen Gupta. Embedded Programming with Field-Programmable Mixed-Signal ^Controllers. 2005.