Работа mcp3421 ацп 18 бит с микроконтроллером atmega32

AVR Урок 22. Изучаем АЦП. часть 1

Урок 22

Изучаем АЦП

Сегодня мы начнем изучать очень интересную технологию, а для микроконтроллера – периферию – это аналго-цифровой преобразователь или как его называют АЦП. В английской аббревиатуре, гораздо чаще встречающейся в технической документации – ADC (Analog-to-Digital Converter). Это такая штука, которая преобразует величину электрического сигнала в цифровой код. Затем данный код мы уже используем для обработки или для отображения тем или иным образом данной электрической величины. Это очень распространённая периферия или технология. АЦП активно используется в звукозаписи, измерительной технике, видеозаписи и во многих других случаях. Поэтому нас обойти данную вещь стороной никак не получится, тем более АЦП поддерживается аппаратно в контроллерах AVR.

В контроллере Atmega8 АЦП имеет следующие характеристики

  • Разрешение 10 бит,
  • Время преобразования одного показания от 13 до 250 микросекунд в зависимости от битности измерения, а также от тактовой частоты генератора, тактирующего контроллер,
  • Поддержка запуска по прерываниям,

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

Как вообще работает цифровое преобразование?

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

Изобразим схематично процесс измерения

Отрезок – это диапазон измерений. Он находится между нулём и опорным напряжением. А стрелка – это измеряемое напряжение.

Данный отрезок делится пополам, и АЦП оценивает, в какой половине находится приложенное напряжение

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

Оценка идёт по тому же принципу – в какой стороне отрезок. В нашем случае будет 0. И этот ноль записывается в следующий более младший бит

Затем та четвертинка опять делится пополам и АЦП опять оценивает,где находится отрезок

И АЦП так и продолжает такой процесс до тех пор, пока не кончатся ячейки для битов. То есть если мы используем 10-битный режим, то. соответственно, и будет 10 подобных измерений и заполнятся 10 бит величины. Чем больше бит, тем точнее результат, но уже потребуется на это больше времени и более серьёзный и точный АЦП. Имея данный результат, нам несложно будет посчитать величину измеренного напряжения. Мы знаем. что если у нас АЦП 10-битный, то данный результат у нас лежит в промежутке от 0 до 1024, получаемтся всего у нас 1023 отрезка. И мы затем наш результат делим на 1023 и умножаем на величину опорного напряжения.

Посмотрим блок-схему АЦП в контроллере Atmega8

Мы видим, что у нас есть мультиплексор, имеющий 8 каналов, вход для опрного напряжения AREF. Также существует 8-разрядная шина данных, значения с которых записываются в определённый регистр. Есть регистр данных, регистр управления и состояния, а также регистр управления мультиплексором.

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

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

Также мы всё подключим и на живом контроллере

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

А вот и таблица вариантов опорных напряжений для АЦП

Перечислим данные варианты сверху вних по таблице. 1 вариант – это внутреннее опорное напряжение, равное напряжению питания, 2 вариант – опорное напряжение подаётся на вход AREF извне, 3 вариант – внутреннее 2,56 вольт с использованием внешнего конденсатора, которы у нас уже припаян к отладочной плате к определённым ножкам контроллера.

Также в АЦП есть делитель частоты на величину от 2 до 128. Делитель этот для того, чтобы мы добивались частоты работы АЦП не больше 200 кГц, иначе точность измерений будет очень малой и мы просто растеряем самые младшие биты. Если у нас возникнет требование имено к скорости измерений и нам уже точность будет на так важна, то мы сможем использовать и более высокие частоты измерений.

Теперь немного поближе познакомимся с регистрами АЦП.

Регистр ADCSRA – управляющий и статусный регистр

ADEN – данный бит включает АЦП.

ADSC – при установке в 1 заставляет АЦП начинать преобразование.

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

ADIF – бит, также используемый только в режиме прерываний. Это флаг прерываний, который устанавливается в определённых условиях.

ADIE – бит, включающий режим прерываний.

ADPS2-ADPS0 – биты, от комбинации которых зависит величина делителя

Регистр ADMUX – это регистр для управления каналами мультиплексора АЦП

Но, помимо непосредственно битов управления каналами у данного регистра есть ещё некоторые управляющие биты

REFS1-REFS0 – биты, включающие определённый режим использования опорного напряжения. Таблица была размещена на данной странице выше.

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

MUX3-MUX0 – биты, включающие определённый канал мультиплексора

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

Ну и, наконец, регистровая пара ADCH и ADCL, состоящая из старшего и младшего байта в которую и заносится измеряемый результат. А как именно он туда укладывается, этот результат, зависит от состояния бита ADLAR, рассмотренного выше в регистре ADMUX

То есть, если бит ADLAR не выставлен, то младшие 8 бит результата находятся в младшем байте регистровой пары, а 2 старших бита – в младших битах старшего байта. Если же бит ADLAR у нас выставлен, то 8 самых старших бит результата находятся в сатршем байте, а 2 младших в 2 старших битах младшего байта регистровой пары. Второй вариант нам интересен при исользовании 8-битного режима. В данном случае мы читаем только старший байт.

Проект был создан полностью из проекта урока по изучению 4-битного режима подключения LCD Test09 и был назван MyADCLCD.

