Аналоговый вывод

IT News

ДатаКатегория: it

Мир полон изменяемых величин. Некоторые величины изменяются непрерывно, некоторые шаг за шагом. К примеру, такие явления, как температура и громкость звука, изменяются незаметно, мы не замечаем разделения или перехода от одной величины к другой.

Величины, которые изменяются непрерывно, или бесшагово, называются аналоговыми величинами. В противоположность им, переключатель электрического тока может быть либо включен, либо выключен, среднего не дано. Возьмем номер телефона 123-45-67, следующий будет 123-45-68, и ничего посередине. Величины, изменяющиеся пошагово, называются цифровыми.

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

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

Нажатие литерной клавиши на клавиатуре компьютера запускает поезд из единиц и нолей, при помощи которых закодирована данная буква.

С другой стороны, аналоговые величины не могут быть непосредственно введены в компьютер или выведены из него. Сначала они должны быть обработаны при помощи аналого-цифрового преобразователя (А/Ц). К примеру, звуковые волны музыкального тона, уловленного микрофоном, сначала преобразуются в аналоговое напряжение.

Затем А/Ц преобразователь производит серию цифровых величин, близко соответствующих оригиналу, и эта цифровая информация вводится в компьютер. Когда необходимо вывести результат, компьютерный цифровой сигнал преобразуется в аналоговый.

Технология этого преобразования, или конверсии, позволяет компьютеру получать данные как из цифрового, так и из аналогового миров.

Ввод данных. Данные с клавиатуры введены; голоса из микрофона нет.

Аналоговый сигнал. Сигналы из микрофона поступают в форме звуковых волн.

А/Ц конверсия. Волна представлена в виде лестницы, со степенями из соответствующих высот.

Ввод. Информация выражена теперь в цифровой форме и может быть введена в компьютер.

Цифровой вывод. Компьютер выводит результат в виде цифрового сигнала.

Ц/А конверсия. Цифровой сигнал преобразуется в аналоговый.

Аналоговый вывод. Данные появляются на мониторе или в виде голоса говорящего.  

Аналоговая и цифровая конверсия

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

Таким образом аналоговая величина становится серией числовых величин, причем одна величина соответствует одному сегменту. В свою очередь, числовые величины могут быть представлены компьютером в виде электрических сигналов.

Чтобы преобразовать цифровую величину в аналоговую, необходимо серию цифровых величин перевести в соответствующее напряжение, отдельное для каждого сегмента. Затем этот набор последовательных высот объединяется в плавную звуковую волну.

А/Ц конверсия

Аналоговая величина в форме волны становится набором двоичных чисел.

Ц/А конверсия

Цифровые величины становятся аналоговой волной.

Информация в цифровой форме, которая производится нажатием клавиш клавиатуры (внизу слева), может прямо поступить в компьютер.

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

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

Источник: http://Information-Technology.ru/articles/20-it/452-kak-proiskhodit-analogo-tsifrovoe-preobrazovanie

Несмотря на большую универсальность, возможности аналогового вывода у микроконтроллеров семейства tiny/mega ограничены.

В их составе отсутствует цифро-аналоговый преобразователь (ЦАП), который, однако, имеется в ряде моделей специализированного для этих целей семейства 90PWM.

Преобразовать цифровой код в аналоговую величину в общем случае можно с помощью простой схемы приведенной на рис.1.<\p>

Рис.1 Простой 8-разрядный ЦАП

Делитель напряжения, состоящий из набора резисторов R1…R8, подключен к порту D микроконтроллера. Номиналов каждого последующего сопротивления должен быть в 2 раза больше предыдущего

RN = 2N-1*R,

где N – индекс, R – опорный номинал.

Если, например, в качестве R выбрать значение 200Ом, то потребуется последовательность сопротивлений R1=200Ом, R2=400Ом, R3=400Ом,…, R6=6.4кОм, R6=12.8кОм, R6=25.6кОм. Выходное напряжение

UO = NPORTD*VCC/256,

где NPORTD – логическое значение регистра PORTD.

Теоретически получим 28 шагов регулировки, что будет соответствовать 8-разрядному ЦАП.

Но на практике перекрыть весь диапазон 0…V­СС никогда не удастся, и всегда будут иметься зоны “замирания” напряжения из-за сложности подбора номиналов R1…R8.

Шаг установки VCC/256 по этой же причине также не будет постоянной величиной. Для большей точности работы ЦАП на рис.1 требуется высокоимпедансная нагрузка.

Рис.2 Формирование ШИМ-сигнала на линии ОС2 при работе таймера-счетчика 2 в режиме Fast PWM

Другим более естественным для AVR способом формирования аналоговых сигналов является использование широтно-импульсной модуляции (ШИМ). Способность аппаратно генерировать импульсы переменной длительности и частоты имеется у большинства моделей tiny и у всех без исключения моделей старшего семейства.

Преобразование ШИМ–сигнала в постоянное напряжение может быть легко произведено с помощью ФНЧ. На рис.2, например, показано, как в этих целях можно использовать вывод OC2 микроконтроллера ATmega8. В подобных случаях 8-разрядный таймер-счетчик 2, как правило, работает в режиме Fast PWM(Fast Pulse Wide Modulation).

