Рубликатор

 



























Все о псориазе



Как работать с АЦП и ЦАП в микроконтроллерах SiLabs

Одним из бурно развивающихся направлений в электронной промышленности является создание полностью интегрированных систем управления, включающих блоки для аналоговой и цифровой обработки сигнала. Большой спрос на сложные системы управления свысокоскоростными и точными аналоговыми ицифровыми преобразованиями определяет их развитие. Необходимым компонентом таких систем являются блоки для оцифровки аналоговых сигналов с целью их дальнейшей обработки. Компания SiLabs - один из мировых производителей микросхем для совместной обработки аналоговых ицифровых сигналов. В данной статье рассматриваются принципы работы с интегрированными АЦП и ЦАП одного из 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, точность которого немного уступает точности АЦП микроконтроллера С8051F064, а стоимость в 3 раза превышает стоимость С8051F064.

В таблице 1 приведены параметры АЦП некоторых микроконтроллеров SiLabs.

Таблица 1. Таблица параметров АЦП некоторых кристаллов SiLabs

  АЦП последовательного приближения Сигма-дельта АЦП
Семейство C8051F300 C8051F330 C8051F020 C8051F005 C8051F064 C8051F350
Разрешение 8 бит 10 бит 8 бит 12 бит 12 бит 16 бит 24 бит
Частота выборки, sps 500k 200k 500k 100k 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, младший значащий разряд (МЗР).

C8051F020 - микроконтроллер общего назначения

В данной статье в качестве «базового» устройства будем рассматривать микроконтроллер C8051F020 фирмы SiLabs. Как видно из таблицы 1, он уступает другим микроконтроллерам SiLabs по характеристикам АЦП, но является неплохим примером для демонстрации работы аналоговой подсистемы, имеющейся на кристалле.

В аналоговую подсистему рассматриваемого микроконтроллера входят один 8-разрядный и один 12-разрядный АЦП последовательного приближения, а также два 12-разрядных ЦАП. C8051F020 содержит операционный усилитель с программируемым коэффициентом усилением (PGA), аналоговый мультиплексор (8 каналов и 9 каналов), 2 компаратора, источник опорного напряжения и температурный датчик. Эти узлы показаны на рис. 1.

Блок-схема C8051F020
Рис. 1. Блок-схема C8051F020

Для поддержки работы АЦП и ЦАП кристалл содержит источник опорного напряжения 2,43 В, который имеет температурную нестабильность 15 ppm/°C. Максимальный ток нагрузки источника опорного напряжения составляет 200 мкА. При использовании внешнего источника опорного напряжения этот блок может быть программно отключен.

Важной особенностью АЦП SiLabs является то, что для осуществления аналогово-цифровых преобразований не нужно останавливать цифровую подсистему микроконтроллера. Аналоговая и цифровая подсистемы разделены на кристалле таким образом, что работа последней не вносит помех в работу аналоговой подсистемы.

Для задания режимов работы узлов кристалла используются регистры специальных функций (SFR), позволяющие упростить работу с аналоговой периферией. Все настройки осуществляются программно путем записи соответствующих значений в регистры. В следующем разделе реализация данной идеологии будет рассмотрена более детально.

Следует помнить, что C8051F020 является микроконтроллером. Из его характеристик отметим следующее. Он позволяет получить пиковую производительность 25 MIPS, содержит Flash-память программ объемом 64 кбайт, а также 4352 байт ОЗУ. Цифровая подсистема кристалла включает пять 16-разрядных счетчиков-таймеров, сторожевой таймер, последовательные интерфейсы (два UART, SMBus и SPI) (рис. 2). Для внутрисхемной отладки и программирования предназначен интерфейс JTAG. Микроконтроллер имеет 64 линии ввода-вывода и выпускается в корпусе TQFP100. Диапазон питающих напряжений составляет 2,7-3,6 В, рабочий температурный диапазон - индустриальный (-40...+85 °С).

Блок схема микроконтроллера C8051F02x
Рис. 2. Блок схема микроконтроллера C8051F02x

