Знакомство с новыми микроконтроллерами Smart ARM компании Atmel:
работаем с модулем ОРАМР микроконтроллера SAM L21

№ 12’2015
PDF версия
Статья посвящена программированию модуля операционного усилителя ОРАМР микроконтроллера Atmel SAM L21. В ней мы рассмотрим функциональные возможности модуля и базовые принципы работы с ним.

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

Новый кристалл Atmel SAM L21 является представителем сверхмалопотребляющих микроконтроллеров последнего поколения. Его разработчики учли все современные тенденции на рынке микроэлектроники, поэтому SAM L21 снабжен богатым набором гибко настраиваемых периферийных модулей различного назначения, как аналоговых, так и цифровых. В данной статье мы познакомимся с периферийным модулем операционного усилителя OPAMP и особенностями работы с ним.

  • Модуль OPAMP микроконтроллера Atmel SAM L21 содержит три независимо конфигурируемых операционных усилителя, позволяющих программно реализовывать следующие устройства:
  • повторитель напряжения;
  • инвертирующий усилитель;
  • неинвертирующий усилитель;
  • каскадный инвертирующий усилитель;
  • два дифференциальных усилителя;
  • инструментальный усилитель;
  • трансформатор импеданса;
  • драйвер аналого-цифрового преобразователя (ADC);
  • драйвер аналогового компаратора (AC);
  • выходной повторитель или усилитель цифро-аналогового преобразователя (DAC).

Функциональная схема модуля OPAMP приведена на рис. 1.

Функциональная схема модуля OPAMP Atmel SAM L21

Рис. 1. Функциональная схема модуля OPAMP Atmel SAM L21

Операционные усилители модуля OPAMP могут использоваться по отдельности; возможно и каскадное включение усилителей. Входы и выходы операционных усилителей могут быть коммутированы на внешние выводы микроконтроллера или подключены к другим периферийным модулям на кристалле.

Для конфигурирования модуля OPAMP используются пять регистров:

  • CTRLA — регистр общего управления модулем OPAMP (включение/выключение модуля, сброс, выбор импеданса операционных усилителей);
  • STATUS — регистр статуса операционных усилителей модуля OPAMP (доступен только для чтения);
  • OPAMPCTRL0 — регистр конфигурирования операционного усилителя 0 модуля OPAMP;
  • OPAMPCTRL1 — регистр конфигурирования операционного усилителя 1 модуля OPAMP;
  • OPAMPCTRL2 — регистр конфигурирования операционного усилителя 2 модуля OPAMP.

Назначение битов регистров OPAMPCTRL0, OPAMPCTRL1, OPAMPCTRL2 приведено на рис. 2.

Назначение битов регистров OPAMPCTRL0, OPAMPCTRL1, OPAMPCTRL2

Рис. 2. Назначение битов регистров OPAMPCTRL0, OPAMPCTRL1, OPAMPCTRL2

Для оценки возможностей модуля OPAMP Atmel SAM L21 можно воспользоваться отладочной платой SMART SAM L21‑XPRO (рис. 3) с модулем расширения OLED1 Xplained Pro (рис. 4) компании Atmel или другим модулем с установленным кристаллом из семейства SAM L21.

Отладочная плата SMART SAM L21 XPRO

Рис. 3. Отладочная плата SMART SAM L21 XPRO

Модуль расширения OLED1 Xplained Pro

Рис. 4. Модуль расширения OLED1 Xplained Pro

Для демонстрации возможностей работы периферийного модуля OPAMP, как и любого другого аналогового модуля, потребуется источник аналогового сигнала и устройство визуализации данных. Например, периферийные модули самого микроконтроллера:

  • цифро-аналоговый преобразователь для генерации синусоидального сигнала и подачи его на вход операционного усилителя;
  • аналого-цифровой преобразователь (ADC) для оцифровки сигнала, получаемого на выходе операционного усилителя модуля OPAMP.