Также для выноса кода для реализации периферии АЦП были созданы стандартным образом два файла adc.h и adc.c. Соответственно файл adc.h был подключен и в файле main.h и в adc.c.

В файл MyADCLCD.c код был также полностью скопирован из главного файла проекта Test09, всё лишнее было удалено. Код в данном файле после данной операции принял следующий вид

Работа MCP3421 АЦП 18 бит с микроконтроллером ATmega32

Микросхема MCP3421 компании Microchip представляет собой 18-битный сигма-дельта аналогово-цифровой преобразователь с одним каналом измерения, выпускаемый в миниатюрном 6-выводном корпусе SOT23-6 (Рис.1). В микросхему встроен программируемый усилитель напряжения, генератор импульсов и источник опорного напряжения. Связь с микросхемой осуществляется по интерфейсу I 2 C (Рис.2).


Рис.1 Внешний вид микросхемы MCP3421. VIN+,VIN — дифференциальные входы измерительного канала, VSS и VDD — выводы питания, SDA, SCL – линия данных и линия тактового сигнала шины данных I 2 C.


Рис.2 Микросхема MCP3421. а – структурная схема, б – схема подключения.

Настройка режимов работы микросхемы осуществляется в конфигурационном регистре микросхемы:


Рис.3 Конфигурационный регистр микросхемы. * — значение по умолчанию, сразу после подачи питания.

Рассмотрим назначение отдельных бит в конфигурационном регистре:

RDY – запись в этот бит “1” инициализирует новое одиночное преобразование.

С1,С0 – выбор канала (т.к. в MCP3421 только 1 канал, то не используются). Только для MCP3422/3/4.

O/C – вид преобразования (“1” – непрерывное/ “0” – одиночное).

S1,S0 – выбор битности/скорости преобразования:

0 0 12 бит / 240 измерений в секунду

0 1 14 бит / 60 измерений в секунду

1 0 16 бит / 15 измерений в секунду

0 0 18 бит / 3.75 измерений в секунду

G1,G0 – выбор коэффициента усиления:

Например, если мы хотим чтобы микросхема работала в режиме непрерывных преобразований в 18-битном режиме (преобразования будут производятся 3,75 раз в секунду) c коэффициентом усиления равным «1», то в конфигурационный регистр следует записать байт 000111

Запись байта в конфигурационный регистр

Диаграмма записи в конфигурационный регистр представлена на рис.4


Рис.4 Запись байта в конфигурационный регистр MCP3421

Для записи байта в конфигурационный регистр MCP3421 при использовании TWI-модуля микроконтроллера Atmega32 необходимо произвести 5 последовательных действий:

1. Отправить стартовый бит.

2. Отправить 7 бит адреса микросхемы.

3. Отправить бит «запись»

4. Отправить байт с конфигурацией работы MCP3421.

5. Отправить стоповый бит.

Теперь посмотрим, как эти действия будут описаны на языке СИ в программе Atmel Studio7:

Рассмотрим приведенные функции подробнее:

При отправке стартового бита необходимо в регистре управления TWCR разрешить работу TWI (TWEN=1), установить флаг состояния Start (TWSTA=1) и установить флаг прерывания TWI (TWINT=1), при этом переходить к следующему действию с модулем TWI необходимо дождавшись отправки стартового бита (когда он отправится TWINT вернется в 0):

Адрес MCP3421 состоит из 7 бит: первых 4 бита — это код устройства, который равен 1101 и 3 адресных бита. Адресные биты MCP3421 по умолчанию равны 000 и не подлежат изменению, поэтому на одну шину данных I 2 C может быть подключена только одна такая микросхема (У старших микросхем в этой серии, таких как MCP3423/24 есть дополнительные выводы Adr0 и Adr1, которые используются для задания адреса микросхемы). Самый младший бит указывает на направление передачи данных (0 – запись, 1 — чтение). Следовательно, обращение к микросхеме MCP3421 по её адресу для записи в неё данных будет выглядеть следующим образом:

TWI_Sendbyte(0b11010000);//Отправляем адрес MCP3421: 1101000 + 0 запись

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

Здесь для отправки байта необходимо записать в регистр TWDR значение отправляемого байта, в регистре управления TWCR разрешить работу TWI, установить флаг прерывания TWI, при этом переходить к следующему действию с модулем TWI следует дождавшись отправки байта.

При отправке стопового бита необходимо в регистре управления TWCR разрешить работу TWI, установить флаг состояния Stop и установить флаг прерывания TWI, при этом не следует дожидаться ответа от модуля TWI – т.к. микроконтроллер его не получит:

Читайте также  Какой способ соединения источников позволяет увеличить напряжение?

Получение результата измерения от MCP3421 в 18-битном режиме

Диаграмма чтения данных из микросхемы MCP3421 представлена на рис.5.


Рис.5 Чтение данных из микросхемы MCP3421

Для получения результата измерения от MCP3421 при использовании TWI-модуля микроконтроллера Atmega32 необходимо произвести 5 последовательных действий:

1. Отправить стартовый бит.

2. Отправить 7 бит адреса микросхемы.

3. Отправить бит «чтение»

4. Принять три байта с данными от MCP3421.

5. Отправить стоповый бит.

На языке СИ в программе Atmel Studio7 эти действия могут быть описаны следующим образом:

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

Здесь показан пример функции принятия трех последовательных байтов от MCP3421:

В этой функции, на каждом этапе принятия байтов необходимо в регистре управления TWCR разрешать работу TWI, устанавливать флаг прерывания TWI и дождавшись завершения операции принятия байта в регистр данных TWDR, переписывать принятый байт в переменную (в примере это a1, a2, a3). Такие действия следует выполнять при приеме каждого из трех байт.

После первого и второго принимаемого байта нужно отправлять подтверждение о получении байтов (установкой бита TWEA регистра TWCR в “1”), а после получения третьего байта, это подтверждение отправлять не обязательно (если его отправить, то четвертым байтом MCP3421 вышлет состояние конфигурационного регистра).

Преобразование результата измерения от MCP3421

Как видно из диаграммы на рис.5, результат измерения представлен в трех байтах: В первом байте 7 старших бит соответствуют знаку результата измерения (если эти биты равны 0, то знак “+”, если 1 – то знак “-“). Младший бит первого байта соответствует старшему биту результата измерения, а его младшие биты располагаются во 2 и 3 байтах. Таким образом, из 18 значащих бит получаемых от микросхемы результат измерения занимает 17 бит, а знак результата – 1 бит.

Сохраним “знак” результата измерения, после чего удалим знаковые биты:

Мы имеем результат измерения в трех различных переменных, поэтому его необходимо собрать в одну переменную:

Теперь результат измерения может быть переведен из кода в напряжение и выведен на дисплей следующим способом, с учетом знака:

Для использования функции sprint необходимо добавить в проект её описание:

1. Project→properties→toolchain→AVR/GNU Linker→Libraries(-WI,-I)

Нажать “+” и написать: libprintf_flt.a

2. Project→properties→toolchain→AVR/GNU Linker→General

Поставить галку напротив пункта: Use vprintf library(-WI,-u,vprintf)

Файл с кодом в программе Atmel Studio 7 приложен к статье.

Модель микросхемы MCP3421 присутствует в программе Proteus. Подключение осуществляется следующим образом (Рис.6):


Рис.6 Моделирование 18 бит АЦП в программе Proteus

Ниже представлена фотография эксперимента с микросхемой MCP3421 на макетной плате (Рис.7).

Сопряжение АЦП с микроконтроллерами AVR

Микроконтроллеры AVR семейств tiny и mega имеют встроенные десятиразрядные аналого-цифровые преобразователи, что в целом очень удобно для создания различных измерительных устройств на основе микроконтроллеров. Но нередко требуется выполнять аналого-цифровое преобразование с более высокой разрядностью, точностью или скоростью. Для этого нужно подключить к микроконтроллеру внешний АЦП с соответствующими параметрами. В статье приведены примеры сопряжения трёх различных АЦП с микроконтроллером ATmega8.

Для экспериментов с различными внешними АЦП был изготовлен по схеме, изображённой на рис. 1, модуль, содержащий микроконтроллер ATmega8L-8PI и буквенно-цифровой ЖКИ MT-10S1, позволяющий отобразить на своём экране строку из десяти символов. К этому модулю подключались для исследования различные микросхемы АЦП, для работы с каждой из которых в программную память микроконтроллера загружалась специально разработанная демонстрационная программа, превращающая устройство в простой цифровой милливольтметр постоянного тока.

Рис. 1. Схема устройства

Схема подключения к микроконтроллерному модулю 12-разрядного АЦП AD7896AN [1] показана на рис. 2. Особенность этого АЦП — использование напряжения питания в качестве образцового. Поэтому здесь он питается от параллельного стабилизатора на микросхеме TL431. При напряжении питания 4,096 В цена младшего разряда выходного кода АЦП равна 1 мВ.

Рис. 2. Схема подключения к микроконтроллерному модулю 12-разрядного АЦП AD7896AN

Точное значение напряжения питания устанавливают подстроечным резистором R1. Результат преобразования поступает в микроконтроллер по последовательному интерфейсу, образованному линиями PB5 (SCK) и PB4 (MISO). Микроконтроллер подаёт АЦП команду запуска преобразования по линии PB0 и принимает сигнал о его завершении по линии PB1.

Демонстрационная программа Vmeter_AD7896 запускает АЦП и выводит полученный результат в виде десятичного числа на ЖКИ HG1 микроконтроллерного модуля. Для исключения миганий индикатора предусмотрена секундная задержка между измерениями. Последовательный интерфейс реализован программно, поскольку обнаружилось, что принятые от АЦП аппаратным модулем SPI микроконтроллера данные некорректны — результат измерения удвоен. Причина этого ещё подлежит выяснению.

Схема подключения к микроконтроллерному модулю 12-разрядного АЦП MCP3201 [2] показана на рис. 3. Он имеет дифференциальный вход преобразуемого напряжения, что не исключает возможности работы в однополярном режиме при соединении входа IN- с общим проводом.

Рис. 3. Схема подключения к микроконтроллерному модулю 12-разрядного АЦП MCP3201