Наличие интерфейса внешней памяти, который может работать в мультиплексированном и немультиплексированном режимах, позволяет увеличивать объем оперативной памяти. Ширина шины адреса интерфейса внешней памяти составляет 16 бит, шины данных - 8 бит.

Программирование АЦП и ЦАП

12-разрядный АЦП (АЦП0)

Подсистема АЦП0, показанная на рис. 3, состоит из 9-канального аналогового мультиплексора (AMUX0), операционного усилителя с программируемым коэффициентом усиления (PGA0) и 12-разрядного АЦП последовательного приближения (SAR). Максимальная частота дискретизации АЦП0 составляет 100 тысяч отсчетов/сек, которая определяется частотой системного тактового сигнала, деленной на значение, задаваемое битами AD0SC регистра ADC0CF.

Функциональная блок схема АЦП0
Рис. 3. Функциональная блок схема АЦП0

Работа АЦП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 или спящий режим).

12-разрядного АЦП с запуском по внешнему сигналу
Рис. 4. Временная диаграмма 12-разрядного АЦП с запуском по внешнему сигналу

При изменении конфигурации АЦП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):

ADC0Code = Vin x Gain 2n
VREF

где

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 x 4095
4096
0FFFH FFF0H
VREF
2
0800H 8000H
VREF x 2047
4096
07FFH 7FF0H
00000H 0000H

Если AIN0 и AIN1 используются как входы в дифференциальном режиме (AMX0CF=01H и AMXSL=00H) и коэффициент усиления равен 1, получим следующие результаты (табл. 3).

Таблица 3

AIN0-AIN1, ВADC0H:ADC0L
(AD0LJST = 0)
ADC0H:ADC0L
(AD0LJST = 1)
VREF x 2047
2048
07FFH 7FF0H
VREF
2
0400H 4000H
VREF x 1
2048
0001H 0010H
00000H0000H
- VREF x 1
2048
FFFFH (-1d)FFF0H
- VREF
2
FC00H (-1024d)C000H
- VREFF800H (-2048d)8000H

Задание режимов работы АЦП0 рекомендуется выполнять в следующей последовательности:

  1. Задание конфигурации опорного напряжения (REF0CN).
  2. Установка тактовой частоты преобразования SAR0 и коэффициента усиления PGA0 (ADC0CF).
  3. Задание конфигурации входных каналов мультиплексора (AMX0CF).
  4. Выбор требуемого входного канала мультиплексора (AMX0SL).
  5. Установка соответствующего бита управления, выбор режима запуска преобразования и разрешение работы АЦП0 (ADC0CN).

Другие входные каналы мультиплексора (шаг 3) могут быть выбраны при процедуре обработки прерывания (ISR) в АЦП0 после преобразования входного сигнала на текущем канале и сброса бита AD0INT. Сигнал на заново выбранном канале будет преобразован в следующем цикле. После инициализации преобразования установкой AD0BUSY в 1 определение окончания преобразования можно производить опросом бита AD0INT (ADC0CN.5). Рекомендуемая последовательность действий при процедуре опроса:

  1. Сброс AD0INT в 0.
  2. Установка AD0BUSY в 1.
  3. Ожидание 1 в AD0INT.
  4. Обработка результата преобразования АЦП0.

Пример 1

;-------------------------------------------------------------------------------
;  Установка Vref:
;  Разрешение внутреннего источника опорного напряжения, а также выбор 
;  опорного значения напряжения для АЦП0 с вывода VREF0
;-------------------------------------------------------------------------------
   MOV     REF0CN,  #00000011b
;-------------------------------------------------------------------------------
;  Тактовая частота 16 МГц от внутреннего генератора
;-------------------------------------------------------------------------------
   MOV  OSCIN,  #10000111b      ; Разрешение внутреннего генератора (16 МГц) 
IFRDY_wait:                      ; опрос IFRDY->1 (ожидание запуска генератора)
   MOV  A,        OSCIN
   JNB  ACC.4,  IFRDY_wait
