Ацп ардуино: Аналого-цифровые преобразования — АЦП | Класс робототехники

Содержание

Arduino. Работа с АЦП. Подключение переменного резистора

Очень полезный модуль в составе микроконтроллера — аналого-цифровой преобразователь. Он позволяет микроконтроллеру измерять произвольное напряжение.
В прошлой статье мы описывали, как можно считать логическое состояние входа, то есть «0» или «1». Аналого-цифровой преобразователь считывает величину напряжения на выводах A0-A5. Это дает возможность считать данные с датчика освещенности, измерить напряжение питания и т.д.

Подготовка к работе

На нашем TutorShield для освоения работы с АЦП есть три переменных резистора. Для их подключения к выводам A0-A2 установите перемычке так, как показано на рисунке:

Подключение переменных резисторов

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

Первый пример

Для начала попробуем просто считать напряжение на выводе микроконтроллера A0 и отправить его в COM-порт.


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


int val;

void setup() {
    Serial.begin(9600);
}

void loop() {
    val = analogRead(A0);
    Serial.println(val);
    delay(1000);
}

В микроконтроллере Atmega8A, который используется на нашей плате EduBoard, есть модуль АЦП с разрешением 10 бит и возможностью мультиплексирования шести входов. Эти входы пронумерованы A0-A6 (или 14-19).
Измерение производится относительно напряжения питания. Ни в коем случае нельзя подавать на вход отрицательное напряжение или напряжение, превышающее питание! Мы подключили ко входу переменный резистор и наше входное напряжение точно не выйдет за рамки питания.

Теперь разберемся с тем, что нам будет присылать плата. Раз разрешение 10 бит — в десятичном виде значение будет меняться от 0 до 1023. Измерение производится относительно 5-ти вольт, поэтому изменение показаний на 1 соответствует фактическому напряжению 5/1023=4.9мВ. То есть средствами встроенного АЦП микроконтроллера можно измерить напряжение с точностью до 4.9мВ.
Вернемся к скетчу. В результате выполнения строчки …


val = analogRead(A0);

… в переменную val будет записано оцифрованное напряжение, считанное на выводе A0. Откройте монитор порта (Ctrl+Shift+M) и посмотрите, как меняются показания АЦП при вращении вала переменного резистора. Обратите внимание, что нет нужды настраивать вывод при этом на вход.
Теперь пора немного улучшить работу с модулем аналого-цифрового преобразователя. На практике младшие разряды АЦП могут сильно флуктуировать из-за шумов и их обычно отбрасывают, причем сразу два разряда. При этом остается 8ми-битное число с которым гораздо удобнее работать. Точность при этом получается 5/255=19.6мВ, чего вполне достаточно для большинства ситуаций.

Измените код так, чтобы он присылал 8ми-битное значение. Замените строку с чтением состояния АЦП на это:


val = analogRead(A0)>>2;

Теперь переменной val мы присваиваем значение считанное из АЦП сдвинутое на два бита вправо. Остальные биты просто отбрасываются.

Второй пример

Теперь мы можем плавно изменять яркость светодиода при помощи ШИМ-модуляции, задавая ее переменным резистором. Установите перемычку «color» так, как описано в этой статье. Этим самым вы подключены к 9му, 10му и 11му выводу сегменты трехцветного светодиода.

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


#define BLUE 9

int val;

void setup() {
    pinMode(BLUE, OUTPUT);
}

void loop() {
    analogWrite(BLUE, (analogRead(A0)>>2));
}

Довольно простой код, если вы помните, как работает функция analogWrite(). При вращении вала переменного резистора светодиод будет менять свою яркость от минимума до максимума.
Кстати, если вы уберете сдвиг на два бита, при выполнении функции

analogWrite() будет наступать переполнение, так как она может принимать только значения от 0 до 255. Попробуйте убрать этот сдвиг и посмотрите, что получится.
И в заключении добавим управление всеми тремя светодиодами. Остается только найти отвертку, чтобы покрутить двумя остальными подстроечными резисторами.


#define BLUE 9
#define ORANGE 10
#define GREEN 11

int val;

void setup() {
    pinMode(BLUE, OUTPUT);
    pinMode(ORANGE, OUTPUT);
    pinMode(GREEN, OUTPUT);
}

void loop() {
    analogWrite(BLUE, (analogRead(A0)>>2));
    analogWrite(ORANGE, (analogRead(A1)>>2));
    analogWrite(GREEN, (analogRead(A2)>>2));
}

Индивидуальные задания

  1. Оставьте на шилде только перемычку от резистора на выводе A0 и подключите пьезоизлучатель также, как этой статье. Напишите программу, которая будет изменять частоту воспроизводимого звука, в зависимости от установки положения резистора.
  2. Подключите сегментный индикатор, так как это было описано ранее и, используя примеры из той же статьи, сделайте простейший вольтметр. На индикатор должны выводится цифры от 0 до 5.0В (хоть на индикаторе нашего шилда и нет разрядной точки), совпадающие с крайними положениями резистора, подключенного к выводу А0.

Остальные статьи цикла можно найти здесь.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

инструменты и методы технического волшебства

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

— 66 —

Точность АЦП зависит от его разрядности. На плате Arduino Uno установлен 10-разрядный АЦП. Это означает, что АЦП может разделить аналоговый сигнал на 210 различных значений. Следовательно, Arduino может присвоить 210 = 1024 аналоговых значений, от 0 до 1023.

Опорное напряжение определяет максимальное напряжение на входе АЦП, его значение соответствует коду 1023. При нулевом входном напряжении АЦП выдает на выходе 0, при входном напряжении 2,5 В на выходе будет значение 512 (половина от 1023), при входном напряжении 5 В выходной код равен 1023. Чтобы лучше понять это, посмотрите на графики для трех.разрядного АЦП, изображенные на рис. 3.2. В принципе, опорное напряжение АЦП можно изменить, но в наших устройствах опорным будет напряжение 5 В.

Рис. 3.2. Трехразрядное аналого-цифровое преобразование

У трех.разрядного АЦП 3 бита разрешения, поскольку 23 = 8, следовательно, у него есть 8 уровней, от 0 до 7. Любому аналоговому значению, которое поступает на вход такого АЦП, на выходе соответствует код от 0 до 7. На рис. 3.2 показано, что уровни входного напряжения преобразуются в выходные дискретные цифровые коды, с которыми может оперировать микроконтроллер. Чем выше разрядность, тем больше уровней, которые доступны для представления каждого значения. Как упоминалось, у Arduino Uno АЦП имеет 1024 уровней, а не 8, как на рис. 3.2.

ПРИМЕЧАНИЕ

Если вы хотите узнать больше об использовании нестандартного (или внешнего) опорного напряжения, посетите страницу на официальном сайте Arduino

http://www.arduino.cc/en/Reference/AnalogReference.

— 67 —

Микроконтроллеры платформа Arduino UNO АЦП, цифровая обработка сигналов

1. Микроконтроллеры платформа Arduino UNO АЦП, цифровая обработка сигналов

2.

Arduino UNO • Открытая (для всех), простая платформа для разработки «железяк».
• Включает микроконтроллер (ATmega328P
http://www.atmel.com/Images/doc8161.pdf)
• Стандартный набор аппаратных средств (USB чип+интерфейс, порты
ввода-вывода, кварцевый резонатор, резисторы, конденсаторы и т.д.)
Порты (пины)
USB чип
Ввода-вывода
интерфейс
с USB
ATmega328P
Микроконтроллер

3. Arduino UNO

14 дискретных портов ввода/вывода (digital
input/output). 0 или 1, т.е. 0 или 5 вольт.
Некоторые пины способны выполнять
специфические функции. Например, пины 0 и 1 –
последовательный интерфейс; 2 – ШИМ
модуляция
Интерфейс с
USB
для
взаимодействия
с ПК
Дополнительный
вход для
питания, можно
питать от USB
МК – мозг системы
Обработка информации
Питание Vdd +
GND (земля)
6 аналоговых входов
(analog inputs)

4. Двоичная система счисления

• Система счисления с основанием 2. 8-1).

6. Компаратор аналоговых сигналов

• Компаратор (аналоговых сигналов)
(англ. comparator — сравнивающее
устройство) — электронная схема,
принимающая на свои входы два
аналоговых сигнала и выдающая
логическую «1», если сигнал на
прямом входе («+») больше, чем на
инверсном входе («−»), и
логический «0», если сигнал на
прямом входе меньше, чем на
инверсном входе.
• Двоичный логический сигнал (БИТ)
на выходе двоичного компаратора
указывает, в каком из двух
поддиапазонов находится входное
напряжение.
double Vplus, Vminus, Vout
Vplus=2.45;
Vminus=1.12;
If Vplus>Vminus
THEN Vout=1
ELSE Vout=0

7. АНАЛОГО-ЦИФРОВОЙ ПРЕОБРАЗОВАТЕЛЬ (АЦП)

• Аналого-цифровой преобразователь (АЦП, Analog-to-digital converter,
ADC) — устройство, преобразующее входной аналоговый сигнал в
дискретный код (цифровой сигнал). Обратное преобразование
осуществляется при помощи ЦАП ( цифро-аналогового
преобразователя, DAC). 3-1=7.
Погрешность порядка 0.5 В при
диапазоне входных значений 0-4В.
• Выходное значение 101 означает, что
значение входной аналоговой величины
(2.75 В) лежит в диапазоне от 2.5В до 3В
(погрешность 0.5В).

10. Полностью паралллельный АЦП. Достоинства и недостатки.

• Достоинства:
• Скорость. Оцифровка выполняется за один цикл.
• Простота. Относительно простые аналоговые элементы (компараторы),
простейшая бинарная логика требуется лишь в конце, чтобы
преобразовать последовательность нулей и единиц в выходной
бинарный код.
• Нет необходимости использовать схему для кратковременного
запоминания отсчетов, так как оцифровка выполняется за один цикл. Это
очень важно для задач дальнейшей обработки и восстановления
сигнала.
• Недостатки. По сути, один. Необходимость использования большого
количества компараторов в схемах АЦП большой разрядности. Например,
если разрядность АЦП N=12, то количество компараторов должно быть
равно 2^12-1=4095.

11. Простейший последовательный АЦП

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

12. Простейший последовательный АЦП

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

13. АЦП последовательного приближения

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

14. АЦП последовательного приближения

15. АЦП последовательного приближения

0
0
1
0
1
0
1
1
1
1

16. АНАЛОГО-ЦИФРОВОЙ ПРЕОБРАЗОВАТЕЛЬ (АЦП) на ARDUINO

• Платформа Arduino UNO оснащена
контроллером ATMEGA328P 16MHz/8-bit. На
платформе имеются 6 аналоговых входов
(A0 – A5), однако контроллер имеет лишь
один 10 разрядный АЦП.
• В один момент времени лишь один
аналоговый вход может подключаться к
АЦП через мультиплексор. Следовательно, в
один момент времени Arduino UNO может
осуществлять измерение лишь одной
аналоговой величины. Выбор входа
осуществляется программно.
• Arduino UNO использует 10-разрядный АЦП
последовательного приближения -1024
уровня квантования. Aref – max входное
(опорное) значение АЦП

17. Скорость оцифровки сигнала.

• ATMEGA328P’s 10-bit ADC необходимо 13 отсчетов (тактов) для одного
аналого-цифрового преобразования.
• Однако часы АЦП Arduino UNO не используют прямые отсчеты времени
процессора (16 МГц).
• Отсчеты времени АЦП поступают с «делителя», который
характеризуется определённым числом. Чаще всего, это число 128
(может быть изменено программно). Таким образом, отсчеты АЦП
Arduino UNO выполняются с частотой 16 МГц/128 = 125 кГц или
0.125МГц.
• Так как на один цикл АЦП требуется 13 циклов счетчика, следовательно,
АЦП будет выполняться с частотой дискретизации 125 кГц/13=9.6 кГц.
• Для большинства промышленных АЦП разрядность составляет от 6 до
24 бит, частота дискретизации до 1 МГц.

18.

Зачем все это нужно??? • Возникает большое количество вопросов, связанных с переходом аналог
– цифра – аналог.
• Аналоговый сигнал непрерывен, цифровой — дискретен. Можно ли
восстановить исходный аналоговый сигнал из цифровой
последовательности единиц и нулей?
• Интуитивно понятно, что, по всей видимости, точность восстановления
сигнала каким-то образом связана с частотой его оцифровки. Но какова
эта связь?
• Что вообще подразумевается под восстановлением аналогового
сигнала? Какую часть исходной информации мы при этом потеряем?
• Что за математика лежит в основе цифро-дискретных преобразований?
• и т.д. и т.п…

19. Преобразование Фурье.

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

20. Теорема Котельникова-Шеннона

• Теорема связывает непрерывные и дискретные сигналы и гласит, что
любую функцию F(t), состоящую из частот от 0 до f1, можно непрерывно
передавать с любой точностью при помощи чисел, следующих друг за
другом через 1/(2f1) секунд.
• Следствия:
• Любой аналоговый сигнал может быть восстановлен с какой угодно точностью по
своим дискретным отсчетам, взятым с частотой f>2fc, где fc – максимальная
частота, которой ограничен спектр реального сигнала.
• Если максимальная частота в сигнале равна или превышает половину частоты
дискретизации, то способа восстановить сигнал из дискретного в аналоговый без
искажения не существует.

21. Теорема Котельникова – Шеннона. Пример.

22. Частота Найквиста

• Частота Найквиста — частота, равная половине частоты дискретизации.
• Из теоремы Котельникова следует, что при дискретизации аналогового
сигнала потерь информации не будет только в том случае, если (спектральная
плотность) наивысшая частота полезного сигнала равна половине или
меньше частоты дискретизации (в англоязычной литературе под
обозначением половины частоты дискретизации употребляют термин частота
Найквиста). В противном случае при восстановлении аналогового сигнала
будет иметь место наложение спектральных «хвостов» (подмена частот,
маскировка частот, алиасинг), и форма восстановленного сигнала будет
искажена.

АЦП и аналоговые датчики на ESP8266

WI-FI модуль ESP8266 имеет один внутренний АЦП (Аналого-цифровой преобразователь), а так же поддерживает внешние микросхемы АЦП: PCF8591 и MCP3201(тест).

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

Внутренний АЦП

Внутренний АЦП в ESP8266 имеет программную реализацию 10 бит(1023 значения) (битность можно повысить до 16). 

К сожалению данный АЦП имеет массу недостатков: он использует внутреннее опорное напряжение, которое может «плавать» от температуры и зависеть от экземпляра чипа ESP8266. АЦП так же имеет некоторую нелинейность. Погрешность измерения может составлять 5%. Хотя улучшить результат можно откалибровав свой датчик под данный АЦП через опцию Remap ADC.

Внешний АЦП PCF8591

Одна из дешевых I2C микросхем PCF8591 имеет 4 канала и разрядность всего 8 бит (256 значений). Возможно подключение внешнего опорного напряжения.

Внешний АЦП MCP3201

Одноканальный АЦП чип PCF8591 12 бит (4096 значения). Подключение по упрощенному SPI ( без MOSI). Возможно подключение внешнего опорного напряжения.

Основные подключения и настройки

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

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

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

 

Используем функцию Remap ADC

Remap ADC позволяет переназначать «попугаи» АЦП в нужную величину, в том числе и нелинейную.

Для каждого АЦП и/или канала АЦП отдельные настройки

Enable calibrate table — тут необходимо поставить галку, если вы хотите использовать Remap ADC на данном выходе АЦП.

Enable float — разрешить поддержку float , чисел с десятой частью. Например вывод напряжения в виде 5.4 вольт.

Calibrate table — таблица калибровок, где необходимо ввести соотвествие чисел в нужную величину.

Подключение лениейных датчиков:

В простейшем случае необходимо ввести в первой строке в поле VAL и в поле ADC число 0.

Во второй строке мы назначаем, чему будет равно например показание АЦП 1023 при 5000мВ. Вводим VAL 5000, ADC — 1023. Тут необходимо подобрать резисторный делитель или установить другое числа, которые будут соотвествовать данному значению. Для float режима в поле VAL необходимо вводить целое число 5.

Подключение нелинейных датчиков:

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

Промежуточные значения интерполируются автоматически.

Данная опция может исправить нелинейность у встроенного АЦП

 

Лабораторный блок питания. Вольтметр, работа с АЦП.: elchupanibrei — LiveJournal

Решил тут пилить лабораторный блок питания. В фавориты выбились три участника: раз, два, три, три, три.

Первые два не понравились шумами ШИМ-а на выходе. Третий не понравился архаичным управленим. Буду скрещивать ужа с ежем — линейник номер три и немного магии.

Сердцем будет Arduino Nano v3.0 на чипе FTDI. В место ШИМ-а два 12-bit ADC MCP4725. Так же в ролях участвуют: энкодер, термистор для котроля температуры радиатора и вентилятора, клон четырехстрочного ЖКИ экрана на HD44780 и пару операционников.

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

Сегодня расскажу как обстоят дела с первыми двумя модулями «adc.h» и «voltmeter.h». Встроенный АЦП Atmega328 имеет разрядность 10 бит. Существует програмный способ разогнать АЦП до любого заряда с помощью оверсемплинга. Подробнее об этом написанно здесь. Согласно таблице из документа, оптимальный вариант — 14 бит. 10 железных + 4 програмных. При этом сохраняется баланс между точностью (см. шестую колонку в таблице) и «скростью» (третья колонка). Скрость взята в кавычки не случайно, четыре програмных бита стоят нам лишних 256-и измерений.


Можно пойти еще дальше и аппаратно разногнать частоту измерения. За ее увеличение/уменьшение отвечает делитель называемый prescale. Он показывает во сколько раз тактовая частота АЦП меньше системной частоты. Prescale изменяется двумя битами ADPS2/ADPS2 в регистре ADCSRA. Например у Arduino Nano 5v тактовая частота 16 МГц. Если мы выставим prescale равный 128, то скорость АЦП будет равна 16000кГц / 128 = 125кГц. Именно на такой частоте работает АЦП в Arduino IDE.


У этого метода есть одна неприятная особенность — с ростом частоты снижается эффективая разрешающая способность АЦП. Это хорошо видно на графике.


Atmel не рекомендует увеличивать частоту выше 200кГц. Я заметил искажения результатов только после 250кГц, prescale = 64.

У Atmega328 одно измерение занимает 13 тактов или 250 / 13 = 19 мкс. На 14 бит мы тратим 256 * 19 = 4864мкс = 0.0049сек. Это значит, что максимальная частота измеряемого сигнала не должна превышать ~200Гц.


Второй важный элемент любого АЦП — это источник опорного напряжения. Чем лучше его стабильность тем выше точность наших измерений. Типичная ошибка новичков — использовать в качестве ИОН-а обычный регулятор типа LM7805, LM1117 с точностью 5%. В Atmega328 есть встроенный опорник на 1.1 вольт. Если он активирован, то нельзя подавать на AREF напряжение выше встроеннго ИОН-а.

К сожелнию встроенного опорника мне не хватило. Термистор подключен к 5в по стандартной схеме делителя в качестве R1. Сопротивление R2 выбранно 100кОм. Так как проводимость моего термистра при 25С равна 100кОм, то на выходе будет 2.5в, что за гранью добра. Пока в качестве «опорника» взял встроенный в FTDI стабилизатор на 3.3в. Качество стабилизации овно. Выдает 3.4в и плавает вслед за входным. Для отладки проекта сойдет, потом заменю на правильный — REF02. Выбрал его из-за дешевизны, на ebay просят $2.5 за две штуки.

Входное сопротивление ADC у Atmega328 около 10кОм. Поэтому желательно выбирать R2 в делителе меньше входного у меги.Чтоб не спалить «камень», делитель надо расчитывать так чтоб на при максимальном напряжении на входе, на выходе было не больше Vcc + 0.5в, а при минимальном не ниже -1в. Я выбрал 100кОм / 8.2кОм.

Сравнил 10 и 14 бит. Предел измерений 0..40 вольт. Подал на вход 4.95в. Результат на фотографии. Справа количество отсчетов АЦП. Вывод — если нужен один знак после запятой то 10 бит вполне подойдут, если два то только 14 бит. Третьему знаку после запятой верить не стоит и в финальной версии блока я его уберу. В следующей части раскажу о «thermistor.h».



Пока тестил код словил интересный глюк — сумашедшие значения. Теперь все переменные объявляю не просто int x, а только так int x = 0.

Все важные параметры такие как напряжение ИОН-а «REFERENCE_VOLTAGE», частота АЦП «ADC_PRESCALE» и передискретизация «EXTRA_ADC_RESOLUTION», прописанны в «adc.h» и легко меняются под ваши задачи.

Значение делителя и пин для вольтметра задается в «voltmeter.h» или сразу в теле функции если нужно больше двух.

Код проекта тут.

Сравнение ЙоТик 32b c контроллерами Arduino UNO R3, Wemos D1 R1/R2

Микроконтроллер ESP32 (ESP-WROOM-32) ATmega328P ESP8266E (ESP 12-E)
Разрядность процессора 32 бит 8 бит 32 бит
Количество ядер процессора 2 1 1
Тактовая частота 80 . .. 240 МГц 16 МГц 80 … 160 МГц
Встроенная память ROM 448 кб Нет Нет
Встроенная память RAM 520 кб 2 кб 160 кб
Встроенная память RAM в часах реального времени RTC FAST 8 кб Нет Нет
Встроенная память RAM в часах реального времени RTC SLOW 8 кб Нет Нет
Однократно программируемая память eFuse 1 кб 0. 003 кб Нет
Энергонезависимая память Flash 4 Мб 32 кб 4 Мб
Энергонезависимая память EEPROM Вместо неё используется энергонезависимая память 4 Мб 1 кб Нет
Дополнительный сопроцессор Есть, ULP (ultra low power coprocessor) Нет Нет
Беспроводной интерфейс Wi-Fi Есть, 802. 11 b/g/n Нет Есть, 802.11 b/g/n
Максимальная скорость передачи данных 150 Мбит/с Нет 72.2 Мбит/с
Рабочий диапазон частот Wi-Fi 2.4 … 2.5 ГГц Нет 2.4 … 2.5 ГГц
Беспроводной интерфейс Bluetooth Есть, v4.2 BR/EDR и BLE Нет Нет
Максимальная скорость передачи данных 4 Мбит/с Нет Нет
Поддержка аудио кодеков Есть, CVSD, SBC Нет Нет
Встроенный датчик температуры Есть Есть Есть
Встроенный датчик Холла Есть Нет Нет
Количество выведенных портов ввода/вывода 14 + 4 с АЦП + 2 только АЦП 14 + 6 с АЦП 11
Аналого-цифровой преобразователь Есть, SAR Есть, SAR Есть, SAR
Разрядность АЦП 12 бит 10 бит 10 бит
Количество выведенных входов АЦП 6 6 1
Цифро-аналоговый преобразователь Есть Нет Нет
Разрядность ЦАП 8 бит Нет Нет
Количество выведенных выходов ЦАП 2 Нет Нет
Интерфейс UART Есть, 3 шт. (на плате обозначено 2, могут использоваться любые порты) Есть, 1 шт. Есть, 2 шт.
Интерфейс I2C Есть, 2 шт. (на плате обозначен 1, могут использоваться любые порты) Есть, 1 шт. Есть, 2 шт. (доступен только один)
Интерфейс SPI Есть, 4 шт. (на плате обозначен 1, могут использоваться любые порты) Есть, 1 шт. Есть, программный, могут использоваться любые порты
Интерфейс I2S Есть, 2 шт. (на плате не обозначены, могут использоваться любые порты) Нет Есть, 1 шт.
ШИМ контроллер Есть (могут использоваться любые порты) Есть, 6 портов Есть, 4 порта
Возможность подключения карты памяти Нет, только внешним адаптером Есть, MicroSD, 4-битный режим, до 32 ГБ Нет, только внешним адаптером Нет, только внешним адаптером
Инфракрасный приемник сигналов Нет Есть, 38 кГц Нет Нет
Питание от USB Есть, 5 В Есть, 5 В Есть, 5 В
Тип разъема USB Type B Type B Micro USB
Питание от внешнего источника Есть, 8 … 30 В Есть, 6 … 20 В Есть, 9 … 24 В
Возможность включить/выключить питание Нет Есть, с помощью кнопки можно включить/выключить внешний источник питания 8 … 30 В, на питание от USB не влияет Нет Нет
Максимальный потребляемый ток от USB 1 А Нет данных Нет данных
Максимальный ток нагрузки преобразователя напряжения 5 В при питании от внешнего источника 5 А 1 А Нет данных
Максимальный ток нагрузки преобразователя напряжения 3. 3 В 1 А 0.15 А 0.5 А
Защита от неправильной полярности при питании от внешнего источника Есть Есть Есть
Защита от короткого замыкания Есть Есть, но не работает Нет данных
Диапазон рабочих температур -40 … +85 ºC Нет данных Нет данных
Размеры платы контроллера 68. 6 x 53.3 x 15.8 мм 68.6 x 53.3 мм 68.6 x 53.4 мм
Диаметр крепежных отверстий 3.2 мм 3.2 мм 3.2 мм

Входное сопротивление аналоговых выводов Arduino Uno?

Здесь есть несколько факторов.

Во-первых, входное сопротивление АЦП. ATmega328P использует АЦП с последовательным приближением . Таким образом, вход в основном является входом для компаратора, поэтому АЦП имеет очень высокое входное сопротивление.

АЦПимеетвходнойимпеданс100МОм(тоестьМегаом).
Темнеменее,этокажетсямненесколькоподозрительным.Учитываятотфакт,чтоутечкааналоговоговходанеуказана,япредполагаю,чтоэтоэлектрическиехарактеристикипростоАЦП,анеАЦПвместесовсейструктуройвыводовввода-вывода. Ябыпредположил,чтолинииввода-выводаАЦП,которыеиспользуютсясовместносцифровымвводом-выводом,имеютгораздобольшийтокутечки(1мкАиздокументов),чемлинииввода-вывода,которыеявляютсятолькоаналоговыми(50нА,приусловии,чтокомпараторSARподобенаналоговомукомпараторутопологияввода).

Однакоздесьестьещеодносоображение,котороеявляетсяпричинойтого,чтоAtmelуказывает<Импедансисточника10кОм:
Входнаяемкость

По сути, входные соединения с АЦП внутри микросхемы после мультиплексора имеют некоторую емкость. Если вы посмотрите на эквивалентную схему для входа АЦП ATmega:

Вы можете увидеть, как выглядит вход.

Проблема с высоким сопротивлением источника возникает, когда вы переключаете входной мультиплексор с одного контакта на другой. Если у вас есть два входа, один на 0,5 В и один на 4,5 В, когда вы переключаетесь с одного на другой, вход должен заряжать (или разряжать) этот конденсатор 14 пФ. Р>

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

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

    

analogRead () — Ссылка на Arduino

Описание

Считывает значение с указанного аналогового вывода. Платы Arduino содержат многоканальный 10-битный аналого-цифровой преобразователь. Это означает, что он будет отображать входные напряжения между 0 и рабочим напряжением (5 В или 3,3 В) в целочисленные значения от 0 до 1023. На Arduino UNO, например, это дает разрешение между показаниями: 5 вольт / 1024 единиц или , 0,0049 В (4,9 мВ) на единицу. В таблице ниже указаны используемые контакты, рабочее напряжение и максимальное разрешение для некоторых плат Arduino.

На платах на базе ATmega (UNO, Nano, Mini, Mega) для чтения аналогового входа требуется около 100 микросекунд (0,0001 с), поэтому максимальная скорость чтения составляет около 10 000 раз в секунду.

Доска Рабочее напряжение Используемые штифты Максимальное разрешение

Uno

5 Вольт

A0 — A5

10 бит

Мини, Нано

5 Вольт

A0 — A7

10 бит

Mega, Mega2560, MegaADK

5 Вольт

A0 — A14

10 бит

Микро

5 Вольт

A0 — A11 *

10 бит

Леонардо

5 Вольт

A0 — A11 *

10 бит

Ноль

3. 3 Вольта

A0 — A5

12 бит **

Срок погашения

3,3 В

A0 — A11

12 бит **

Платы семейства MKR

3,3 В

A0 — A6

12 бит **

* A0 — A5 обозначены на плате, A6 — A11 доступны соответственно на контактах 4, 6, 8, 9, 10 и 12
** Разрешение по умолчанию analogRead () для этих плат составляет 10 бит, для совместимость.Вам нужно использовать analogReadResolution (), чтобы изменить его на 12 бит.

Синтаксис

Параметры

pin : имя вывода аналогового входа для чтения (от A0 до A5 на большинстве плат, от A0 до A6 на платах MKR, от A0 до A7 на Mini и Nano, от A0 до A15 на Mega).

Возвращает

Аналоговое показание на выводе. Хотя это ограничено разрешением аналого-цифрового преобразователя (0-1023 для 10 бит или 0-4095 для 12 бит). Тип данных: int .

ADC — 4-канальный аналого-цифровой преобразователь — Arduino-совместимые экраны

Новая версия v1.2
  • Разрешение 16 бит
  • Максимум 860 выборок в секунду
  • До 4 входов на модуль
  • До 4 модулей одновременно — всего 16 входов
  • Внутренний усилитель для сигналов малой амплитуды
  • RC фильтр на все каналы
  • Аналоговые входы с защитой от случайных подключений до ± 24 В

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

ADC Nanoshield имеет следующие особенности:

  • Заводская конфигурация для считывания напряжения от 0 В до 5 В.
  • Каждый из 4 входов можно легко преобразовать для считывания напряжения от 0 В до 10 В.
  • Один из входов (A0) может быть преобразован для считывания напряжений от 0 В до 24 В.
  • Возможность прямого измерения напряжения питания (VIN или VCC).

Проверьте раздел «Доступные конфигурации» для получения дополнительных сведений о сценариях использования.

! Подключение аналоговых входов

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

Абсолютные измерения (односторонние)

Для измерения абсолютного напряжения необходимо подключить измеряемый сигнал к контакту GND и к одному из 4 входов модуля через клеммную колодку с винтовыми зажимами. Входы называются A0, A1, A2 и A3 и имеют диапазон измерения от 0 В до 5 В. При таком подключении измерение имеет разрешение 15 бит.

На рисунке ниже показано подключение четырех датчиков с абсолютным измерением:

Подключение четырех датчиков в несимметричном режиме

Измерения в дифференциальном режиме

В дифференциальном режиме можно считывать каналы относительно друг друга, вместо того, чтобы использовать их относительно GND.Например, если два измеряемых канала имеют одинаковое напряжение, тогда результат измерения будет равен нулю. Этот режим полезен для считывания показаний датчиков, которые работают, например, с мостом Уитстона. Имейте в виду, что, несмотря на то, что измерение не выполняется напрямую относительно GND, допустимый диапазон напряжения в каждом канале по-прежнему составляет от 0 В до 5 В относительно GND. При таком подключении можно использовать все 16-битное разрешение.

На рисунке ниже показан пример двух датчиков, считываемых в дифференциальном режиме:

Подключение двух датчиков чтения в дифференциальном режиме

! Подключение к Arduino через базовую плату Uno

Самый простой способ использовать ADC Nanoshield вместе с Arduino — использовать Base Board Uno или Base Board L Uno. Вам просто нужно соединить платы вместе (проводка не требуется!), А затем загрузить наш пример кода, чтобы проверить работу системы. См. Раздел с образцом кода внизу страницы для получения дополнительной информации. Этот вариант сборки можно использовать с Arduino UNO, Mega R3, Duemilanove и другими совместимыми платами. На рисунке ниже показано, как выглядит установка.

Подключение к Arduino с помощью базовой платы Uno (щелкните изображение, чтобы увеличить)

! Подключение к базе Boarduino

Также можно подключить ADC Nanoshield напрямую к нашей Arduino-совместимой плате Base Boarduino.Подключение выполняется так же, как и с базовой платой, как показано ниже. Вам просто нужно собрать платы, а затем загрузить наш образец кода, чтобы проверить работу системы. См. Раздел с образцом кода внизу страницы для получения дополнительной информации.

Подключение к базе Boarduino (щелкните изображение, чтобы увеличить)

! Прямое подключение к Arduino

Также можно использовать модуль с прямой сборкой, используя макетную плату и перемычки для подключения к Arduino или другой подобной плате микроконтроллера. Используйте следующие схемы для подключения ADC Nanoshield к Arduino UNO или Arduino Mega.

Прямое подключение к Arduino UNO (щелкните изображение, чтобы увеличить)

Прямое подключение к Arduino MEGA (щелкните изображение, чтобы увеличить)

! Использование нескольких модулей одновременно

ADC Nanoshield связывается с микроконтроллером через коммуникационную шину I2C. Одним из преимуществ шины I2C является возможность одновременного использования нескольких модулей всего с 2 выводами микроконтроллера: один для синхронизации (SCL) и один для данных (SDA).

Каждому модулю, подключенному к шине I2C, нужен уникальный адрес. ADC Nanoshield имеет 4 варианта адресов, которые выбираются с помощью перемычек в верхней части платы. Таким образом, можно использовать до 4 модулей одновременно с 16 независимыми каналами, используя только 2 контакта микроконтроллера. На рисунке ниже показано, где расположены перемычки выбора адреса.

Перемычки для выбора адреса I2C

Адрес модуля на шине I2C имеет 5 фиксированных битов (10010) и два других настраиваемых бита. Используя перемычки, можно индивидуально выбрать эти последние два бита для каждого модуля. Возможные варианты: 00, 01, 10 и 11. Чтобы сделать выбор, просто закройте перемычку, соответствующую желаемому адресу, оставив остальные открытыми (заводская установка по умолчанию 00). Таким образом, полный адрес модуля может быть 1001000 (по умолчанию), 1001001, 1001010 или 1001011.

На рисунке ниже показана установка с 4 модулями, используемыми одновременно. В этом примере мы используем [Base Board UNO] [nanoshield: base-board-uno] вместе с Arduino Mega.

Использование нескольких модулей одновременно (щелкните изображение для увеличения)

! Доступные конфигурации

Датчики считывания с выходом от 0 до 10 В

Каждый из 4 входов на ADC Nanoshield может быть легко сконфигурирован для считывания напряжений от 0 до 10 В. Это делается с помощью схемы делителя напряжения, которая поставляется на заводе и активируется только путем замыкания паяльной перемычки на плате. Каждый из входов имеет свою собственную схему делителя напряжения и поэтому может быть настроен независимо.

Для этого используются четыре паяных перемычки: JP0, JP1, JP2 и JP3. Они соответствуют входам A0, A1, A2 и A3 соответственно. В закрытом состоянии каждая перемычка включает делитель напряжения для данного входа, устанавливая диапазон считывания 0-10 В. В таблице ниже показаны режимы использования (подробнее см. Схемы модуля внизу страницы):

Джемпер Открыть Закрыто
JP0 A0: от 0 до 5 В A0: от 0 до 10 В
JP1 A1: от 0 до 5 В A1: от 0 до 10 В
JP2 A2: от 0 до 5 В A2: от 0 до 10 В
JP3 A3: от 0 до 5 В A3: от 0 до 10 В

Выберите диапазон измерения 0-5 В или 0-10 В

Схема делителя напряжения делит входное напряжение на 2. 5. Таким образом, напряжение 10 В становится 4 В. Чтобы максимально расширить диапазон измерения, используйте усиление 1 на внутреннем усилителе (что соответствует полному диапазону 4,096 В). Дополнительную информацию см. В разделе «Внутренний усилитель».

На рисунке ниже показано типичное подключение датчика 0–10 В к ADC Nanoshield.

Подключение датчика 0-10 В к АЦП Nanoshield

Измерение напряжений до 24 В с входом A0

Вход A0 отличается от других тем, что может считывать напряжение до 24 В.Это осуществляется второй схемой делителя напряжения, которая уже поставляется на заводе и может быть активирована путем замыкания паяльной перемычки на плате. Перемычка, которая включает эту функцию, — JP0A (см. Рисунок ниже).

Джемпер Открыть Закрыто
JP0A A0: от 0 до 5 В A0: от 0 до 24 В

Перемычка для разрешения считывания до 24 В на входе A0

Схема делителя напряжения делит напряжение на 5. 84 и, таким образом, 24 В преобразуются в 4,1 В. Чтобы максимально расширить диапазон измерения, используйте усиление 1 на внутреннем усилителе (что соответствует полному диапазону 4,096 В). Дополнительную информацию см. В разделе «Внутренний усилитель».

Измерение напряжения питания с помощью A0

Также возможно напрямую измерить напряжение питания на Arduino через вход A0. Эта функция активируется через припаянную перемычку SUP_MSR, расположенную в нижней части платы (см. Рисунок ниже).Вы можете напрямую измерить напряжение от источника питания, обозначенного как VIN на Arduino, или напряжение, обозначенное как 5V на Arduino, которое обеспечивается портом USB в случае отсутствия внешнего источника питания.

Измерение напряжения питания с входом A0

Используйте перемычку SUP_MSR вместе с J0 или JP0, чтобы максимизировать диапазон измерения. Например, если напряжение внешнего источника питания составляет около 9 В, вы можете использовать SUP_MSR, чтобы выбрать напряжение VIN и замкнуть перемычку J0. Таким образом, напряжение полной шкалы становится 10 В, и можно с хорошей точностью измерять напряжение внешнего источника питания. Если напряжение внешнего источника питания составляет около 12 В, вы можете использовать SUP_MSR для выбора напряжения VIN и замкнуть перемычку JP0, получив полный диапазон измерения 24 В.

Работа при 3,3 В

ADC Nanoshield также может быть настроен для работы от источника питания 3,3 В. Эта конфигурация полезна, когда модуль используется с другими платами, которые работают с 3.3V, такие как Arduino Zero, Arduino DUE и другие.

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

Конфигурация блока питания для АЦП Nanoshield

Это изменение необходимо только в том случае, если модуль используется вместе с базовой платой или базовой платой L. Если вы используете модуль, подключенный с помощью перемычек, просто подключите вывод VCC модуля напрямую к источнику напряжения питания 3. 3В.

Если модуль питается от 3,3 В, максимально допустимый диапазон считывания составляет от 0 В до 3,3 В. Опции измерения для сигналов от 0 В до 10 В и от 0 до 24 В не могут использоваться с источником питания 3,3 В.

! Дополнительные ресурсы

Внутренний усилитель

Микросхема оснащена внутренним усилителем с регулируемым усилением, который можно использовать для увеличения разрешения, когда входной сигнал имеет низкую амплитуду. Коэффициент усиления усилителя может быть установлен на 2/3, 1, 2, 4, 8 или 16. В таблице ниже показано, какое напряжение полной шкалы для каждого коэффициента усиления усилителя (напряжение полной шкалы — это более высокое значение напряжения, которое можно прочитать).

Прирост Напряжение полной шкалы (В)
2/3 6,144¹
1 4,096
2 2,048
4 1. 024
8 0,512
16 0,256

Напряжение полной шкалы для каждой настройки усиления внутреннего усилителя

¹Для усиления 2/3, хотя напряжение полной шкалы равно 6.144 В, максимальный диапазон считывания составляет от 0 В до 5 В.

Входное напряжение может быть выше полной шкалы без повреждения модуля. Например, даже при использовании коэффициента усиления 16, для которого напряжение полной шкалы составляет 0,256 В, максимальное напряжение, поддерживаемое аналоговыми входами, по-прежнему составляет ± 24 В.

Внутренний компаратор

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

Сигнал предупреждения отправляется через вывод 3 на Arduino (на ADC Nanoshield этот вывод называется «эль»). По умолчанию эта функция отключена. Для его активации необходимо замкнуть паяльную перемычку вызова ALERT, расположенную на верхней стороне платы.

Блок-схема

ADC Nanoshield взаимодействует с процессором через шину I2C, которая использует только 2 контакта.На блок-схеме ниже показано, как работает модуль.

Блок-схема нанощита АЦП

Каждый вход ADC Nanoshield оснащен RC-фильтром нижних частот с:

  • Сглаживание и ослабление шума на аналоговых входах
  • Защита аналоговых входов от случайных подключений до ± 24 В
  • Конфигурируемая схема, позволяющая считывать показания датчиков от 0 В до 5 В или от 0 до 10 В, среди других приложений

Фильтр имеет частоту среза приблизительно 480 Гц.

Электрические характеристики

  • Электропитание: обеспечивается через вывод VCC в диапазоне от 4,5 до 5,5 В (обычно 5 В). При желании на плату можно подавать питание через вывод 3V3 в диапазоне от 3 до 3,6 В. Для этого необходимо поменять перемычку POWER (см. Инструкции на схемах).

  • Потребление тока: максимальное потребление тока 300uA.

  • Логические уровни: связь I2C и выходной сигнал ALERT (опция) настроены на заводе для работы с напряжением 5 В.Аналоговые входы работают с напряжением до 5 В и защищены от случайных подключений до ± 24 В.

Распиновка

В таблице ниже описаны функции каждого из используемых сигналов и соответствие выводам на Arduino UNO и Arduino MEGA.

Сигнал Ардуино UNO Ардуино МЕГА Функция
эль 3 3 Сигнальный контакт: выход компаратора или конец преобразования (опционально)
SDA A4 20 Данные I2C
SCL A5 21 Часы I2C
VCC VCC VCC Вход источника питания 5 В
ЗЕМЛЯ ЗЕМЛЯ ЗЕМЛЯ Опорное напряжение (земля)

Описание контактов

! Пример кода

Быстрее аналог Читать

аналогReadFast ()

Эта быстрая библиотека АЦП построена как часть базовой библиотеки осциллографа для Arduino. Стандартная функция analogRead () занимает около 112 мкс для AVR и 425 мкс для SAMD21, это очень медленно. Новая функция analogReadFast () занимает всего 21us . Разрешение существенно не уменьшится.
Вот синусоида 2 кГц, измеренная с помощью analogReadFast, показанная в Excel:

Быстрый 10-битный АЦП для Arduino

аналог, читать быстро на AVR

Библиотека совместима с платами Arduino, в которых используются микросхемы AVR: Arduino Uno, Nano, Mega, Leonardo и др.
Функция analogReadFast работает намного быстрее, чем исходный аналогRead: 20us вместо 112us .

аналог ЧитаетFast на SAMD21

Библиотека совместима с платами Arduino, которые используют SAMD21: Arduino Zero, SAM 15×15 и т. Д.
Функция analogReadFast намного быстрее, чем исходная функция analogRead: 21us вместо 435us .
Разрешение для analogReadFast должно быть установлено с помощью analogReadResolution (10) или analogReadResolution (12) , как и для analogRead.

Библиотека скачать

Загрузите библиотеку с GitHub.

Требуется входной буфер

Аналоговые входы SAMD21 требуют буферных операционных усилителей, иначе значения АЦП очень зашумлены. Это связано с тем, что АЦП последовательного приближения переключают емкости на входе во время преобразования. Чтобы обеспечить стабильное преобразование, обязательно использовать схему с низким импедансом для управления их входом.
Необходимость в буферном операционном усилителе зависит от требуемой точности.Для микросхем Arduino с 10-битными АЦП входной буфер не всегда необходим.
Обратите внимание, что существуют также АЦП со встроенным буфером.

Входной буфер последовательного приближения Arduino ADC

Простой RC-фильтр на входе 10-битного АЦП иногда отлично работает без дополнительного буфера. Но для 12-битного АЦП (SAMD21) это может быть проблематично.
RX / CX предназначен для предотвращения нестабильности операционного усилителя, это не всегда необходимо.

Программа испытаний

Тестовую программу можно скачать на GitHub.

  • AnalogRead протестирован с 6 вариантами: медленный / быстрый, 10/12 бит, с фильтром ravg и без него.
  • Для каждого теста 100 значений теста сохраняются в собственном буфере.
  • Для этих буферов используется библиотека RunningAverage, поскольку в ней есть удобная функция standardDeviation.
  • AnalogReadFast довольно шумный, поэтому нам нужна фильтрация. В тестовой программе мы создаем фильтр с библиотекой RunningAverage.
  • Для выполнения измерений АЦП на полной скорости в конце выполняется печать на последовательный монитор.
  • Значения можно скопировать прямо в Excel. Это упрощает выполнение тестов на точность и уровень шума.
  • Шум тестируется на плате SAM15x15 с дополнительными конденсаторами на источниках питания: 10 мкФ при 3,3 ВА и 47 мкФ при 3,3 В постоянного тока.
  • Входное напряжение АЦП составляет 0,1 В, создаваемое резистивным делителем на 10 Ом и 330 Ом на 3,3 В.

Arduino для измерения шума, аналоговое чтение и аналоговое чтение, быстрое 10/12 бит с фильтром или без него

На этом рисунке мы видим, что размер скользящего среднего n = 16 уменьшает стандартное отклонение от 1.От 3 до 0,25 для аналога ReadFast 12bit:

Arduino аналог — чтение — быстрое стандартное отклонение по сравнению с размером n

Стандартное отклонение / шум с 10/12 битами analogRead () и analogReadFast ()

analogRead 10 бит SD = 0,5
analogReadFast 10bit SD = 0,5
analogRead 12bit SD = 1,5
analogReadFast 12bit SD = 1,3
analogReadFast 12bit с ravg (16) SD = 0,25

Примечание. Примечательно, что шум с analogReadFast меньше, чем с медленным analogRead.

Вот что ATMEL говорит об АЦП: Для оптимальной производительности тактовая частота АЦП не должна превышать 200 кГц.Однако частоты до 1 МГц существенно не снижают разрешающую способность АЦП .

Может библиотеку можно улучшить, у кого есть время в этом разбираться?

Регистр АЦП Описание: Arduino / ATmega328p

Примечание

Эта статья является частью Руководства по программированию встроенного микропрограммного обеспечения C для Arduino / ATmega328p . Попробуйте изучить домашнюю страницу курса, чтобы найти статьи на похожие темы.

Учебное пособие по Arduino Уровень встроенного регистра C Мастер-класс Arduino

Также посетите страницу выпуска , страницу для встроенной библиотеки аппаратных абстракций C уровня регистров и код для AVR .

Введение

ATmega48A / PA / 88A / PA / 168A / PA / 328 / P имеет 10-разрядный АЦП последовательного приближения. АЦП подключен к 8-канальному аналоговому мультиплексору, который позволяет использовать восемь несимметричных входов напряжения, построенных на выводах порта A. Несимметричные входы напряжения относятся к 0 В (GND).

Блок-схема АЦП ATmega328P

АЦП использует регистры ADMUX, ADCSRA, ADCL, ADCH, ADCSRB и DIDR0 для настройки оборудования и выполнения аналого-цифрового преобразования.Наряду с конфигурацией регистров аппаратному обеспечению АЦП также необходим отдельный вывод напряжения аналогового источника питания, AVCC. AVCC не должен отличаться от VCC более чем на ± 0,3 В. Внутреннее опорное напряжение может быть установлено на 1,1 В или AVCC. Когда источник опорного напряжения выбирается извне, вывод AREF соединен с конденсатором для улучшения шумовых характеристик.

Что вы узнаете

  • Что такое регистры АЦП в Arduino?
  • Что такое регистры АЦП в AVR ATmega328p?
  • Какие регистры AVR управляют и настраивают аналого-цифровой преобразователь?
  • Каковы функции регистров АЦП?

ADMUX — Регистр выбора мультиплексора АЦП

Бит 7 6 5 4 3 2 1 0
0x7C REFS1 REFS0 900 — ADLAR MUX2 MUX1 MUX0
Чтение / запись R / W R / W R / W R R / W R / W R / W R / W
Начальное значение 0 0 0 0 0 0 0 0

• Бит 7: 6 — REFS [1: 0]: Биты выбора опорного напряжения
Эти биты выбирают опорное напряжение для АЦП. Опции внутреннего опорного напряжения нельзя использовать, если на вывод AREF подается внешнее опорное напряжение.

REFS1 REFS0 Выбор опорного напряжения
0 0 AREF, внутренний VREF отключен
0 1 конденсатор на выводе AREF
1 0 Зарезервировано
1 1 Внутренний 1.Опорное напряжение 1 В с внешним конденсатором на выводе AREF

• Бит 5 — ADLAR: Результат регулировки АЦП влево
Бит ADLAR влияет на представление результата преобразования АЦП в регистре данных АЦП. Напишите один в ADLAR, чтобы слева отрегулировать результат. В противном случае результат будет скорректирован правильно.

• Биты 3: 0 — MUX [3: 0]: Биты выбора аналогового канала
Значение этих битов определяет, какие аналоговые входы подключены к АЦП.

MUX [3: 0 ] Односторонний вход
0000 ADC0
0001 ADC1
0010 ADC2
АЦП3
0100 АЦП4
0101 АЦП5
0110 АЦП6
0111 ADC7
1000 ADC8 (1) 1001 (зарезервировано)
1010 (зарезервировано)
1011 (зарезервировано)
1100 (зарезервировано)
1101 (зарезервировано)
1110 1.1 В (VBG)
1111 0 В (GND)

ADCSRA — Регистр управления и состояния АЦП A

Бит 7 6 5 4 3 2 1 0
0x7A ADEN ADSC ADATE ADIF ADIF ADIF ADPS2 ADPS1 ADPS0
Чтение / запись R / W R / W R / W R / W R / W R / W R / W R / W
Начальное значение 0 0 0 0 0 0 0 0

• Бит 7 — ADEN: ADC Enable
Запись этого бита в единицу включает АЦП. Записав его в ноль, АЦП отключается. Выключение АЦП во время преобразования завершит это преобразование.

• Бит 6 — ADSC: начало преобразования АЦП
В режиме одиночного преобразования запишите этот бит в единицу для запуска каждого преобразования. В режиме автономной работы запишите этот бит в тот, который займет 25 тактов АЦП вместо обычных 13. Это первое преобразование выполняет инициализацию АЦП. ADSC будет считывать единицу, пока выполняется преобразование.Когда преобразование завершено, оно возвращается к нулю.

• Бит 5 — ADATE: включение автоматического запуска АЦП
Когда этот бит записан в единицу, включается автоматический запуск АЦП. АЦП начнет преобразование при положительном фронте выбранного триггерного сигнала. Источник запуска выбирается установкой битов выбора запуска АЦП, ADTS в
ADCSRB.

• Бит 4 — ADIF: Флаг прерывания АЦП
Этот бит устанавливается, когда преобразование АЦП завершается и регистры данных обновляются. Прерывание завершения преобразования АЦП выполняется, если установлены бит ADIE и бит I в SREG. ADIF очищается аппаратно при выполнении соответствующего вектора обработки прерывания.

• Бит 3 — ADIE: Разрешение прерывания АЦП
Когда этот бит записан в единицу и установлен бит I в SREG, активируется прерывание завершения преобразования АЦП.

• Биты 2: 0 — ADPS [2: 0]: Биты выбора предделителя АЦП
Эти биты определяют коэффициент деления между системной тактовой частотой и входной тактовой частотой АЦП.

ADPS2 ADPS1 ADPS0 Коэффициент деления
0 0 0 2
032 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

ADCL и ADCH — данные АЦП Зарегистрировать

ADLAR = 0
Бит 15 14 13 12 11 10 9 8
0x79 ADC9 ADC8
Чтение / запись R R R R R R R R
Бит 6 5 4 3 2 1 0
0x78 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC2 ADC2

7 ADC2

ADC2

7 ADC2

7 ADC2

ADC2 Чтение / запись R R R R R R R R

A DLAR = 1

Бит 15 14 13 12 11 10 9 8
0x79 ADC9 ADC38 ADC7 ADC38 ADC7 ADC38 ADC7 ADC38 ADC7 ADC4 ADC3 ADC2
Чтение / запись R R R R R R R R
Бит 7 5 4 3 2 1 0
0x78 ADC1 ADC0
Чтение / запись R R R R R R R R

W Когда преобразование АЦП завершено, результат находится в этих двух регистрах. В этих двух регистрах хранится всего 10 бит результата преобразования.

ADCSRB — Регистр управления и состояния АЦП B

Бит 7 6 5 4 3 2 1 0
ACME ADTS2 ADTS1 ADTS0
Чтение / запись R R / W R R R R / W R / W R / W
Начальный Значение 0 0 0 0 0 0 0 0

• Бит 2: 0 — ADTS [2: 0]: Источник автоматического запуска ADC
Если ADATE в ADCSRA записано в единицу, значение этих битов определяет, какой источник будет запускать преобразование АЦП.

0
ADTS2 ADTS1 ADTS0 Источник триггера
0 0 0 Режим автономной работы
1 Аналоговый компаратор
0 1 0 Запрос внешнего прерывания 0
0 1 1 Таймер / Счетчик 0 Сравнить Соответствие A
1 0 0 Таймер / Счетчик0 Переполнение
1 0 1 Таймер / Счетчик1 Сравнить Соответствие B
1 1 0 Таймер / Счетчик1 Переполнение
1 1 1 Timer / Counter1 Capture Event

DIDR0 — Di gital Регистр блокировки входа 0

Бит 7 6 5 4 3 2 1 0
0x7E ADC5D

2D
ADC

2
ADC

2
ADC ADC2D ADC1D ADC0D
Чтение / запись R R R / W R / W R / W R / W R / W R / W
Начальное значение 0 0 0 0 0 0 0 0

• Бит 5: 0 — ADC5D… ADC0D: ADC 0 Отключение цифрового входа
Когда в этот бит записывается логическая единица, буфер цифрового входа на соответствующем выводе АЦП отключается. Соответствующий бит регистра ПИН-кода всегда читается как ноль, когда этот бит установлен. Когда аналоговый сигнал подается на вывод ADC5… 0 и цифровой ввод с этого вывода не требуется, в этот бит следует записать логическую единицу, чтобы снизить энергопотребление в буфере цифрового ввода.

АЦП Arduino и как он измеряет входное напряжение

Как АЦП Arduino измеряет входное напряжение
ПРИМЕЧАНИЕ. Информация на этой странице относится к АЦП, встроенному в модули на базе ATMEGA 168, 328 и 32U4, а также Espressif ESP8266.Платы «Arduino», использующие другие устройства, в частности Espressif ESP32, будут иметь другие спецификации и характеристики.

Система на микросхеме Arduino, которая измеряет входное напряжение, представляет собой «аналого-цифровой преобразователь последовательного приближения».

Вот блок-схема, показывающая важные части:

Как это работает

Первым шагом является то, что приложенное напряжение Vin «фиксируется» схемой выборки и хранения. (Поскольку собственно процесс преобразования еще не начался, я назвал этот тактовый цикл нулевым.)

После этого логика регистра и управления последовательного приближения (SAR) применяет к ЦАП серию из десяти чисел «тестового значения».

Соответствующее напряжение Vt сравнивается компаратором с «заблокированным» сигналом Vi. Это возвращает логический сигнал K в SAR следующим образом: Если Vt> Vi, k = 1; иначе k = 0.

Если напряжение Vt, генерируемое ЦАП, больше, чем Vi, тестовое значение удаляется и пробуется меньшее значение. В противном случае остается тестовое значение и добавляется еще одно тестовое значение.Этот процесс можно увидеть на диаграмме ниже.

Когда было применено последнее тестовое значение, выход компаратора используется для окончательной коррекции значения данных. Затем на последнем такте (теперь всего 13) результат записывается и преобразование завершается.

Фактически мы разделили диапазон входного напряжения на серию шагов. Наименьшее изменение, которое мы можем измерить, — это переход от одного шага к другому. Всего имеется 1024 шага, соответствующих значениям N от 0 до 1023, поэтому высота q каждого шага равна q = Vref / 1024.

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

Преобразование измерения из числа в напряжение

Результат нашего измерения выше показывает значение 736 или 0B10 1110 0000 для входа 3,597 В.
Чтобы преобразовать это в показание напряжения, нам нужно умножить показание на размер шага (q).

Таким образом, Vmeasured = N * Vref / 1024

и для нашего чтения 736 Vmeasured = 736 * 5.000/1024 = 3,5938 Вольт

ИСПРАВЛЕНИЕ

Чтобы быть точными, наши показания лежат в диапазоне от 736 * 5.000 / 1024 до 737 * 5.000 / 1024 вольт, поэтому мы можем добавить очень маленький поправочный коэффициент, например,

Vmeasured = (N + 0,5) * Vref / 1024

, поэтому наше значение 736 дает Vmeasured = 736,5 * 5. 000 / 1024 = 3,5962 Вольт

ВНИМАНИЕ

Мы можем быть уверены только в измерениях, которые не выходят за пределы диапазона АЦП. Если мы подадим на АЦП напряжение чуть больше 5В, это не повредит, но результат будет некорректным.Таким образом, мы не можем законно преобразовать показание 1023 в напряжение.

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

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

1023 или 1024?

Было МНОГО споров о том, является ли правильное преобразование для 10-битного АЦП

.

Vmeasured = N * Vref / 1024 — или — Vmeasured = N * Vref / 1023

Давайте посмотрим на 2-битный АЦП с Vref 5 В и диапазоном от 0 до + 5 В; диапазон разделен на 2 ^ 2 = четыре равных «домена» или «бункеров». n , откуда Vmeasured = (3 + 0.5) * 5.0 / 4 = 4.375V

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

Предварительный делитель частоты

Это возможно, если выбрать другой предварительный делитель тактовой частоты для более быстрого преобразования; однако из-за того, что схеме — особенно компаратору — требуется время, чтобы установить, БЫСТРЫЕ ЧТЕНИЯ БУДУТ МЕНЬШЕ ТОЧНЫМИ.

Внешние аналого-цифровые преобразователи

Модуль ADS1115 предлагает 4 16-битных аналоговых входа и подключается к Arduino через I2C. Однако АЦП — это не тип последовательного приближения, а преобразователь сигма-дельта.

Это обеспечивает высокое разрешение (много битов) — но часто за счет гораздо более низкой скорости преобразования.

Дополнительная литература

На странице Ника Гаммона есть еще много очень полезной информации.

Измерение биполярного сигнала с помощью платы Arduino — Освоение дизайна электроники

Arduino — популярное семейство плат микроконтроллеров с открытым исходным кодом.Любители, студенты и инженеры во всем мире используют эту платформу для быстрого проектирования и создания прототипа схемы, управляемой микроконтроллером. Одним из его интерфейсов с аналоговым миром является АЦП. Поскольку эти платы в основном разработаны на базе микроконтроллеров ATMEL ATmega32 или ATmega168, АЦП имеет 8 входов и 10-битное разрешение, что делает его пригодным для многих приложений.

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

В одном из этих сообщений читатель спросил меня, как построить интерфейс между платой с выходным напряжением от -2,5 В до + 2,5 В и АЦП Arduino. Он сказал мне, что опорное напряжение Arduino составляет AVCC = 5 В. Он хотел бы измерить сигнал +/- 2,5 В с помощью платы Arduino и указать микроконтроллеру, чтобы он предпринял какие-то действия в зависимости от результата.


Решением является преобразователь из биполярного в униполярный, как описано в этой статье: MasteringElectronicsDesign.com: разработка преобразователя из биполярного в униполярный для управления АЦП. Суммирующий усилитель представляет собой универсальную схему и достаточно простую, чтобы ее можно было построить в кратчайшие сроки. Все, что нам нужно сделать, это рассчитать резисторы. Вот схема суммирующего усилителя, который будет выполнять это преобразование.

Рисунок 1

Как я рассчитал резисторы? Для этой схемы можно использовать метод смещения и усиления, который я описал в MasteringElectronicsDesign.com: Разработайте биполярный преобразователь в униполярный для управления АЦП, или метод, описанный в MasteringElectronicsDesign.com: Решение суммирующего усилителя.

Любую передаточную функцию линейной цепи можно записать следующим образом:

(1)

где Vout — выходное напряжение, а Vin — входное напряжение.

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

Если Vin = -2.5V, то Vout = 0V
Если Vin = + 2.5V, то Vout = 5V

Следовательно, коэффициент усиления равен Gain = 1, поскольку диапазон на входе (Vin) и выходе (Vout) составляет 5 В.

Смещение должно быть Voffset = + 2,5 В, потому что мы хотим сдвинуть сигнал вверх, чтобы 2,5 В на входе превратилось в 0 В на выходе преобразователя.

Мы можем переписать уравнение (1) с нашими значениями усиления и смещения:

(2)

Сравнение с передаточной функцией суммирующего усилителя

(3)

и учитывая V1 входной сигнал Vin, мы понимаем, что

(4)

Первое уравнение приводит к требованию, чтобы соотношения резисторов были одинаковыми.

(5)

Из второго уравнения, если мы выберем V2 = 2,5 В, равенство соотношений резисторов будет инвертировано:

(6)

Это возможно, только если все резисторы равны. Если мы выберем R1 = R2 = R3 = R4 = 10k, то получится схема, показанная на Рисунке 1.

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

(7)

где VADC — входное напряжение АЦП, а Vref — опорное напряжение Arduino.

Если вы хотите, чтобы ваша плата показывала фактическое напряжение Vin, программа должна будет записать количество отсчетов в переменную и вычислить Vin. Vin можно определить из уравнения (2), где Vout заменяется на VADC из уравнения (7). Поэтому программе Arduino придется использовать следующее уравнение для определения входного напряжения от внешней схемы.

(8)

Действительно, если АЦП измеряет 0 отсчетов, Vin составляет -2,5 В. Если он измеряет 1023 отсчета, выход составляет 2,495 В. Разница в 5 мВ происходит от уровня полной шкалы АЦП, который составляет Vref — 1LSB. Прочтите MasteringElectronicsDesign.com: наименьший значащий бит (LSB) АЦП и ЦАП, чтобы понять, почему.

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

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

АЦП (АЦП) Arduino Учебное пособие

Аналого-цифровое преобразование (АЦП) — очень полезная функция микроконтроллеров для сопряжения датчиков. Основная цель этой функции — интерфейс аналогового датчика с Arduino UNO или любым микроконтроллером.В природе существуют различные физические величины, такие как давление, температура, влажность, сила света и т. Д. Иногда мы разрабатываем систему, использующую эти свойства. Работая над этим свойством, мы сначала преобразуем его в цифровую форму, чтобы микроконтроллер мог понять. Для этого нам понадобится аналого-цифровое преобразование. Arduino UNO имеет 6 каналов АЦП от A0 до A5. Для включения этой функции АЦП мы используем функцию analogRead () .

Arduino UNO имеет 10-битный (2 10 ) АЦП.Независимо от того, какое аналоговое значение от 0 до 5 В он считывает, оно преобразуется в диапазоне от 0 до 1023 в цифровое. Основываясь на этом цифровом значении, мы создаем некоторый программный код и соответствующим образом контролируем устройства.

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

Требуемое оборудование

  • Arduino UNO
  • Предустановка
  • Макет

Аналого-цифровое преобразование Arduino

Здесь мы подключаем предустановку к аналоговому выводу A0 Arduino uno.Предустановка имеет три контакта: один подключен к Vcc, второй — к GND, а средний контакт — к аналоговому выводу A0.

Схема преобразования A в D Arduino с использованием предустановки

Код АЦП Arduino с использованием потенциометра

Мы используем функцию для analogRead (A0) , преобразующую любое аналоговое значение в цифровое. Вместо использования предустановки мы можем использовать здесь любой датчик. Если входное напряжение с датчика от 0 до 5 В, то после преобразования значение будет от 0 до 1023.

 / * В этой программе мы считываем аналоговое значение из
 аналоговый вывод A0 преобразует его и отправляет / распечатывает на последовательный монитор.
Связь:
Центральный вывод предустановки: аналоговый вывод Arduino A0>
Внешний контакт: Vcc / + 5 В>
Внешний контакт: GND
* /

  void   setup  () {
  int  ADCvalue = 0;
 // инициализируем последовательную связь со скоростью 9600 бод
 Serial.
	

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

Ваш адрес email не будет опубликован.