Этому АЦП требуется отдельный источник образцового напряжения, которым в рассматриваемом случае служит микросхема REF3030 с типовым значением выходного напряжения 3 В. Более удобным было бы применить аналогичную микросхему REF3040, дающую образцовое напряжение 4,096 В, как в предыдущем случае, но найти такую микросхему не удалось.

Если перемычка S1 установлена в положение 2-3, входное напряжение поступает на вход АЦП напрямую с Входа 1. Когда она в положении 1 -2, напряжение на вход АЦП проходит с Входа 2 через ФНЧ с частотой среза 10 Гци коэффициентом передачи 1 на ОУ DA1. Устанавливать на входе АЦП фильтр или повторитель напряжения на ОУ рекомендуется, если источник сигнала «шумит» или имеет высокое выходное сопротивление.

Передача информации из АЦП в микроконтроллер организована по последовательному интерфейсу, использующему линии PB5 (SCK), PB4 (MISO) и PB2 (CS). Низкий уровень сигнала CS, устанавливаемый микроконтроллером, разрешает АЦП приём и передачу информации по последовательному интерфейсу.

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

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

В программе учтено, что для получения от АЦП MCP3201 правильного результата преобразования два старших разряда его старшего байта необходимо обнулить, а затем сдвинуть весь двухбайтовый результат на один разряд вправо.

При образцовом напряжении 3 В цена младшего разряда результата преобразования 3/4096 » 0,7324 мВ. Чтобы для получения результата в милливольтах использовать только целочисленные вычисления, программа умножает принятый от АЦП код на в 10000 раз большее число 7324, а затем делит произведение на 10000. Целая часть частного выводится на ЖКИ с незначащими нулями, причём десятичная запятая устанавливается после разряда целых вольт.

Наиболее просто подключить к микроконтроллерному модулю 16-разрядный АЦП ADS1110 [3]. Для этого требуются всего два резистора, два конденсатора и две линии ввода/вывода микроконтроллера. Схема подключения показана на рис. 4. АЦП имеет интерфейс I 2 C, аппаратный адаптер которого имеется в большинстве микроконтроллеров. Адрес ведомого АЦП ADS1110 на шине I 2 C зашифрован в нанесённой на корпус микросхемы маркировке. Всего возможны восемь вариантов: ED0 — 1001000, ED1 — 1001001. ED7 — 1001111. Если в разрабатываемом устройстве предполагается использовать несколько таких АЦП, нужно выбирать их с разными адресами ведомого.

Рис. 4. Схема подключения

Интервал допустимого синфазного входного напряжения у этого АЦП — 0. 2,048 В, дифференциального входного напряжения — от -2,048 до +2,048 В. При этом потенциал каждого входа должен быть положительным или нулевым относительно общего провода.

В АЦП ADS1110 имеется конфигурационный регистр, в котором значениями двух младших разрядов PGA0 и PGA1 устанавливают коэффициент усиления встроенного усилителя, следующими двумя разрядами DR0 и DR1 задают скорость преобразования и передачи информации. Однако с увеличением скорости преобразования уменьшается его разрядность. В прилагаемой демонстрационной программе Vmeter_ ADS1110 оставлены заводские установки: 16 разрядов, 15 выборок в секунду (DR0=1, DR1 = 1).

Следующий разряд SC позволяет выбрать режим преобразования: 1 — однократное, 0 — непрерывное (по умолчанию). Ещё два разряда не используются, а старший разряд ST/DRDY в программе оставлен без изменения.

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

Подпрограмма вычисления напряжения аналогична рассмотренной выше для АЦП MCP3201. Но поскольку цена младшего разряда АЦП ADS1110 равна 62,5 мкВ, результат преобразования программа умножает на 625 и делит на 1000. Измеренное значение напряжения выводится на экран со знаком плюс или минус и с точностью до десятых долей милливольта. Но верными можно считать только четыре старшие десятичные цифры результата, поскольку именно с такой точностью задана цена младшего двоичного разряда кода АЦП.

Измерения можно проводить в однополярном режиме, подавая измеряемое положительное напряжение на Вход+ или Вход-, а неиспользуемый вход — соединив с общим проводом. Если напряжение подано на Вход-, результат работы АЦП будет отрицательным числом, представленным дополнительным кодом. Программа распознаёт его по единице в старшем разряде старшего байта и для дальнейших вычислений инвертирует. Аналогично работает программа в дифференциальном режиме измерения. В этом случае результат преобразования получается отрицательным, когда напряжение на Входе- больше, чем на Входе+. Знаки плюс или минус на экране ЖКИ информируют о том, на какой вход подано измеряемое напряжение, или о том, на каком входе оно больше.

Программы микроконтроллера имеются здесь.

1. AD7896 2.7V to 5.5V, 12-Bit, 8 ms ADC in 8-Pin SO/DIP. — URL: https://lib.chipdip.ru/ 143/DOC000143743.pdf (29.05.17).

2. MCP3201 2.7V 12-Bit A/D Converter with SPI Serial Interface. — URL: https://lib. chipdip.ru/2 51 /DOC000251218.pdf (29.05.17).

3. ADS1110 16-Bit Analog-to-Digital Converter with Onboard Reference. — URL: http:// www.farnell.com/datasheets/1863612.pdf (29.05.17).