;-------------------------------------------------------------------------------
;  Конфигурирование АЦП0 для использования AIN0 в однопроводном режиме
;  Другие входы не используются.
;-------------------------------------------------------------------------------
   MOV     ADC0CF,  #10000000b   ; Тактовая частота преобразование SAR0?941кГц,
                                 ; коэф. усиления =l
   MOV     AMX0CF,  #00H         ; 8 входов в однопроводном режиме
   MOV     AMX0SL,  #00H         ; Выбор входа AIN0
   MOV     ADC0CN,  #10001101b   ; Разрешение АЦП0
                                 ; (режим непрерывной выборки, 
                                 ; преобразование инициализируется по 
                                 ; переполнению Таймера 2,
                                 ; данные выровнены по левому краю).

Пример 2: измерение температуры с использованием встроенного температурного датчика (9-й канал АЦП0). У микроконтроллера C8051F020 точность внутреннего осциллятора невысокая и составляет 20%, поэтому в данном примере используется тактовый генератор с внешним кварцевым резонатором.

//--  Используется Таймер 3 (прерывания по переполнению)
//--  Используется внешний кварцевый резонатор 22.1184 МГц:
//--  Измерения проводятся датчиком температуры на кристалле с использованием 
//--  АЦП0
//--  ADC0JTemp.C       
#include   
//-----------------------------------------------------------------------------
//  Определение 16-битных регистров SFR для C8051F020
//-----------------------------------------------------------------------------
sfrl6  TMR3RL=0х92;                         // Значение перезагрузки Таймера 3 
sfrl6  TMR3=0х94;                           // счетчик Таймера 3  
sfrl6  ADC0=0xbe;                           // данные АЦП0
//-----------------------------------------------------------------------------
//  Глобальные константы
//-----------------------------------------------------------------------------
#define  SYSCLK  22118400                   //--  Внешний кварцевый резонатор 
                                            //--  на 22МГц
sbit LED = P1^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)
{
    EA =  0;                                //--  Запрещение глобальных 
                                            //--  прерываний
                                            //--  (предпочтительно запрещать 
                                            //--  все прерывания до окончания 
                                            //--  инициализации)
    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));  
    OSCICN=0х88;                            //--  1000 1000b (задание режимы 
                                            //--  работы тактового  генератора 
                                            //--  с внешним кварцевым 
                                            //--  резонатором)
                                            //--  Бит 2  : Внутренний генератор 
                                            //--  отключен(IOSCEN =  0) 
                                            //--  Бит 3  :  Генератор с внешним 
                                            //--  кварцем используется как 
                                            //--  системная тактовая частота 
                                            //    (CLKSL =  1)
                                            //--  Бит 7  : Разрешение детектора
                                            //--  исчезновения тактового 
                                            //--  сигнала (MSCLKE  =  1) 
}
//-----------------------------------------------------------------------------
void Init_Port(void)                        //--  инициализация Crossbar и 
                                            //--  портов GPIO 
{
    XBR1=0х00
    XBR2=0х40                               //--  Глобальное разрешение 
                                            //--  Crossbar и включение 
                                            //--  резисторов "подтяжки" 
                                            //--  (weak pull-ups). По умолчанию 
                                            //--  на каждой линии встроен 
                                            //--  резистор "подтяжки" (около 
                                            //--  100кОм) к линии питания VDD, 
                                            //--  который можно запретить 
                                            //--  глобально
    P1MDOUT|=0х40;                          //--  разрешение линии P1.6 
                                            //--  (светодиод) в режиме 
                                            //--  push-pull
}
//-----------------------------------------------------------------------------
//--  Конфигурация Таймера 3 на автоматическую перезагрузку и генерацию 
//--  прерывания через интервал, определенный , используя SYSCLK/12 в 
//--  качестве единицы отсчета
void Init_Timer3  (unsigned int counts)
{
    TMR3CN=0х00;                            //--  Остановка Таймера;  Сброс TF3 
                                            //--  (флага переполнения Таймера 3);
//  SYSCLK/12 используется в качестве единицы отсчета
    TMR3RL =  -counts;                      //--  Инициализация значения 
                                            //--  перезагрузки 
    TMR3   = 0xffff;                        //--  Установка на немедленную 
                                            //--  перезагрузку
    EIE2  |= 0х01;                          //--  Разрешение прерываний от 
                                            //--  Таймера 3
    TMR3CN|= 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->l
    ADC0_reading = ADC0;                    //-- чтение данных АЦП0
    ADC0CN  &=  0xDF;                       //-- сброс AD0INT
}