Для визуализации данных воспользуемся бесплатной утилитой Data Visualizer* компании Atmel. Работа с этой утилитой доступна из среды Atmel Studio как часть интегрированной среды разработки или из меню «Пуск» операционной системы в качестве независимой программы (при предварительной установке).

Реализуем тестовую программу, чтобы оценить возможности модуля OPAMP. Программа будет задавать два режима работы операционного усилителя в модуле. При первом включении и переходе в первый режим операционный усилитель 0 модуля OPAMP конфигурируется как повторитель напряжения (рис. 5). При нажатии клавиши Button 1 на дочернем модуле OLED Xplained Pro программа переходит во второе состояние. При этом операционный усилитель 0 конфигурируется как неинвертирующий усилитель напряжения с коэффициентом усиления 3. Повторное нажатие клавиши Button 1 переводит программу в первый режим. Изменения настроек будут отражаться на изменении амплитуды выходного сигнала.

Диаграмма работы тестовой программы

Рис. 5. Диаграмма работы тестовой программы

Перед началом работы необходимо сконфигурировать аппаратную часть, установив джамперы на отладочной плате, как показано на рис. 6. Для написания и компиляции программного кода удобно пользоваться средой Atmel Studio 7*. Интегрированная среда разработки Atmel Studio 7 в сочетании с обширным набором библиотек из рабочего окружения разработчика Atmel Software Framework (ASF)* значительно упрощает и ускоряет процесс создания и отладки приложений для микроконтроллеров Atmel. Среда ASF интегрирована с Atmel Studio 7.

Конфигурация отладочного модуля SMART SAM L21 XPRO с дочерним модулем OLED1 Xplained Pro

Рис. 6. Конфигурация отладочного модуля SMART SAM L21 XPRO с дочерним модулем OLED1 Xplained Pro

Общая структурная схема соединений функциональных блоков микроконтроллера SAM L21 в нашей программе показана на рис. 7.

Подключение периферийных модулей SAM L21 в тестовой программе

Рис. 7. Подключение периферийных модулей SAM L21 в тестовой программе

Для корректной реализации проекта нужно учитывать ряд ограничений:

  • утилита Data Visualizer позволяет отображать данные с максимальной разрядностью 8 бит, поэтому и при формировании сигнала, и при обработке его амплитуда не должна превышать 255 отсчетов;
  • разрядность DAC микроконтроллера SAM L21 составляет 12 бит, поэтому для улучшения соотношения сигнал/шум исходный сигнал необходимо сдвинуть в большую сторону на несколько отсчетов.

Исходя из указанных ограничений, сформируем исходные данные для нашего источника сигнала (таблица отчетов sine Wave table[]*):

Angle steps: 256 — количество отсчетов на один период
Full range: 256 — общее число отсчетов 
Waveform Zero: 32 — значение смещения нуля 
Half-Wave Amplitude: 16 — значение половины амплитуды

Для реализации нашей программы понадобится настроить следующие периферийные модули:

  • модуль DAC (для формирования аналогового сигнала на основе отсчетов из массива sine Wave table[])*;
  • модуль OPAMP*;
  • модуль ADC (для оцифровки данных, поступающих с модуля OPAMP)*,
  • модуль таймера (формирует временные интервалы для передачи отсчетов в модуль DAC)*;
  • модуль внешних прерываний EXTINT (обрабатывает прерывания от клавиши Button 1)*;
  • модуль интерфейса SPI (обеспечивает связь между отладочной платой и программной утилитой Data Visualizer)*.

Мы сконцентрируем внимание на работе с модулем OPAMP, работа с остальными модулями подробно описана в окружении ASF с примерами исходного кода.

Для реализации нашей тестовой программы необходимо создать две функции, выполняющие конфигурацию модуля OPAMP. Сначала сконфигурируем операционный усилитель 0 модуля как повторитель напряжения — так будет конфигурироваться усилитель при нахождении программы в режиме 1 (рис. 5).