Счетный регистр TCNT2 при этом инкрементируется с каждым приходящим импульсом до тех пор, пока не достигнет значения 0xFF, после чего счет продолжается с нуля.

Если функции вывода OC2 настроены должным образом, то каждый раз, когда содержимое TCNT2 сравнивается со значением, записанным в регистре OCR2, на выводе OC2 устанавливается высокий уровень напряжения, а при переполнении TCNT2 линия OC2 сбрасывается на нуль. Таким образом, на выводе получаем ШИМ-сигнал с частотой

FOC2 = Fclk/(256*N),

где Fclk – частота тактового генератора, N-коэффициент деления предделителя частоты таймера-счетчика 2.

Коэффициент заполнения импульсов

αOC2 = τ/T = OCR2/256,

где τ – длительность импульса , T – период импульса.

Постоянная составляющая напряжения после ФНЧ будет пропорциональна коэффициенту заполнения αOC2

UO = αOC2*VCC = OCR2*VCC/256,

где VCC – напряжение питания микроконтроллера.

Изменяя значение OCR2, можно программным способом регулировать UO с 8-разрядной точностью. Еще больше возможностей можно получить, если в подобных целях использовать ШИМ–выводы OC1A, OC1B. Разрешающая способность в этом случае может быть доведена до 16 битов за счет использования 2-байтовых регистров совпадения OCR1AH:OCR1AL и OCR1BH:OCR1BL.

Частота среза ФНЧ должна быть во много раз ниже FOC2. Поэтому саму частоту FOC2, если это возможно, желательно выбирать повыше для того, чтобы можно было уменьшить постоянную времени фильтра (увеличить скорость установления напряжения после фильтра).

Рис.3 Управление с помощью ШИМ

а – при регулировке напряжения

б – при регулировке тока

На рис.3 приведено два примера, в которых управляющий ШИМ–сигнал используется для регулировки напряжения (рис.3а) и тока (рис.3б) с помощью мощных полевых транзисторов с изолированным затвором.

В первом случае напряжение на сопротивлении нагрузки UL будет:

UL = [R2/(R1+R2)] * [(R3+R4)/R4] * VCC.

Если выбрать R1/R2 = R3/R4, то UL будет в точности следовать за средним значением напряжения сформированного на выводе OC2. Для надежного запирания p-канального транзистора VT1 усилитель DA1 должен обеспечивать размах напряжения на выходе такой же, как и у источника питания (rail-to-rail).

При управлении током напряжение ошибки снимается с шунта R3 и подается на инвертирующий вход –IN усилителя. Влияние ООС приводит к равенству напряжений

U+IN = U–IN = IL*R3,

где U+IN, U-IN – напряжение на не инвертирующем и инвертирующем входе DA1 соответственно, IL – ток в нагрузке.

Для схемы на рис.3б ток в нагрузке  будет равен:

IL = U–IN/R3 = [R2/((R1+R2)*R3)] * VCC.

C обозначенными на рис.3б номиналами R1…R3 и VCC=5 В, получим 2-амперный регулятор тока.

Пример настройки ШИМ-вывода OC2:

.def temp = R16 ;регистр для промежуточных операций ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp . ; Для использования альтернативной функции линии PB3, как ; источника формирующего ШИМ-сигнал OC2, прежде всего ее ; необходимо настроить на вывод. cbi PORTB,PB3 sbi DDRB,DDB3 ; Частота следования импульсов в режиме Fast PWM : FOC2= ; Fclk/(256*N). Режим работы таймера-счетчика задается битами ; WGM22:WGM20(при WGM13:WGM10 = 011 – режем Fast PWM), значение ; N – битами CS22:CS20 в регистре TCCR2. При Fclk=1 МГц и N=8 ; (CS22:CS20 = 010–коэффициент деления предделителя частоты ; N=8): FOC2= 125 кГц. В момент совпадения TCNT2 и OCR2 ; происходит установка флага OC2F, а при переполнении TCNT2 ; установка флага TOV2 в регистре флагов TIFR. Биты COM21:COM20 ; в регистре TCCR2 определяют поведение вывода OC2 в моменты ; установки флагов OCF2 и TOV2. При COM21:COM20 = 01 – состояние ; OC2 меняется на противоположное. ldi temp,0xF0 out TCNT2,temp ldi temp,0x20 out OCR2,temp ldi temp,(1

Источник: http://shemopedia.ru/analogovyiy-vyivod.html

Программирование Arduino – аналоговый ввод/вывод

4. Аналоговый ввод/вывод сигнала

теперь рассмотрим специфичные функции Arduino для аналогового ввода-вывода.

int analogRead(uint8_t);

Вызов:value = analogRead(порт); Описание:

Считывает значение с указанного аналогового порта. Arduino/Freeduino содержит 6 каналов аналого-цифрового преобразователя на 10 битов каждый.

Это означает, что входное напряжения от 0 до 5В преобразовывается в целочисленное значение от 0 до 1023. Разрешающая способность считывания составляет: 5V/1024 значений = 0,004883 В/значение (4,883 мВ). Требуется приблизительно 100 нсек (0.

0001 сек), чтобы считать значение аналогового ввода, так что максимальная скорость считывания — приблизительно 10000 раз в секунду.

Параметры: порт: номер опрашиваемого аналогового входа Возвращаемое значение: возвращает число типа int в диапазоне от 0 до 1023, считанное с указанного порта.

Пример: int val; val = analogRead(0); // считываем значение на 0м аналоговом входе Примечание:

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

void analogWrite(uint8_t, int);

Вызов:analogWrite(порт, значение); Описание:

Выводит на порт аналоговое значение. Эта функция работает на: 3, 5, 6, 9, 10, и 11 цифровых портах /Freeduino/. На старых версиях плат Arduino на основе микроконтроллера ATmega8 функция analogWrite() работает только на портах 9, 10 и 11.

Может применяться для изменения яркости светодиода, для управления двигателем и т.д. После вызова функции analogWrite, соответствующий порт начинает работать в режиме напряжения до тех пор, пока не будет следующего вызова функции analogWrite (или функций digitalRead / digitalWrite на том же самом порте).

Параметры: порт: номер опрашиваемого аналогового входа значение: целочисленное между 0 и 255. Значение 0 генерирует 0 В на указанном порте; значение 255 генерирует +5В на указанном порте.

Для значений между 0 и 255, порт начинает быстро чередовать уровень напряжения 0 и +5 В — чем выше значение, тем, более часто порт генерирует уровень HIGH (5 В).

Пример: analogWrite(9, 128); // устанавливаем на 9 контакте значение эквивалентное 2,5В Примечание: Нет необходимости вызвать функцию pinMode, чтобы установить порт на вывод сигналов перед вызовом функции analogWrite.

Частота генерирования сигнала – приблизительно 490 Гц.

void analogReference(uint8_t mode);

Описание:

Определяет Источник Опорного Напряжения (ИОН) для АЦП.

Функция analogRead()вернёт 1023 для Опорного Напряжения. Параметры:

DEFAULT: по-умолчанию 5V

INTERNAL: внутренний — используется внутренний источник в МК: 1.1V на ATmega168 и 2.56V на ATmega8.
EXTERNAL: внешний – использует, источник, подключённый к порту AREF.

По-умолчанию используется 5V (DEFAULT) см. код.

Код ( функция объявлена в hardwarecoresarduinowiring.h , а реализована в hardwarecoresarduinowiring_analog.

c): uint8_t analog_reference = DEFAULT; void analogReference(uint8_t mode) { // can't actually set the register here because the default setting // will connect AVCC and the AREF pin, which would cause a short if // there's something connected to AREF.

analog_reference = mode; } Вызов:analogReference(DEFAULT);Возвращаемое значение: Ничего Примечание: Внешний ИОН, нужно подключать к порту AREF через резистор в 5k, чтобы избежать повреждения МК.

читать далее:

Ссылки:

(или же в каталоге ArduinoIDE
eferenceHomePage.html )

Источник: http://robocraft.ru/blog/arduino/32.html

Аналоговый Ввод/Вывод

Главная → Библиотека Arduino → Описание языка Arduino на русском языке → Аналоговый Ввод/Вывод Библиотека Arduino → Описание языка Arduino на русском языке

analogReference (type)
Описание:

Устанавливает опорное напряжение для аналоговых входов.

Функция analogRead () вернет 1023 для входного уровня равного опорному напряжению.

параметры могут быть следующими:DEFAULT: Значение опроного напряжения по умолчанию 5ВINTERNAL: используется внутренний источник опорного напряжения, уровень которого равен 1,1В для ATmega168 и 2,56В для ATmega8EXTERNAL: Уровень опорного напряжения подается с внешнего источника на пин AREF платы.

Параметры:

type: типа испоьлзуемого опорного напряжения (DEFAULT, INTERNAL, или EXTERNAL).
Внимание:
Хорошим способом считается подключение внешнего источника к AREF через резистор в 5к. Это может предотвратить проблемы связанные с чипом ATmega если установки analogReference () не совместимы с токовой защитой. Следует помнить, что резистор уменьшает подаваемое напряжение, поскольку имеется внутренний резистор на 32к на пине AREF. Два резистора образуют делитель напряжения.Подключение внешнего источника опортного напряжения позволяет изменять напряджение AREF на лету, не принимая дополнительных конфигураций АЦП.

Использование вывода AREF

Поданное с внутренного источника напряжение вывода AREF на порт АЦП выдаст максимальное значение — 1023.Меньшие напряжения пропорциональны. Таким образом, при DEFAULT, поданное на вход АЦП напряжение 2,5В выдаст приблизительно 512.

По умолчанию во всех реализациях Arduino ничего не покдлючаено к AREF (ATmega вывод 21) В этом случае установка DEFAULT для analogReference подключает вывод AREF к AVCC. Это дает низкое сопротивление подключения.

Поэтому, ошибочное внешнее подключение AVCC к выводу AREF при установке DEFAULT могут быть опасными для чипа ATMEGA.

Вывод AREF также может быть подключен ко внутреннему испочнику в 1,1В (или 2,56 на ATmega8) используя analogReference (INTERNAL).С такой установкой подведенное к аналоговым входам напряжение равное или большеее опорного выдадут результат в 1023. Меньше напряжения выдадут пропорциональные результаты. Так, 0,55В дадут около 512.Соденинение между источником 1,1В и выводом AREF высокоимпедансвое и измерить его можно только мультиметром с высоким входным сопротивлением. Внешний источник, подключенный в выводу AREF не повредит чип, однако, перезапишет значение в 1,1В и АЦП будет опираться на внешний источник.

Корректные установки для подключения внешнего источника — analogReference (EXTERNAL). Она отключает все внутренние источники и поданное внешнее напряжение на вывод AREF устанавливает опорное напряжение для АЦП.

analogRead ()
Описание:

Читает значение определенного аналогового вывода. Платформы Arduino имеют 6 (8 у Mini и Nano) 10-битных Аналогово-Цифровых преобразователей. Это означает, что входные напряжения между 0 и 5Впереводятся в цифровое значение от 0 до 1023. Дискретность преобразования в таком случае составляет 5/1024 = 0,0049В.Выполнение преобразования занимает порядка 100мкс, т.е. максимальная скорость считывания составляет 10 000 раз в секунду.

Синтаксис:

analogRead (pin)
Параметры:
pin: номер аналогового пина, который следует прочесть (от 0 до 5 на большистве платформ, или от 0 до 7 на Mini и Nano)
Возвращает:
int (0 to 1023)
Примечание:Если аналоговый вход ни к чему не подключен, то возвращаемое значение будет зависеть от различных факторов, начиная уровнем напряжения на соседних выводах и заканчивая расстоянием от ваших рук до вывода.

Пример:

int analogPin = 3; // potentiometer wiper (middle terminal) connected to analog pin 3int val = 0; // variable to store the value read

void setup ()

{

Serial.begin (9600); // setup serial

}

void loop ()

{

val = analogRead (analogPin); // read the input pin

Serial.println (val); // debug value}

analogWrite ()
Описание:

Пишет аналоговое значение (заполнение ШИМ) в порт. Может использоваться, например, для установки различной яркости свечения светодиодов, регулирования скорости двигателей.

После вызова этой функции на выводе будет присутсвовать меандр с определенным заполнением до нового вызова этой или другой функции в применении к этому порту. Частота сигнала ШИМ состовляет примерно 490Гц.На новых платформах, включая Mini и BT на чипе ATmega168, эта функция работает на выводах 3,5,6,9,10 и 11.

На более старых USB и Serial платформах на чипе ATmega8 поддерживаются только порты 9,10 и 11

Синтаксис:

analogWrite (pin, value)
Параметры:pin: вывод, на который пишем.

value: коэффициент заполнения: между 0 (всегда выключен) и 255 (всегда включен).

analogWrite не имеет никакого отношения к портам АЦП и analogRead.

Вам не нужно вызывать pinMode () для установки вывода как выходного, перед использованием функции analogWrite ().

На выводах 5 и 6 генерируется напряжение чуть большее, чем установленное коэффициентом заполнения. Вызвано это 

функциями millis () и delay (), которые используют один и тот же внутренний таймер, что и для генерации ШИМ. Поэтому analogWrite (x, 0) не полностью выключает выводы 5 и 6.

Пример:Устанавливает яркость свечения светодиода в зависимости от положения потенциометра.

int ledPin = 9; // LED connected to digital pin 9int analogPin = 3; // potentiometer connected to analog pin 3int val = 0; // variable to store the read value

void setup ()

{

pinMode (ledPin, OUTPUT); // sets the pin as output

}

void loop ()

{

val = analogRead (analogPin); // read the input pin

analogWrite (ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}

Аналоговый Ввод/Вывод, Описание языка Arduino

11.04.2011, 12456 просмотров.

Источник: http://arduino.net.ua/Arduino_articles/Opisanie%20jazyka%20Arduino%20na%20russkom%20jazyke/Analogovyj%20Vvod%20i%20Vyvod/

Аналоговый функционал Arduino: как использовать его в своих проектах

Журнал РАДИОЛОЦМАН, февраль 2012

Lee Goldberg, Electronic Products

Будь вы инженер-разработчик, или просто любитель, вы сможете понять и оценить простоту использования аналоговых входов/выходов открытой аппаратной платформы Arduino в приложениях, работающих с «реальным миром».

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

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

Если Вы еще не знакомы с Arduino, обратите внимание на ссылки в конце статьи.

В соответствии с принятой философией – сделать применение цифровых технологий в реальном мире максимально простым, – аппаратная платформа Arduino была разработана таким образом, чтобы обеспечить возможность полного использования аналоговых функций, встроенных в универсальный 8-разрядный микроконтроллер ATmega компании Atmel.

Все варианты микроконтроллеров, используемых в платформе Arduino, оснащены внутренним многоканальным АЦП, который имеет 10-битное разрешение и способен производить до 15000 выборок в секунду, представляя результаты в форме целых чисел от 0 до 1023.

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

Хотя некоторые AVR микроконтроллеры оснащены цифро-аналоговыми преобразователями, в нынешнем поколении плат Arduino используются представители семейства, аналоговые сигналы на выходах которых получаются с помощью широтно-импульсной модуляции (ШИМ).

Коэффициент заполнения импульсов, имеющих частоту приблизительно 490 Гц, программируется на каждом выходе ШИМ, что дает возможность получать эквивалентное действующее напряжение в диапазоне от 0 В до 5 В с 8-битным разрешением (Рисунок 1).

Несмотря на некоторые ограничения в своих возможностях, выходы Arduino могут быть использованы для многих задач, таких как управление светодиодами и электродвигателями.

Рисунок 1. Широтно-импульсная модуляция позволяет превратить цифровые линии ввода/вывода общего назначения в аналоговые выходы Arduino.

Большинство плат Arduino, как «официальных», так и других изготовителей, предоставляют легкий доступ к аналоговым (и цифровым) сигналам микроконтроллера посредством разъемов по краям платы.

Количество аналоговых каналов и их физическое соответствие варьируются в зависимости от конкретного используемого микроконтроллера и форм-фактора платы, но многие варианты придерживаются соглашений, принятых для официальных проектов Arduino – Arduino Uno (Рисунок 2), Mega и Nano.

Рисунок 2. Аналоговые входы (A0 – A5) на плате Arduino Uno (rev3) и выходы ШИМ (цифровые выходы 3, 5, 6, 9, 10, 11) физически доступны через стандартные однорядные разъемы по краям платы.

Разработка программного кода для функций аналогового ввода/вывода также несложна, т.к. среда разработки Arduino IDE содержит набор соответствующих собственных команд. Эти команды позволяют считывать аналоговые значения, генерировать выходной ШИМ сигнал и конфигурировать опорное напряжения для АЦП.

Аналого-цифровое преобразование и чтение данных

Задача использования аналоговых входов платформы Arduino в реальных приложениях довольно проста, но требует определенного внимания при выборе надлежащего источника опорного напряжения для АЦП. Чтобы определить верхний предел диапазона входного напряжения АЦП, здесь можно использовать источник опорного напряжения по умолчанию (Default), внутренний (Internal) или внешний (External).

В режиме Default микроконтроллер в качестве опорного источника использует выход установленного на плате Arduino стабилизатора напряжения. В зависимости от конкретного типа платы, это либо 5 В, либо 3.3 В.

В режиме Internal используется встроенный в микроконтроллер прецизионный источник опорного напряжения. Выходное напряжение этого источника различно в различных микроконтроллерах, и как правило составляет 1.1 В (для ATmega168 и ATmega328) или 2.56 В (для ATmega8 и других из серии mega).

Режим External позволяет подключить внешний источник опорного напряжения к выводу микроконтроллера AREF через резистор номиналом 5 кОм. Вывод AREF имеет внутренний защитный резистор 32 кОм, который совместно с резистором 5 кОм образует делитель напряжения. Это означает, что при напряжении 2.

5 В, приложенном через резистор, на выводе AREF будет 2.5 × 32 / (32 + 5) ≈ 2.2 В.

Чтение аналоговых напряжений с помощью языка программирования Arduino заключается в выборе источника опорного напряжения с использованием команды analogReference (type) и вызова функции analogRead(pin), где

pin указывает на номер вывода разъема платы.

После назначения источника опорного напряжения он остается активным до выбора другого источника. Несмотря на то, что микроконтроллеры AVR поддерживают скорость преобразования до 15000 выборок в секунду, аппаратно-программная платформа Arduino, как правило, ограничивает это значение до 10000 выборок.

Создание аналоговых выходов ШИМ

Для генерации аналогового напряжения на одном из выводов ШИМ платы Arduino требуется конфигурирование этого вывода с помощью команды pinMode(pin, mode) и последующего вызова функции analogWrite(pin, value), где

pin – указывает номер вывода ШИМ на разъеме платы Arduino,
value – значение, задающее выходное напряжение ШИМ (8-битное число в диапазоне 0-255).

На сконфигурированном однажды выходе будет постоянно присутствовать сигнал ШИМ частотой 490 Гц с заданными параметрами до следующего вызова функции analogWrite() (или digitalRead(), или digitalWrite()) для этого же вывода микроконтроллера.

Линии ввода/вывода микроконтроллера способны отдавать в нагрузку ток до 40 мА, поэтому они пригодны для непосредственного управления небольшими массивами светодиодов.

Для управления более мощными источниками света или электродвигателями аналоговый выход микроконтроллера можно соединить с мощным транзистором или мостовой схемой.

В приложениях более требовательных к качеству аналогового сигнала (усилители, источники тока) могут применяться простые RC фильтры.

Дополнительные аналоговые функции

Некоторые микроконтроллеры AVR (включая ATmega8 и ATmega168) имеют аналоговый компаратор, позволяющий сравнивать входное напряжение с другим внешним напряжением, которое может поступать с выхода ШИМ или от встроенного источника опорного напряжения микроконтроллера.

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

Эта функция может использоваться в детекторах движения с регулируемым порогом и датчиках удара в биомедицинском мониторинге.

Для плат Arduino, микроконтроллеры которых не имеют встроенного аналогового компаратора, относительно легко можно добавить внешний компаратор LM741, LM339N или TLC3704, установив его в макетной области платы. Если свободного места на вашей плате нет, можно использовать специальную плату для прототипирования (Рисунок 3).

Рисунок 3. АналоПлата для прототипирования позволит подключать ваши собственные аналоговые (или цифровые) схемы ввода/вывода к стандартным платам Arduino.

Ссылки

  1. Радиолоцман», 2011, 11, стр. 13, «Как создавали и продвигали Arduino».
  2. Радиолоцман», 2011, 12, стр. 44, «Открытая платформа Arduino высвобождает творческий потенциал».
  3. Радиолоцман», 2012, 01, стр. 34, «Открытая платформа Arduino высвобождает творческий потенциал. Arduino Shields – расширение возможностей аппаратной платформы».

Источник: https://www.rlocman.ru/review/article.html?di=113242

Аналоговые порты. Потенциометр

Последний урок, который остался в меню File→Examples→1.Basics – это AnalogReadSerial. Для примера нам понадобится новый компонент – потенциометр. Поначалу я напрягся, прочитав незнакомое слово.

Но взглянув на деталь, понял, что это обычный регулятор. С его помощью можно регулировать напряжение проходимого тока.

Цель урока – плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить текущее значение напряжения.

Чуть теории. На плате есть шесть выводов, которые подписаны от A0 до A5. Они работают с напряжением от 0 до 5V. Для чтения показания напряжения есть встроенный метод analogRead(), возвращающий значение от 0 до 1023. Значение 0 относится к 0V, а 1023 к 5V. Таким образом, если мы хотим конвертировать значение от 0 до 5, то нужно произвести деление 1023/5 = 204.6

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

И, наоборот, цифровые порты с символом ~ (3, 5, 6, 9, 10, 11) могут работать как аналоговые выходы.

Для начала изучим простой пример с проводом. Соединим проводом порты A0 и 3.3V. Напишем скетч.

int analogPin = A0; void setup() { Serial.begin(9600);
} void loop() { int rawReading = analogRead(analogPin); float volts = rawReading / 204.6; Serial.println(volts); delay(1000);
}

Откройте окно Serial Monitor и наблюдайте за показаниями. Должны выводиться числа, близкие к значению 3.3: 3.1, 3.2, 3.3. Если, не закрывая программу, вытащить конец провода из порта 3.3V и вставить в порт 5V, то показания изменяется и на экране появятся числа 5.0. Если перекинуть конец провода на GND, то увидим значения 0.

Таким образом мы видим, что можем получать значения напряжения из аналоговых портов.

Потенциометр

Итак, для изучения следующего урока нам понадобятся плата Arduino, потенциометр и несколько проводов (или перемычек). Обратите внимание, что потенциометра есть две парные ножки и еще одна отдельная ножка (средняя). Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

Не важно, какая из крайних ножек потенциометра будет подключена к 5V, а какая к GND, поменяется только направление, в котором нужно крутить ручку для изменения напряжения.

Сам сигнал считывается со средней ножки, которая связана с аналоговым портом. Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN.

Они все пронумерованы с префиксом A (A0-A5).

Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подается на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.

Схема будет выглядеть следующем образом.

Код

void setup() { // инициализируем соединение на скорости 9600 бит в секунду: Serial.begin(9600);
} void loop() { // Считываем данные с аналогового вывода A0 int sensorValue = analogRead(A0); // получаем текущее значение Serial.

println(sensorValue, DEC); // выводим результат на монитор delay(1); // небольшая задержка для стабильности вывода результатов
}

Код очень простой. При инициализации устанавливаем нужную скорость связи: Serial.begin(9600);. Далее в цикле мы постоянно считываем данные, поступающие с потенциометра при помощи метода analogRead().

Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue.

Полученный результат будем выводить в окно последовательного монитора в десятичном формате.

Проверка (Serial Monitor)

Запустите программу, а также откройте окно последовательного монитора (Tools→Serial Monitor). Вращая регулятором потенциометра, вы можете наблюдать, как в окне будут меняться значения от 0 до 1023.

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

Также напряжение может меняться от нажатия, от температуры и т.д. При этом нам не нужно менять программу, просто одну деталь меняем на другую и код будет выполняться.

Единственное различие будет в выводимых результатах – каждый делитель напряжения имеет свои характеристики и, соответственно, будет давать свои показания.

Проверка (Serial Plotter)

Начиная с версии Arduino IDE 1.6.6, в настройках появился новый инструмент Plotter (Tools→Serial Plotter), позволяющий выводить простенький график. Обратите внимание, что он не может работать одновременно с последовательным монитором, который следует закрыть.

Вращая ручку потенциометра, можем наблюдать изменение графика.

Подключаем светодиод

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

Принципиальная схема.

Напишем код.

int potPin = A0;
int ledPin = 9; void setup() { // порт для светодиода на выход pinMode(ledPin, OUTPUT); // пин с потенциометром – вход // мы хотим считывать напряжение, // выдаваемое им pinMode(potPin, INPUT); Serial.begin(9600);
} void loop() { // значение напряжения с потенциометра int rotation; // значение яркости int brightness; // считываем напряжение с потенциометра от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(potPin); // в brightness записываем полученное ранее значение rotation // делённое на 4. Дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4; // выдаём результат на светодиод analogWrite(ledPin, brightness); // выводим результат в Serial Monitor Serial.println(brightness); delay(1); // задержка для стабильности
}

Практически все инструкции вам знакомы. Тут нужно уяснить момент, что яркость светодиода управляется нашим кодом, а не подачей напряжения через потенциометр. Мы считываем показания потенциометра, как в первом варианте и переводим получаемые значения в диапазон от 0 до 255.

Затем воспроизводим старый пример с плавной регулировкой светодиода и подаём ему нужные значения. Теперь при вращении ручки потенциометра мы одновременно управляем степенью накала светодиода.

Напомню, что светодиод следует подключить к портам с тильдой, например, ~9

Другие примеры

Потенциометр и светодиодная шкала

Реклама

Источник: http://developer.alexanderklimov.ru/arduino/analogreadserial.php

Операции аналогового ввода—вывода, работа со звуком. Знакомство с Arduino. (часть 3)

Р/л технология

Главная  Радиолюбителю  Р/л технология

Хотя цифровые операции ввода-вывода позволяют решать широкий круг задач, однако наличие в микроконтроллере платы Arduino встроенного аналого-цифрового преобразователя (АЦП) и возможность вывода аналоговых сигналов с помощью широтно-импульсной модуляции (ШИМ) обеспечивают работу с аналоговыми датчиками и всевозможными исполнительными устройствами, воздействующими на объект пропорционально управляющему сигналу.

Строго говоря, в режиме вывода все линии портов Arduino могут передавать только дискретные сигналы, имеющие лишь два состояния. Но микроконтроллер способен изменять эти состояния очень быстро, генерируя прямоугольные импульсы.

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

В режиме ШИМ порт формирует импульсный сигнал постоянной частоты и переменной скважности (это отношение периода следования импульсов к их длительности).

Часто вместо скважности оперируют обратной ей величиной – коэффициентом заполнения, который можно изменять от 0 (нет импульсов) до 100% (импульсы следуют, слившись, без пауз).

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

В Arduino UNO в режиме ШИМ могут работать выходы D3, D5, D6, D9, D10 и D11. Обычно на плате они помечены знаками “~” или аббревиатурами “PWM”. Следует заметить, что у плат Arduino других модификаций число таких выходов может быть больше или меньше.

В простейшем случае ШИМ можно применить для управления яркостью свечения светодиода. Этот прибор практически безынерционен, но человеческое зрение обладает достаточной инерционностью, чтобы последовательность быстрых вспышек светодиода воспринималась как непрерывное свечение с зависящей от коэффициента заполнения яркостью.

Дискретные выходы, способные формировать ШИМ, настроены на использование этого режима по умолчанию, поэтому вызывать функцию pinMode() для их работы в таком режиме не нужно.

Для установки коэффициента заполнения ШИМ-сигнала имеется стандартная функция analogWrite(N, M), где N – номер вывода, M – число, пропорциональное требуемому коэффициенту заполнения.

Оно должно лежать в интервале от 0 до 255, причём 0 соответствует нулевому коэффициенту заполнения (навыходе постоянный низкий уровень), 255 – коэффициенту заполнения 100 % (на выходе постоянный высокий уровень). Временные диаграммы выходного напряжения при некоторых значениях M и соответственно коэффициента заполнения Кз показаны на рис. 1.

Рис. 1. Временные диаграммы выходного напряжения

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

Она основана на стандартном примере examples3.AnalogFading из комплекта поставки Arduino IDE.

Перебор значений коэффициентазаполнения импульсов реализован здесь с помощью уже рассмотренных в [1] операторов цикла for.

Таблица 1.

Для приёма аналоговых сигналов от внешних устройств в Arduino предназначены входы A0-A5, по умолчанию установленные в нужное для этого состояние, так что дополнительной инициализации не требуется. АЦП, встроенный в Arduino UNO, формирует 10-разрядные двоичные коды и входное напряжение, лежащее в интервале от 0 до +5 В, преобразует в целое число от 0 до 1023 (210-1).

Для считывания результата преобразования служит функция analogRead(N), где N – номер аналогового входа.

К аналоговым входам Arduino можно подключать разнообразные датчики, выходное напряжение которых пропорционально измеряемой величине (переменные резисторы, терморезисторы, фоторезисторы и др.). Однако нужно помнить, что на аналоговый вход можно подавать напряжение лишь от 0 до +5 В.

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

Опрос аналогового входа выполняется с частотой менее 10 кГц [2], что может оказаться недостаточным для анализа некоторых быстроизменяющихся сигналов.

Наличие аналоговых входов позволяет превратить Arduino в простейший цифровой вольтметр, измеряющий постоянное напряжение от 0 до +5 В и передающий результат измерения в компьютер. Для этого достаточно загрузить в Arduino программу, приведённую в табл. 2.

Таблица 2

Обратите внимание, что в программе константами заданы образцовое напряжение АЦП Uref (в милливольтах) и коэффициент пересчё-тавыходного кодаАЦП в напряжение Ku. Значение коэффициента вычисляется делением заданного образцового напряжения на 1023.

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

Поскольку в правой части формулы находятся только константы, вычисляет коэффициент не микроконтроллер, выполняя программу, а сам компилятор на этапе её трансляции.

Всё это позволяет повысить точность вольтметра, измерив мультиметром точное значение образцового напряжения на выводе Uref платы Arduino и записав его в программу, присвоив константе Uref. О других способах повысить точность аналого-цифрового преобразования можно прочитать в [3, 4].

При работе рассматриваемой программы на плате мигает светодиод TX, сигнализирующий о передаче информации через последовательный порт. Светодиод RX не светится, так как компьютер ничего не передаёт в ответ. Встроенный терминал Arduino IDE отображает принятую информацию (рис. 2) – результаты измерения напряжения гальванической батареи 3332.

Рис. 2. Окно программы

Arduino может подавать не только световые, но и звуковые сигналы. Для этого к одному из его выходов необходимо подключить пьезоизлучатель звука, например ЗП-1 (рис. 3).

Рис. 3. Подключение пьезоизлучателя звука

Для работы со звуком предусмотрена специальная функция tone(N, F, T), где N – номер вывода, на котором будут сформированы прямоугольные импульсы; F – частота звука, Гц; T – длительность звука, мс. Последний параметр не обязателен. В его отсутствие звук будет непрерывным. Чтобы выключить его, предусмотрена функция noTone(N).

Конечно, пьезокерамический излучатель звука сложно назвать устройством высококачественного воспроизведения, а формируемый микроконтроллером сигнал имеет прямоугольную форму, тем не менее использование этих функций позволяет исполнять несложные мелодии. Пример приведён в табл. 3. Это немного изменённая программа examples 02.

Digital oneMelody, входящая в комплект среды разработки Arduino IDE. Поскольку задавать вручную частоту каждой ноты мелодии неудобно, к программе в её заголовке директивой #include подключён файл pitches.h. Эта операция равносильна включению в программу полного текста этого файла.

В рассматриваемом случае он содержит список названий нот, которые можно воспроизвести, и их частот.

Таблица 3

Излучатель звука должен быть подключён к выходу D8.

Для программы мелодия – это последовательность однотипных констант (значений частоты), которые удобно объединить в массив – пронумерованный список однотипных элементов. При объявлении массива нужно либо перечислить все его элементы, либо указать их общее число. Учтите, что нумерация элементов массива всегда начинается с нуля.

В рассматриваемом примере использованы два массива: int melody[] содержит названия нот мелодии, int note Durations[] – их длительность в миллисекундах. Для обращения к элементу массива указывают его имя с заключённым в квадратные скобки порядковым номером.

Чтобы иметь возможность легко менять число нот в мелодии, оно вычисляется с использованием функций sizeof(V), возвращающих число байтов, занимаемых её аргументом (переменной или их массивом) в памяти микроконтроллера. В рассматриваемом случае массив melody занимает 16 байт, а длина его элементов типа int – два байта.

Поэтому переменная Note получает значение 8 и именно столько раз будет повторено тело цикла for, поочерёдно воспроизводящее ноты.

Если к массиву melody[] добавить несколько нот, соответственно изменится и значение Note. Нужно только не забыть дополнить массив noteDurations[] длительностями звучания этих нот.

Поскольку мелодия исполняется один раз, все необходимые для этого операции помещены внутрь функции setup().

Для повторного исполнения нужно привести микроконтроллер в исходное состояние, нажав на находящуюся на плате Arduino кнопку RESET

Рассмотренные в статье программы для Arduino можно скачать здесь.

Литература

1. Лекомцев Д. Arduino. Операции цифрового ввода-вывода. – Радио, 2016, № 8, с. 51-54.

2. Аналоговые измерения с Arduino. – URL: http://robotosha.ru/arduino/analog-measurements-arduino.html (02.06.16).

3. Arduino Language Reference. Analog I/O – analogReference(). – URL: https://www. arduino.cc/en/Reference/AnalogReference (02.06.16).

4. Функция analogReference(). – URL: http:// arduino.ru/Reference/AnalogReference (02.06.16).

Источник: http://www.radioradar.net/radiofan/radiofan_technology/introduction_arduino_part3.html

Большая Энциклопедия Нефти и Газа

Cтраница 1

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

Аналоговые сигналы поступают через мультиплексор устройстваналогового ввода-вывода ( АВВО) в их АЦП, формирующие цифровые коды входных сигналов вычислительной части регулятора.  [2]

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

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

ИС могут работать в режиме суммирования токов на внешнем резисторе в составе АЦП последовательного приближения.  [3]

Общая примерная последовательность помодульного тестирования измерительного прибора со встроенным микропроцессором следующая: тест ПЗУ, тест ЦП, тест дисплея, тест ОЗУ, тест устройств внешней памяти, тест устройств дискретного ввода-вывода, тест устройстваналогового ввода-вывода, тест измерительной схемы.  [4]

Допустим, что каждая из станций управления FCS имеет аппаратное резервирование вплоть до модулей ввода-вывода. Модулианалогового ввода-вывода, связанные с регулированием, также резервированы.  [5]

Структура программируемого контроллера.  [6]

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

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

Межмашинная магистраль предназначена для объединения 24 устройств типа В7 / В9 в единую управляющую систему. Дистанционная магистраль ( последовательная, дублированная) позволяет связывать в систему до 62 устройств, удаленных на значительные расстояния.  [7]

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

Примерами аппаратных модулей, которые должны отлаживаться под управлением программного обеспечения, являются модулианалогового ввода-вывода, модули параллельного и последовательного цифрового ввода-вывода, программируемые таймеры, программируемые контроллеры прямого доступа к памяти ( ПДП), программируемые контроллеры прерываний и другие программно-управляемые периферийные устройства.  [8]

Страницы:      1

Источник: http://www.ngpedia.ru/id348868p1.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}