Переполнение Таймера 3 используется для инициализации преобразования АЦП0. Прерывание (EIE2.0) от Таймера 3 также разрешено. Следовательно, переход к процедуре обработки прерывания (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 =l.3МГц, коэф. 
                                //-- усиления =2
    AMX0SL= 0х08;               //-- Выбор температурного датчика 
    ADC0CN= 0х84;               //-- Разрешение АЦП0, режим непрерывной 
                                //-- выборки, преобразование инициализируется 
                                //-- по переполнению Таймера 3, данные АЦП0 
                                //-- выровнены по правому краю
    EIE2  |= 0х02;              //-- Разрешение прерываний от АЦП
}
//-----------------------------------------------------------------------------
void ADC0_ISR(void)  interrupt  15 
{
    ADC0_reading = ADC0; 
    AD0INT =  0;                //--  сброс флага прерываний окончания 
                                //-- преобразования АЦП0
}

Регистры специальных функций (SFR) АЦП0

Опишем регистры выбора канала AMUX0 (AMX0SL), конфигурационный регистр AMUX0 (AMX0CF), регистр конфигурации АЦП0 (ADC0CF), управляющий регистр АЦП0 (ADC0CN).

AMX0SL: Регистр выбора канала AMUX0

Таблица 4. AMX0SL - регистр выбора канала AMUX0

Бит Символ Описание
7-4 - Не используется, Read = 0000, Write = не важно
3-0 AMX0AD3U0 AMX0 биты адреса 0000U1111: входы АЦП выбираются согласно таблице 5

Таблица 5. Выбор канала AMUX0

  Регистр AMUX0SL, Биты 3-0 (AMX0AD3-0)
0000 0001 0010 0011 0100 0101 0110 0111 1xxx
Регистр
AMX 0CF, Биты 3-0
0000 AIN0 AIN1 AIN2 AIN3 AIN4 AIN5 AIN6 AIN7 Темп. датчик
0001 +(AIN0)
-(AIN1)
  AIN2 AIN3 AIN4 AIN5 AIN6 AIN7 Темп. датчик
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 Темп. датчик
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)
-(AIN1)
  +(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)
  Темп. датчик

Входы мультиплексора (AIN0-AIN7) могут быть запрограммированы для работы либо в дифференциальном, либо в однопроводном режиме. Это позволяет выбирать наиболее подходящий режим измерения, а также производить изменение режимов <на лету>. 9-й канал мультиплексора подключен к температурному датчику на кристалле. В таблице 5 приведены все возможные комбинации режимов работы каналов AMUX.

Таблица 6. AMX0CF: Конфигурационный регистр 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 имеют формат двоичного дополнительного кода.

Максимальная частота работы блока последовательного приближения (SAR0) АЦП0 составляет 2,5 МГц.

CLKSAR0 = SYSCLK
AD0SC + 1

(см. таблицу 7)

Таблица 7. ADC0CF: Регистр конфигурации АЦП0

БитСимволОписание
7-3AD0SC4U0Биты установки частоты преобразования SAR0 АЦП0
Частоту преобразования SAR0 получают из системной тактовой частоты по следующей формуле:
AD0SC = SYSCLK - 1
CLKSAR0

где AD0SC - 5-битное значение AD0SC4U0
и CLKSAR0 - требуемая частота преобразований SAR0 АЦП0
2-0AMP0GN2U0Внутренний усилитель с программируемым коэффициентом усиления (PGA) АЦП0
000: Коэф.= 1
001: Коэф.= 2
010: Коэф.= 4
011: ?Коэф.= 8
10x: Коэф.= 16
11x: Коэф.= 0,5

Таким образом, если системная тактовая частота равна 16 МГц, и биты AD0SC4-0 установлены в 10000b, то частота преобразования SAR0 = 16 МГц / 17 = 941,176 кГц. Следовательно, если в ADC0CF записано значение 10000000, то частота преобразования SAR0 будет примерно равна 941 кГц, а коэффициент усиления PGA0 равен 1.

Таблица 8. ADC0CN - управляющий регистр АЦП0 (адресуется побитно)

Бит Символ Описание
7 AD0EN Бит разрешения АЦП0
0: АЦП0 запрещен;
1: АЦП0 разрешен.
6 AD0TM Бит режима выборки АЦП0
0: Постоянная выборка входного аналогового сигнала до начала преобразования. АЦП должен быть разрешен.
1: Выборка при низком уровне внешнего сигнала на CNVSTR, преобразование запускается по переднему фронту на CNVSTR.
5 AD0INT Флаг прерывания по окончанию преобразования АЦП Примечание: Этот флаг должен быть сброшен программно в 0.
0: АЦП0 не закончил преобразование данных после последнего сброса этого флага.
1: АЦП0 завершил преобразование данных.
4 AD0BUSY Бит занятости АЦП0
0: Преобразование АЦП0 завершено или в настоящий момент не осуществляется. AD0INT устанавливается в 1 по заднему фронту AD0BUSY.
1: АЦП0 осуществляет преобразование.
3-2 AD0CM1U0 Выбор способа запуска преобразования АЦП0
Если AD0TM=0, то преобразование АЦП0 инициализируется:
00: При записи <1> в AD0BUSY.
01: По переполнению Таймера 3.
10: По переднему фронту внешнего сигнала на CNU VSTR.
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 выровнены по левому краю.

Регистры ADC0H и ADC0L используются для хранения слов данных старших и младших значащих разрядов соответственно.

Для улучшения точности измерения АЦП предусмотрена функция программируемого «оконного детектора». В регистрах микроконтроллера программируются нижнее и верхнее значения отслеживаемого напряжения. Регистры ADC0GTH, ADC0GTL, ADC0LTH и ADC0LTL являются регистрами значений верхнего и нижнего порога выходного сигнала АЦП0 соответственно. В случае, если напряжение на входе АЦП выйдет за пределы заданных пороговых значений, генерируется соответствующее прерывание, избавляя пользовательскую программу от необходимости <рутинного> циклического опроса.

8-разрядный АЦП (АЦП1)

Подсистема АЦП1 состоит из 8-канального аналогового мультиплексора (AMUX1), операционного усилителя с программируемым коэффициентом усиления (PGA1) и 8-разрядного АЦП последовательного приближения (SAR) (рис. 5). Схема работы с АЦП1 аналогична схеме работы с АЦП0, но есть отличия в некоторых деталях. Например, АЦП1 не поддерживает режим программируемого оконного детектора и имеет 5 режимов запуска преобразования (вместо 4). Максимальная скорость преобразования АЦП1 такая же, как у АЦП0, и составляет 100 ksps.


Рис. 6

АЦП1 разрешается установкой бита AD1EN (ADC1CN.7) в 1. Если этот бит имеет значение 0, то подсистема АЦП1 находится в режиме низкого энергопотребления. Режимы преобразования данных AMUX1, PGA1 и АЦП1 конфигурируются через регистры специального назначения SFR.

8 каналов AMUX1 доступны для измерения внешнего сигнала и могут быть сконфигурированы только в однопроводном режиме. Канал мультиплексора выбирается регистром AMX1SL SFR. PGA1 усиливает выходной сигнал AMUX1 в число раз, определенное регистром конфигурации ADC1CF АЦП1 (возможные значения коэффициентов усиления 0,5, 1, 2 или 4; по умолчанию, коэффициент равен 0,5).

Так как входы АЦП коммутируются на внешние выводы при помощи цифрового коммутатора (Crossbar), то аналоговые входы должны быть сконфигурированы установкой в 0 соответствующих битов в регистре P1MDIN. Вывод AIN1 выводится на Порт 1, в противном случае по умолчанию выводы Порта 1 устанавливаются в режим цифровых входов-выходов.

Пример:

MOV     PlMDIN,  #00000111b   ; P1.7 - P1.3: аналоговый вход
                              ; P1.2 - P1.0: цифровой вход

Запуск преобразования АЦП1

Преобразование может запускаться 5 различными способами, в соответствии с установленными режимами запуска преобразования АЦП1 (AD1CM2-0) в регистре ADC1CN:

  1. Программно, записью 1 в AD1BUSY.
  2. По переполнению Таймера 2.
  3. По переполнению Таймера 3.
  4. По внешнему сигналу (переднему фронтуна CNVSTR).
  5. Записью '1' в AD0BUSY (ADC0CN.4) (инициализация преобразования АЦП1 и АЦП0 одной программной командой).

12-разрядные ЦАП (ЦАП0 и ЦАП1)

Подсистема ЦАП состоит из двух 12-разрядных ЦАП с потенциальными выходами: ЦАП0 и ЦАП1. Оба ЦАП функционально идентичны и каждый конфигурируется через соответствующие регистры управления: DAC0CN и DAC1CN. На рис. 6 показана функциональная блок-схема обоих ЦАП. Время установки сигнала на выходе ЦАП не превышает 10 мкс, при этом существует возможность синхронизации выходов ЦАП сигналами таймера.

Функциональная блок-схема ЦАП0 и ЦАП1
Рис. 6. Функциональная блок-схема ЦАП0 и ЦАП1

В соответствии с входными значениями кода (от 000H до FFFH) выходной сигнал ЦАП будет принимать значения напряжения от 0 В до VREF. Опорное значение для каждого ЦАП подается на вывод VREFD.

Формирование выходного сигнала

Команда на обновление значения выходного напряжения ЦАП формируется четырьмя способами:

  1. По запросу (запись в старший байт регистра слова данных ЦАПx, DACxH, x = 0 или 1).
  2. По переполнению Таймера 2.
  3. По переполнению Таймера 3.
  4. По переполнению Таймера 4.

Режим обновления выходного сигнала ЦАП по запросу является режимом по умолчанию. В этом режиме данные на выходе ЦАП обновляются при записи в регистр DACxH.

Данные, записанные в DACxL, сохраняются, но не отображаются на выходе ЦАП до записи данных вDACxH. Поэтому для записи 12-разрядного слова данных в АЦП сначала следует записать регистр DACxL, а потом DACxH.

ЦАП могут быть использованы в 8-разрядном режиме с записью данных только в DACxH (при этом DACxL устанавливают обычно в 00H).

В режиме обновления выходного сигнала ЦАП по переполнению таймера выходной сигнал ЦАП обновляется независимо от процессора. Записанные в пару регистров ЦАП значения (DACxL и DACxH) сохраняются до переполнения соответствующего таймера. После этого содержимое DACxH:DACxL копируется во входные «защелки» ЦАП, обновляя значение на выходе.

Режим обновления выходного сигнала ЦАП по переполнению таймера удобно использовать для формирования периодического выходного сигнала, например, синусоиды с определенной выходной частотой.

Формат входных данных

Формат 12-разрядного слова в регистрах DACxH и DACxL может быть сконфигурирован установкой соответствующих битов DACxDF (DACxCN.[2:0]). Пять вариантов формата слов показаны на рис. 7.

Формат данных ЦАП
Рис. 7. Формат данных ЦАП

Задание режимов работы ЦАП

Конфигурирование ЦАП необходимо выполнять в следующей последовательности:

  1. Конфигурация опорного напряжения (REF0CN).
  2. Запись в регистры входных данных требуемого 12-разрядного цифрового значения (DACxH и DACxL).
  3. Установка соответствующего режима формирования входных данных и формата слов данных, разрешения ЦАПх (DACxCN.7).
  4. При необходимости конфигурирование и запуск соответствующих таймеров.

Пример:

;------------------------------------------------------------------------------
;  Установка Vref:
;  Разрешение внутреннего источника опорного напряжения. 
;  Выводы 1-2 порта J22 на отладочной плате C8051F020 должны быть подключены
;  к внутреннему источнику опорного напряжения, генерируемому на вход VREFD
;------------------------------------------------------------------------------

   MOV     REF0CN,  #00000011b