Автор: Н. Салимов, г. Ревда Свердловской обл.

Мнения читателей

Нет комментариев. Ваш комментарий будет первый.

Вы можете оставить свой комментарий, мнение или вопрос по приведенному выше материалу:

Работа mcp3421 ацп 18 бит с микроконтроллером atmega32

Анонс:

  • Измеритель без калибровок;
  • Измеритель без подстроечных сопротивлений;
  • Измеритель с высоким входным импедансом;
  • Однополярное питание;
  • Двуполярный сигнал на входе;
  • АЦП не менее 16 бит;
  • Простая программная реализация интерфейса I2C в режиме Mаster-Slave;
  • Микроконтроллер;
  • Борьба с помехами методом медианной фильтрации;
  • Исходники для AVR-Studio;
Читайте также  Виды измерительных приборов в метрологии

Поставим задачу.

Имеется двуполярный сигнал от источника с высоким внутренним сопротивлением. Необходимо построить схематехнику так, чтобы ни одного подстроечного сопротивления, ни одной калибровки бы не требовалось. Таким источником, например, может быть pH электрод с внутренним сопротивлением доли GΩ и разнополярным сигналом в диапазоне ±250 мВ. (см. http://keklab.ru/articles/3-2010-10-28-21-52-23/18-phmeter.html ).

Задача не решается «в лоб». Внутренний усилитель АЦП, как правило, имеет малый импеданс. Значит надо усилитель на вход по технологии CMOS. Это во-первых. Далее раз усилитель, то чем его питать? Двуполярное питание? Не хотелось бы… А как же ±250 мВ на входе? Это означает создание смещения, а это означает зависимость от точности питания, от точности сопротивлений, организующих смещение, даже при использовании источников опорного напряжения. Вот калибровки и потянутся… Это во-вторых.

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

Но в представленном решении оказалось все проще. Пусть себе гуляет. Я имею ввиду не кошку, а искусственную среднюю точку. Она организована может быть совершенно не симметрично относительно питания 3.3V, совершенно не точными сопротивлениями. Главное, чтобы суммарный ток через Rg1 и Rg2 был бы существенно выше потребления усилителя и АЦП, они единственные потребители, которые зависят от средней точки. Почему не важна стабильность? Да, потому, что средняя точка заведена на “-” внутреннего усилителя АЦП и входной сигнал тоже на неё опирается. Вот если бы минус этого АЦП сидел бы на земле, тогда точность средней точки относительно земли имела бы важное значение.

И ещё два замечания относительно всей конструкции. Если диапазон входного сигнала ±250 мВ, то средняя точка должна быть относительно земли выше 250 мВ. Пусть она будет 1 вольт, тогда диапазон относительно земли будет от -750мВ до 1250мВ, что вписывается и в верхнее ограничение до 3.3 вольт. И последний приятный факт. Точность питания в 3.3 вольта совсем не обязательна, как известно, многие современные операционные усилители к этому относятся «спокойно», если схемотехника не привязывается к питанию для каких-то других целей. Наша цель – отсутствие подстроек и калибровок выполнена. С этим разобрались…

Теперь про усилитель.

А он ничего и не усиливает, а только повторяет и организует преобразование высокого импеданса в потребный для АЦП. Никаких сопротивлений, никаких подстроечников… красота! Если только кому-то потребуется, чтоб он усиливал сигнал, пиши пропало… Точные сопротивления и калибровки вам обеспечены. Хотя есть решение и здесь. Если вместо OPA335 поставить INA333, то можно и усиливать. Но! Точность усиления будет определяться точностью RG (см. pdf). OPA335 имеет один параметр, который позволяет «забыть» про смещения входных токов и напряжений: ZERO DRIFT: 0.05μV/°C (max).

Теперь про АЦП.

Хоть он и 18-ти разрядный, используем только 16. Это будет сказываться на скорости преобразования дельта-сигма. Вот здесь мы можем усиливать сигнал, не заботясь о точности, всё внутри. 1-2-4-8 – возможные варианты параметра усиления PGA. Правда надо отметить, что собственный входной импеданс АЦП зависит от усиления и составляет R=2.25/PGA (MΩ).

В дифференциальном режиме АЦП выдает код, который можно преобразовать в двуполярное значение, мы же этого хотели. В pdf очень «туго» все написано, поэтому, чтобы люди не мучились вот кусок формулы на СИ:

ADC_MCP3421 = (B1

if (ADC_MCP3421

SignADC_MCP3421 = ADC_MCP3421;

else

SignADC_MCP3421 = -(65535-ADC_MCP3421+1); где

  • B1 и B2 – соответственно старший и младший байт, который выдает АЦП в 16-ти битовом режиме, их тип unsigned short имеет значение для операции сдвига влево;
  • ADC_MCP3421 – двухбайтовый код типа unsigned long , на тот случай, если понадобится все таки все 18 бит ;
  • SignADC_MCP3421 – знаковая переменная типа signed long;

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

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

Теперь про микроконтроллер. А точнее про некоторые программные средства, позволяющие уменьшить наводимую помеху.

При большом входном импедансе помехи будут вас донимать. Импульсные и пятидесятигерцовые. Борьба с импульсными помехами описана в этой сказке. А от прочих, помимо экранировки и заземления, помогает метод, который давно используется

  • Измерения надо проводить с интервалом, кратным 20 мс;
  • Накапливать результаты в буфер — signed shortadcdata [25];
  • После накопления проводить медианную фильтрацию;

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

В микроконтроллере организуется системное прерывание. Если есть кварц, то организуется интервал проведения измерения. В данной схеме 80 мс. Буфер adcdata за две секунды накапливает 25 значений. Затем процедура qsort(), которая входит в стандартный набор AVR-Studio, сортирует этот массив по возрастанию. Значение буфера adcdata[13] – отфильтрованное. В этом заключается медианная (серединная) фильтрация. Чем это лучше просто среднего значения?

Возьмем короткий буфер array[5] = <1002, 1010, 999, 1001, 1100>, в который записываем значения АЦП SignADC_MCP3421. Такой он получился после реальных измерений, на которые действует импульсная помеха. Последнее значение резко отличается от остальных из-за этого. Среднее будет = 1022;

После сортировки массив будет таков: array[5] = <999, 1001, 1002, 1010, 1100>;

Медианная фильтрация после сортировки выдаст значение array[2] = 1002. Это значение более точное и не учитывает помеховый выброс. Конечно, можно из необработанного массива выбирать максимальное и минимальное значение и не учитывать их при подсчете среднего. А если таких максимумов будет несколько? По сути медианная фильтрация это и делает.

Важным моментом является период измерений. Контроллер ничего не знает о фазе пятидестигерцовой помехи, она не синхронизирована с моментом начала измерения.

На практике на вход данной схемы было подано 200 мВ синусоидального сигнала с частотой 50 Гц. (см. осциллограммы). Эта синусоида имитировала помеху, наведенную на постоянный сигнал в 100 мВ. Моменты измерения показаны ниже импульсами с периодом в 80 мс. Как видно в двух случаях (осц.1 и осц.2) моменты измерения приходятся на разные фазы синусоиды.

Медианная фильтрация выдавала значение около 100мВ. Соотношение сигнал/шум при этом 100%. Реальный разброс измерения за несколько сеансов составил диапазон от 97.90625мВ до 100.65625мВ. Ошибка составила 2.75%. Ошибка большая, но надо иметь в виду, что реальное соотношение сигнал/шум будет на порядок меньше.

В материалах представлен проект в AVR-Studio ver 4.18 Build 716 для Atmega16A. Он без комментариев, как есть. В нем реализуется алгоритм измерения и метод медианой фильтрации. Так же представлены процедуры для простой организации интерфейса I2C. На практике этот интерфейс так же подвержен помехам. Чтобы это не приводило к «зависанию» организованы некие действия в процедуре void twi_stop(void). Эти материалы можно использовать в организации связи многочисленных Slave-Unit, которые охватывают широкий спектр приборов:

  • DS1307 — часы реального времени;
  • DS 1624 – датчик температуры;
  • DAC7571 – 12 битный ЦАП.

В заключении.

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

  • RB0505S – DC-DC преобразователь;
  • ISO1540 — Low-Power Bidirectional I2C Isolators

Как использовать аналогово-цифровой преобразователь (АЦП) в микроконтроллере AVR ATmega16

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

На нашем сайте мы уже рассматривали использование АЦП в микроконтроллерах AVR в следующих проектах:

Но в данной статье мы более подробно рассмотрим использование АЦП в микроконтроллере AVR ATmega16. В этом проекте мы будем подсоединять ко входу АЦП микроконтроллера небольшой потенциометр и будем использовать 8 светодиодов чтобы показывать изменение напряжения на выходе АЦП в зависимости от изменения сигнала на его входе.

Что такое АЦП (аналого-цифровой преобразователь)

В электронике под АЦП (в переводе с англ. от ADC — analog-to-digital converter) понимают устройство которое конвертирует аналоговый сигнал (например, ток или напряжение) в цифровой код (двоичную форму). В реальном мире большинство сигналов являются аналоговыми, но все микроконтроллеры и микропроцессоры способны понимать только двоичные (бинарные) сигналы – 0 или 1. То есть чтобы заставить микроконтроллер понимать аналоговые сигналы необходимо конвертировать их в цифровую форму – это и делает АЦП. Существуют различные типы АЦП, каждый тип удобен для конкретных приложений. Наиболее популярные типы АЦП используют такие типы аппроксимаций как приближенная, последовательная и дельта-аппроксимацию.

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

Мы в данной статье будем использовать встроенный в микроконтроллер AVR ATmega16 аналого-цифровой преобразователь – практически все микроконтроллеры семейства AVR оснащаются встроенным АЦП. Но вместе с тем следует помнить о том, что существуют и другие типы микроконтроллеров, у которых нет собственных АЦП – в этом случае необходимо использовать внешний АЦП. Как правило, внешние АЦП сейчас выпускаются в виде одной микросхемы.

АЦП в микроконтроллере AVR ATmega16

Микроконтроллер ATmega16 имеет встроенный 10-битный 8-канальный АЦП. Разрядность 10 бит означает, что каждый входной аналоговый сигнал (для ATmega16 он должен быть в диапазоне 0-5В) представляется 1024 уровнями дискретного сигнала (2 в степени 10 = 1024), то есть дискретизируется с точностью Uвх/1024. 8-канальный означает что АЦП может быть задействован на 8 контактах микроконтроллера одновременно. Фактически весь PortA (GPIO33-GPIO40) может быть использован для операций АЦП. По умолчанию выводы PORTA являются контактами ввода/вывода общего назначения. Чтобы задействовать на них функции АЦП необходимо сконфигурировать специальные регистры, ответственные за функции аналого-цифрового преобразования в микроконтроллере. Поэтому их и называют регистрами АЦП. В данной статье мы разберем как правильно их конфигурировать.

На следующем рисунке показано расположение контактов АЦП на корпусе микроконтроллера ATmega16

Читайте также  Регулятор яркости светодиодов своими руками

Необходимые компоненты

  1. Микроконтроллер ATmega16 (купить на AliExpress).
  2. Источник питания с напряжением 5 Вольт.
  3. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  4. Кварцевый генератор 16 МГц (купить на AliExpress).
  5. Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
  6. Конденсатор 22 пФ (2 шт.) (купить на AliExpress).
  7. Кнопка.
  8. Соединительные провода.
  9. Макетная плата.
  10. Светодиоды (любого цвета) (купить на AliExpress).

Работа схемы

Схема устройства приведена на следующем рисунке.

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

Установка регистров АЦП в микроконтроллере ATmega16

Регистр ADMUX (регистр выбора и мультиплексирования канала АЦП) — предназначен для выбора канала АЦП и опорного напряжения (reference voltage). Структура данного регистра представлена на следующем рисунке.

Биты 0-4 используются для выбора канала.

ADC Channel Selected

Бит 5 используется для коррекции результата преобразования вправо или влево.

ADLAR Description
Right adjust the result
1 Left adjust the result

Биты 6-7 используются для выбора опорного напряжения АЦП.

REFS1 REFS0 Voltage Reference Selection
AREF, Internal Vref turned off
1 AREF, Internal Vref turned off
1 Reserved
1 1 Internal 2.56 Voltage Reference with external capacitor at AREF Pin

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

Исходный код программы на языке С (Си) с пояснениями

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

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

АЦП в микроконтроллерах STM32: периферия решает многое

Как вы думаете, в чем отличие между микропроцессорами различных производителей с одним и тем же ARM-ядром? Правильно — разница в периферии! Ведь, по сути, ядро — только лишь вычислитель, замкнутый сам на себя, а общаться с внешним миром ему помогают периферийные устройства: порты ввода/вывода, АЦП, счетчики и т.п. Следовательно, разнообразие этих устройств и качество их исполнения во многом определяют применяемость данного МК при решении тех или иных задач. Давайте посмотрим, что же может нам предложить семейство микроконтроллеров STM32.

Основные параметры АЦП различных семейств микроконтроллеров STM32 представлены в таблице 1.

Таблица 1. Параметры АЦП в различных семействах МК STM32

Серия МК Количество АЦП в одном МК Разрядность, бит Частота дискретизации, Мвыб/сек Количество входных каналов Время
преобразования, мкс
Погрешность преобразования, МЗР
STM32F100 1 12 1 16 1,17…21 2…5
STM32F101 1 1…18
STM32F102 1 1,2…18
STM32F103 2…3 16…21 1…18
STM32F105/107 2 16 1…18
STM32F2xx 3 2 24 0,5…16,4
STM32L 1 1 24 1…25 2…4
STM32W 1 0,1 9 5

Как следует из таблицы, разброс параметров незначителен. Все АЦП имеют разрядность 12 бит, частоту дискретизации до 2 Msps в одиночном режиме и количество входных каналов до 24 (в зависимости от линейки). Выделяется лишь серия STM32W, предназначенная для радиочастотных применений и потому имеющая менее совершенный АЦП. Что касается приборов, в которых присутствует два или три независимых АЦП, то существует возможность увеличить частоту дискретизации путем их настройки на попеременную выборку значений.

Необходимо отметить, что в линейках STM32F1xx и STM32F2xx в парных режимах работы существует возможность увеличения скорости преобразования до 2 Msps и 6 Msps, соответственно. В STM32L АЦП разработан для максимальной экономии энергии без ухудшения параметров (аппаратное отключение между двумя последовательными измерениями).

Рассмотрим более подробно АЦП в линейке STM32F10x.

Каналы АЦП микроконтроллеров STM32 делятся на две группы: регулярные каналы (regular) и инжектированные (injected). Количество регулярных каналов для одного АЦП равняется 18, среди них 16 внешних и два внутренних — опорное напряжение и температурный датчик. Количество приоритетных каналов равняется четырем. Регулярные каналы подразумевают сохранение результатов преобразования через DMA-контроллер в памяти микроконтроллера, а инжектированные каналы имеют собственные регистры для хранения результата. Существует возможность настраивать работу каналов АЦП в произвольном порядке, несколько раз преобразовывать подряд одни и те же каналы, использовать внешние и программные события для старта преобразования.

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

Немаловажная часть — задание времени преобразования для каждого канала. Всего можно задать восемь значений времени для каждого канала в диапазоне 1,5…239,5 циклов тактирования модуля АЦП.

Независимая работа

Этот режим имеет место, когда в составе МК имеется только один АЦП, или когда несколько АЦП настроены на работу без взаимодействия друг с другом. В этом случае возможны следующие режимы работы.

1. Одноканальный (Single-channel)

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

2. Многоканальный (Scan)

В этом режиме возможно сконфигурировать АЦП для выполнения определенного количества (например, 16) последовательных преобразований значений из различных каналов в любой последовательности (например, Канал1-Канал7-Канал12-Канал12-Канал5…). Делается это с помощью записи в специальный регистр последовательности номеров каналов в том порядке, в котором мы желаем осуществить преобразование. Время преобразования также настраивается отдельно для каждого канала. После обработки указанного числа каналов (от 1 до 16) АЦП останавливается. Этот режим может быть полезен, например, при периодическом оценивании среды или обстановки с помощью нескольких датчиков.

3. Одноканальный продолжительный (Single continuous)

Этот режим аналогичен первому, за тем исключением, что после окончания однократного преобразования АЦП не останавливается, а продолжает выбирать отсчеты из одного определенного канала. Широко применяется при непрерывном мониторинге аналоговых сигналов. Для хранения результатов всех обычных каналов выделен один и тот же регистр. Поэтому перед получением следующего значения необходимо позаботиться о сохранении в памяти предыдущего (например, с помощью контроллера DMA).

4. Многоканальный продолжительный (Scan continuous)

То же самое что многоканальный (Scan), только АЦП не останавливается после опроса всех каналов, а снова продолжает выбирать отсчеты, начиная с первого.

5. Прерывистый (Discontinuous)

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

Парная работа

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

1. Одновременный для обычных и приоритетных каналов
(Regular/Injected simultaneous)

При наступлении внешнего события первый АЦП будет сканировать каналы начиная с 0 до 15 для регулярных каналов или с 0 до 3 для инжектированных, а второй — наоборот, с 15 до 0 или с 3 до 0. Таким образом, каждый канал за тот же период времени будет обработан дважды. Необходимо обеспечить, чтобы период между событиями, запускающими преобразование, был как минимум в два раза больше, чем время, необходимое на само преобразование. Нужно вовремя извлекать результаты из регистра данных АЦП в оперативную память. Причем результат преобразования для АЦП2 будет содержаться в старшем полуслове регистра данных, а для АЦП1 — в младшем.

2. Быстрый попеременный
(Fast interleaved)

Доступен только для одного выбранного регулярного канала. При наступлении внешнего события АЦП2 стартует немедленно, а АЦП1 — с задержкой в семь тактов. Если установлен продолжительный (continuous) режим, то такая последовательность будет повторяться далее, что дает возможность удвоить частоту семплирования входного сигнала.

3. Медленный попеременный
(Slow interleaved)

Все как в предыдущем режиме, только АЦП1 стартует с задержкой в 14 тактов, а после окончания первого преобразования АЦП2 тоже выдержит задержку 14 тактов перед повторным стартом.

4. Переменный по триггеру
(Alternate trigger)

Доступен только для инжектированных каналов. При наступлении внешнего события АЦП1 начинает последовательно преобразовывать все инжектированные каналы. При наступлении следующего внешнего события АЦП2 начинает делать то же самое. Если установлен прерывистый (discontinuous) режим, то будет преобразован только один следующий канал на каждое наступившее событие. Этот режим позволяет получить два значения выборки, максимально близкие друг к другу (вплоть до 1…1,5 такта).

5. Комбинированный одновременный режим для регулярных/инжектированных каналов (combined regular/injected simultaneous mode)

Происходит преобразование обоих групп каналов. Но особенность заключается в том, что инжектированная группа каналов может прервать регулярную группу (рис. 1).

Рис. 1. Комбинированный одновременный режим

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

6. Комбинированные одновременный регулярный и переменный по триггеру режимы (combined regular simultaneous + alternate trigger mode)

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

Рис. 2. Комбинированные одновременный и переменный по триггеру режимы

7. Комбинированные инжектированный одновременный режим и режим со смещением каналов (combined regular simultaneous + alternate trigger mode)

Преобразование регулярных каналов осуществляется со смещением по времени и происходит одновременное преобразование двух групп инжектированных каналов (рис. 3).

Рис. 3. Комбинированные инжектированный одновременный режим и режим со смещением каналов

Заключение

Несомненно, множество режимов работы совместно с высокими собственными параметрами обеспечивают отличную перспективу применения 32-битных микроконтроллеров компании ST. Причем с каждой следующей серией заметна тенденция к дальнейшему повышению как частот семплирования, так и разрядности встроенных в МК АЦП. По предварительным данным, в новых линейках STM32 на ядре ARM Cortex-M4 будет доступен 16-битный сигма-дельта АЦП с дифференциальными входами. Это делает его не просто дополнением для приблизительной оценки каких-либо параметров, но и полноценным измерительным инструментом. Там где ранее при построении устройства необходимо было делать выбор в сторону внешнего стороннего АЦП, теперь есть возможность упростить схемотехническое, алгоритмическое решение и в результате получить более простое, дешевое, ремонтопригодное, а следовательно — более конкурентоспособное конечное изделие.