Рубрики
Схемы на AVR

Амперметр на 100 мА на микроконтроллере AVR ATmega8

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

В этом методе мы будем пропускать ток, силу которого необходимо измерить, через резистор с маленьким сопротивлением. Измеряя напряжение на этом резисторе с помощью АЦП микроконтроллера мы сможем определить и интересующую нас силу тока. Измеренное значение тока мы будем показывать на жидкокристаллическом (ЖК) дисплее 16х2.

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

При проектировании схем с делителем напряжения следует принимать во внимание то, что входной ток на АЦП микроконтроллера AVR должен быть не менее 50 мкА. Поэтому следует правильно выбирать резисторы делителя напряжения чтобы минимизировать влияние нагрузки (loading effect) резистора на проходящий через делитель ток.

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

Аппаратное обеспечение

  1. Микроконтроллер ATmega8 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. JHD_162ALCD (ЖК дисплей 16×2) (купить на AliExpress).
  4. Конденсатор 1000 мкФ (купить на AliExpress).
  5. Конденсатор 100 нФ (4 шт.) (купить на AliExpress).
  6. Резистор 100 Ом (7 шт.) (купить на AliExpress).
  7. Резистор 100 кОм (купить на AliExpress).
  8. Источник питания с напряжением 5 Вольт

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

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

Принципы взаимодействия микроконтроллера AVR с ЖК дисплеем можно изучить в этой статье (или, если в сокращенной форме, то в этой).

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

Аналого-цифровой преобразователь (АЦП) микроконтроллера ATmega8 может быть использован на любом из четырех каналов PORTC – мы выберем канал 0 (PIN0) PORTC.

В микроконтроллере ATmega8 АЦП имеет разрешение (разрешающую способность) 10 бит, таким образом микроконтроллер способен реализовать чувствительность равную Vref/2^10, то есть если опорное напряжение (Vref) равно 5В мы получим цифровой инкремент на выходе 5/2^10 = 5мВ. Таким образом, на каждое приращение напряжения на 5 мВ мы будем получать один дополнительный инкремент цифрового выхода АЦП.

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

  1. Сначала мы должны активировать АЦП микроконтроллера.
  2. Затем необходимо установить максимальное входное напряжение для АЦП равное 5В. Это можно сделать путем установки значения опорного напряжения АЦП равного 5В.
  3. АЦП микроконтроллера в нашей схеме будет начинать действовать при внешнем воздействии (не от действий пользователя), поэтому нам следует установить его в режим непрерывного преобразования (free running mode): в этом режиме запуск преобразований выполняется непрерывно через определенные интервалы времени.
  4. В любом АЦП частота преобразования аналогового значения в цифровое и точность цифрового выхода обратно пропорциональны. То есть для лучшей точности цифрового выхода мы должны выбрать меньшую частоту. Для этого мы должны установить коэффициент деления предделителя АЦП в максимальное значение (2). Поскольку мы используем внутреннюю частоту микроконтроллера 1 МГц, то значение частоты преобразования АЦП будет равно 1000000/2.

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

RED (красный, ADEN): этот бит устанавливается чтобы задействовать функции АЦП в ATmega8.

BLUE (синий, REFS1, REFS0): эти два бита используются для установки опорного напряжения (максимального входного напряжения, которое мы собираемся обрабатывать). Поскольку мы будем использовать опорное напряжение равное 5В, бит REFS0  необходимо выставить в соответствии с приведенной таблицей.

LIGHT GREEN (светло зеленый, ADATE): этот бит должен быть установлен чтобы АЦП работал непрерывно (в режиме непрерывного преобразования).

PINK (розовый, MUX0-MUX4): эти 5 бит используются чтобы задать входной канал. Поскольку мы будем использовать ADC0 (PIN0) то, как следует из ниже приведенной таблицы, нам нет необходимости устанавливать все эти биты.

BROWN (коричневый, ADPS0-ADPS2): эти три бита используются для установки коэффициент деления предделителя АЦП. Поскольку мы используем коэффициент деления предделителя 2, мы должны установить только один из этих битов.

DARK GREEN (темно-зеленый, ADSC): этот бит необходимо установить для того чтобы АЦП начал осуществлять преобразование. Далее в программе мы можем его сбросить (в 0) если нам нужно будет остановить процесс аналого-цифрового преобразования.

Для лучшего понимания этой статьи можно также прочитать статью о цифровом вольтметре на микроконтроллере AVR.

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

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

Видео, демонстрирующее работу схемы

10 ответов к “Амперметр на 100 мА на микроконтроллере AVR ATmega8”

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

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

Добрый день!
Команда (функция) dtostrf () в тексте: «dtostrf(CURRENT, 4, 1, CURRENTSHOW); //преобразуем число в строку»
это — библиотечная ф-ция? Как она работает и что делает?

С уважением, Сергей.

Добрый вечер, это стандартная для языка C++ функция. Она преобразует число вещественного типа в строку (массив символов) с заданной точностью — указывается общее количество знаков числа и после запятой которые нужно преобразовать в строку. В тексте программы есть же подробные комментарии по этому поводу. Дело в том, что на ЖК дисплее вам не удастся простым способом вывести значение числа, поэтому его и преобразуют в строку. Более подробно об этой функции можете прочитать, к примеру, здесь — portal-pk.ru/news/95-funkciya—dtostrf-.html

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

Извините, не совсем понял что вы имели ввиду. Можно немного поподробнее?

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

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