;------------------------------------------------------------------------------
;  Конфигурирование и запуск ЦАП0
;------------------------------------------------------------------------------

   MOV     DAC0H,   #0FFh
   MOV     DAC0L,   #0h
   MOV     DAC0CN,  #10010100b   ; Разрешение ЦАП0 в режиме выравнивания по 
                                 ; левому краю и обновления по переполнению 
                                 ; Таймера 4
;------------------------------------------------------------------------------
;  Установка Таймера 4
;  Примечание:  Системная тактовая частота =  22.1184МГц, тактовый генератор с 
;  внешним кварцем

   ORL     CKCON,   #00100000b   ; Таймер 4 использует системную тактовую 
                                 ; частоту 
   MOV     RCAP4L,  #0Fh         ; Установка времени перезагрузки в 0xFF0F
   MOV     RCAP4H,  #0FFh        ; FFFF-FF0F  =  SYSCLK/ частота отсчетов ЦАП
                                 ; Частота отсчетов ЦАП =92160Гц
   MOV     TL4,     RCAP4L       ; Установка младшего байта Таймера 4 (TL4) до 
                                 ; запуска таймера
   MOV     TH4,     RCAP4H       ; Установка старшего байта  Таймера 4 (TH4)
   MOV     T4CON,   #00000100b   ; Запуск Таймера 4 в режиме 16-разрядной 
                                 ; автоперезагрузки

Регистры специальных функций (SFR) ЦАП0

Разрешение работы ЦАП, выбор режима обновления сигнала на выходе ЦАП, выбор формата слов данных на входе ЦАП осуществляется программно через регистр специальных функций (таблица 9).

Таблица 9. DAC0CN - регистр управления ЦАП0

Бит Символ Описание
7 DAC0EN Бит разрешения ЦАП0
0: ЦАП0 запрещен. ЦАП0 в режиме низкого энергопотребления и вывод выхода в состоянии высокого импеданса.
1: ЦАП0 разрешен. ЦАП0 в рабочем состоянии и вывод выхода активен.
6-5 - Не используется. Read = 00, Write = не важно
4-3 DAC0MD1U0 Биты режима ЦАП0
Обновление выходного сигнала ЦАП происходит:
00: при записи в регистр DAC0H.
01: по переполнению Таймера 3.
10: по переполнению Таймера 4.
11: по переполнению Таймера 2.
2-0 DAC0DF2U0 Биты формата данных ЦАП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].

DAC0H и DAC0L используются для хранения старшего и младшего байта слова данных ЦАП0 соответственно. Регистры специальных функций (SFR) ЦАП1 аналогичны SFR ЦАП0.

Заключение

Микроконтроллер C8051F020 удобно использовать во встраиваемых применениях, требующих высокой производительности, большой памяти программ и хороших характеристик АЦП/ЦАП. Следует добавить, что микроконтроллер C8051F020 был выпущен достаточно давно, в настоящее время фирма SiLabs выпускает новые микроконтроллеры с лучшими характеристиками, например C8051F064 с двумя 16-разрядными АЦП со скоростью преобразования 1 Msps, или C8051F350 с 24-разрядным сигма-дельта АЦП.

В заключение можно сказать, что микроконтроллеры с интегрированными АЦП и ЦАП являются удобным решением для систем сбора и обработки данных от многих датчиков. Уступая чисто аналоговой обработке только в быстродействии, такой микроконтроллер отличается большой функциональной гибкостью и точностью благодаря наличию обширной аналоговой и цифровой периферии, что значительно упрощает разработку конечного устройства.

Литература

  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 uControllers. 2005.

Елена Ламберт


Статьи по: ARM PIC AVR MSP430, DSP, RF компоненты, Преобразование и коммутация речевых сигналов, Аналоговая техника, ADC, DAC, PLD, FPGA, MOSFET, IGBT, Дискретные полупрoводниковые приборы. Sensor, Проектирование и технология, LCD, LCM, LED. Оптоэлектроника и ВОЛС, Дистрибуция электронных компонентов, Оборудование и измерительная техника, Пассивные элементы и коммутационные устройства, Системы идентификации и защиты информации, Корпуса, Печатные платы

Design by GAW.RU