Создадим новую функцию configure_follower_pga_opamp0(), которая будет выполнять указанную конфигурацию.

void configure_follower_pga_opamp0(void) 
{
// тело функции
}

Конфигурирование модуля OPAMP как повторителя напряжения выполняется за несколько шагов. Создадим структуру conf_opam для хранения настроек операционного усилителя 0:

struct opamp0_config conf_opam;

Инициализируем модуль и считываем настройки операционного усилителя 0 по умолчанию в нашу структуру:

opamp_module_init();
opamp0_get_config_defaults(&conf_opam);

Корректируем настройки OPAMP, конфигурируем операционный усилитель 0 как повторитель напряжения. Для этого коммутируем инверсный вход операционного усилителя на его выход, а прямой вход подключаем к выходу DAC:

conf.negative_input = OPAMP0_NEG_MUX_OUT0;
conf_opam.positive_input = OPAMP0_POS_MUX_DAC;

Конфигурируем резистивный делитель: отключаем R1, отсоединяем R2 от выхода:

conf_opam.r1_connection = OPAMP0_RES1_MUX_GND;
conf_opam.config_common.r1_enable = false;
conf_opam.config_common.r2_out = false;

Выход операционного усилителя подключаем к входу ADC:

conf_opam.config_common.analog_out = true;

Конфигурирование модуля OPAMP закончено. Записываем настройки в регистры микроконтроллера, включаем модуль, ждем, когда OPAMP будет готов к работе.

opamp0_set_config(&conf_opam);
opamp_enable(OPAMP_0);
while (!opamp_is_ready(OPAMP_0));

На следующем шаге создадим конфигурацию операционного усилителя 0 модуля OPAMP как неинвертирующего усилителя (помним, что именно так операционный усилитель будет конфигурироваться при нахождении программы в режиме 2). Для этого создаем функцию configure_non_inverting_pga_opamp0():

void configure_non_inverting_pga_opamp0(void)
{
// тело функции
}

Как и в предыдущем случае, формируем структуру для хранения настроек операционного усилителя 0, инициализируем модуль, считываем настройки в нашу структуру:

struct opamp0_config conf;
opamp_module_init();
opamp0_get_config_defaults(&conf);

Затем настраиваем входы операционного усилителя, инвертирующий вход коммутируем на мультиплексор резистивного делителя, прямой вход подключаем к выходу DAC:

conf.negative_input = OPAMP0_NEG_MUX_TAP0;
conf.positive_input = OPAMP0_POS_MUX_DAC;

Следующим шагом настраиваем резистивный делитель, резистор R1 подсоединяем к «земле», включаем R1, отключаем R2 от питания и подключаем его к выходу операционного усилителя:

conf.r1_connection = OPAMP0_RES1_MUX_GND;
conf.config_common.r1_enable = true;
conf.config_common.r2_vcc = false;
conf.config_common.r2_out = true;

Выход операционного усилителя, как и в первом случае, подключаем к входу ADC:

conf.config_common.analog_out = true;

Устанавливаем номиналы резисторов резистивного делителя: R1 = 4R и R2 = 12R:

conf_opam.potentiometer_selection= OPAMP_POT_MUX_4R_12R;

При данных номиналах резисторов коэффициент усиления будет равен 12/4 = 3.

Записываем настройки из нашей структуры в регистры микроконтроллера, активируем модуль OPAMP и ждем, когда модуль будет готов к работе:

opamp0_set_config(&conf);
opamp_enable(OPAMP_0);
while(!opamp_is_ready(OPAMP_0));

После реализации двух функций configure_follower_pga_opamp0() и configure_non_inverting_pga_opamp0(), конфигурирующих операционный усилитель 0 в каждом из двух режимов работы программы, можно заняться написанием основной программы. Определяем глобальную переменную opamp_conf типа extern volatile bool, в которой будет храниться событие «нажатие клавиши Button 1». Состояние данной переменной меняется при обработке внешнего прерывания, каждое нажатие клавиши меняет состояние. Создаем бесконечный цикл while (true), в котором оператор switch() в зависимости от значения глобальной переменной вызывает одну из двух функций:

while (true) {
{
case false:
configure_follower_pga_opamp0();
break;
case true:
configure_non_inverting_pga_opamp0();
break;
default:
break;
}

Наша программа для микроконтроллера готова, можем запрограммировать ее в микроконтроллер на отладочной плате. Для проверки программы необходимо запустить Data Visualizer, выбрать нашу отладочную плату в выпадающем списке и подключиться к ней (клавиша Connect) (рис. 8).

Подключение программы Data Visualizer к целевой отладочной плате

Рис. 8. Подключение программы Data Visualizer к целевой отладочной плате

В закладке Configuration выбираем модуль графического отображения данных Graph, модуль находится Configuration->Graph-> Graph (рис. 9).

Выбор модуля графического отображения в программе Data Visualizer

Рис. 9. Выбор модуля графического отображения в программе Data Visualizer

Выбираем SPI-интерфейс и направляем поток данных в модуль Graph, перетащив изображение разъема SPI на окно отображения данных модуля. Запускаем обмен данными, нажав на клавишу Start. Программа начинает отображать данные (рис. 10).

Отображение результатов выполнения тестовой программы на экране модуля Graph

Рис. 10. Отображение результатов выполнения тестовой программы на экране модуля Graph

При помощи клавиши Button 1 на отладочном модуле OLED1 Xplained Pro мы теперь можем переводить нашу программу из одного состояния в другое, наблюдая за амплитудой сигнала на экране программы Data Visualizer (рис. 11).

Реакции программы на нажатие клавиши Button 1 на отладочном модуле OLED1 Xplained Pro

Рис. 11. Реакции программы на нажатие клавиши Button 1 на отладочном модуле OLED1 Xplained Pro

Данная тестовая программа позволяет работать с сигналом от периферийных модулей. Если требуется обрабатывать внешний сигнал, то выводы операционного усилителя можно подключить к внешним выводам микроконтроллера. Для подсоединения, например, прямого входа операционного усилителя к выводу микроконтроллера необходимо создать структуру для хранения настроек мультиплексора портов и считать в нее настройки по умолчанию:

struct system_pinmux_config conf_opam_pin;
system_pinmux_get_config_defaults(&conf_opam_pin);

Настроить вывод как вход, сконфигурировать вывод PA06 как прямой вход операционного усилителя 0, записать данную конфигурацию в регистр микроконтроллера:

conf_opam_pin.direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
conf_opam_pin.mux_position = MUX_PA06B_OPAMP_OAPOS0;
system_pinmux_pin_set_config(PIN_PA06B_OPAMP_OAPOS0, &conf_opam_pin);

Для подключения выхода операционного усилителя к внешнему выводу микроконтроллера нужно создать структуру для хранения настроек мультиплексора портов, считать в него настройки по умолчанию:

struct system_pinmux_config conf_opam_out;
system_pinmux_get_config_defaults(&conf_opam_out);

Настроить вывод как выход, сконфигурировать вывод PA07 как выход операционного усилителя 0, записать настройки в регистры SAM L21:

conf_opam_out.direction = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
conf_opam_out.mux_position = MUX_PA07B_OPAMP_OAOUT0;
system_pinmux_pin_set_config(MUX_PA07B_OPAMP_OAOUT0, &conf_opam_out);

Итак, с помощью простой тестовой программы мы с вами смогли наглядно продемонстрировать возможности аналогового модуля OPAMP микроконтроллера Smart ARM SAM L21 компании Atmel. Используя микроконтроллеры этого очень интересного семейства совместно с огромными информационными ресурсами Atmel Software Framework (ASF), можно в кратчайшие сроки создавать адаптивные высокоэффективные встраиваемые решения, отвечающие растущим потребностям современного рынка. В следующих статьях мы продолжим знакомить читателей с особенностями работы периферийных блоков SAM L21.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *