Attiny13 ацп опорное напряжение

OSBoy notes.

ATtiny13 — Регулятор ШИМ с использованием АЦП

В предыдущем примере был подробно рассмотрен принцип работы ШИМ в AVR микроконтроллерах, на примере ATtiny13. Теперь же рассмотрим пример реализации ШИМ регулятора.

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

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

Настройка АЦП

Рассмотрим подробнее, какие регистры отвечают за работу АЦП.

Регистр ADMUX (ADC Multiplexer Selection Register).
Для ATtiny13 его структура выглядит следующим образом:

Бит 6 — REFS0 (Reference Selection Bit): выбирает опорный сигнал напряжения для АЦП: *

  • 0 — в качестве опорного используется напряжение Vсс;
  • 1 — используется внутренний источник опорного напряжения 1.1В.

Бит 5 — ADLAR (ADC Left Adjust Result): Определяет порядок записи результатов преобразования в регистры ADCL и ADCH (см. ниже).

Биты 1-0 — MUX1-0 (Analog Channel Selection Bits): Отвечают за выбор входного канала: *

  • 00 — ADC0 (PB5);
  • 01 — ADC1 (PB2);
  • 10 — ADC2 (PB4);
  • 11 — ADC3 (PB3).

* Если какой-либо из битов REFS0, MUX0, MUX1 изменяется во время преобразования, изменение не будет действовать до тех пор, пока это преобразование не будет завершено (пока не установится бит ADIF в регистре ADCSRA).

Остальные биты не используются (зарезервированы) и доступны только для чтения (в них всегда нули).

Регистр ADCSRA (ADC Control and Status Register A):

Бит 7 — ADEN (ADC Enable): Установка этого бита активирует АЦП. Если сбросить этот бит во время преобразования, то преобразование остановится.

Бит 6 — ADSC (ADC Start Conversion): Запускает преобразование. В режиме одиночного преобразования, нужно устанавливать этот бит для каждого преобразования. В режиме автоматического преобразования — нужно установить этот бит для запуска первого преобразования.

Бит 5 — ADATE (ADC Auto Trigger Enable): Активирует автопреобразование. АЦП начнет преобразование на положительном фронте триггерного сигнала. Источник триггера выбирается установкой бита выбора триггера АЦП: ADTS регистра ADCSRB.

Бит 4 — ADIF (ADC Interrupt Flag): Флаг прерывания АЦП. Устанавливается по завершению преобразования, когда регистры данных обновились.

Бит 3 — ADIE (ADC Interrupt Enable): Разрешает прерывания АЦП.

Биты 2-0 — ADPS2-0 (ADC Prescaler Select Bits): Устанавливают предделитель тактовой частоты для АЦП:

Регистры данных ADCH и ADCL.

Результат аналого-цифрового преобразования может принимать значения от 0 до 2 n -1 (где n — число разрядов АЦП). В ATtiny13 на борту десятиразрядный АЦП. Соответственно, результат АЦП может принимать 1024 значения (от 0 до 1023).
0 (0x00) — будет соответствовать входному напряжению 0В;
1023 (0x3FF) — входному напряжению, равному выбранному опорному (в зависимости от значения бита REFS0 регистра ADMUX).

По завершению преобразования, результат записывается в регистры данных ADCH и ADCL (соответственно, cтарший и младший регистры данных АЦП), в зависимости от значения бита ADLAR регистра ADMUX. Если бит ADLAR установлен — то ориентирование данных левое, если сброшен (по умолчанию) — то правое:

Читайте также:  Дмрв низкое напряжение гранта

Когда ADCL считывается, регистр данных ADC не обновляется, пока не будет прочитан ADCH. Таким образом, если выбрано левое ориентирование данных (ADLAR=1) и нам достаточно 8-битной точности, то достаточно прочитать значение ADCH. В противном случае — сначала нужно считать значение ADCL, затем ADCH.

Регистр ADCSRB (ADC Control and Status Register B):

Биты 2-0 — ADTS2-0 (ADC Auto Trigger Source): Выбирают источник сигнала для старта преобразования в режиме автоизмерения. Преобразование будет запускаться каждый раз при установке выбранного флага прерывания:

  • 000 — постоянно запущено;
  • 001 — аналоговый компаратор;
  • 010 — внешнее прерывание INT0;
  • 011 — таймер/счётчик T0, по совпадению с регистром сравнения A;
  • 100 — таймер/счётчик T0, по переполнению;
  • 101 — таймер/счётчик T0, по совпадению с регистром сравнения B;
  • 110 — внешнее прерывание PCINT0.

Бит 6 — ACME (Analog Comparator Multiplexer Enable): в этой статье я не буду затрагивать применение этого бита, т.к. аналоговый компаратор — это уже отдельная тема.

Остальные биты не используются (зарезервированы) и доступны только для чтения (в них всегда нули).

Регистр DIDR0 (Digital Input Disable Register 0).

Биты 5-2 — ADC3D-ADC0D (ADC3-0 Digital Input Disable): Если какой-либо из входов ADC3-0 используется как аналоговый, то в соответствующий бит ADC3D-ADC0D нужно устанавливать логическую единицу. При этом, буфер цифрового ввода на соответствующем выводе АЦП отключается для экономии энергии. Соответствующий бит PIN-регистра при этом всегда будет содержать ноль.

Возвращаемся к нашей программе.

Итак, мы настроили таймер для ШИМ, и запустили АЦП: он будет постоянно отслеживать напряжение на входе ADC2, регулируемое переменным резистором, а каждый раз по окончанию преобразования будет срабатывать прерывание ISR(ADC_vect), в теле которого будут изменяться значения регистров сравнения для ШИМ-таймера, в зависимости от измеренного напряжения на входе АЦП. И не забываем, после настройки прерывания, разрешить прерывания глобально!

Источник

ATtiny13. Установка опорного напряжения АЦП

возможно ли подключить в attiny13 опорное напряжение Vcc вместо Vref
и как правильно это сделать?
пробовал в CVAVR ADC Bandgap Voltage Reference: Off и ADC Bandgap Voltage Reference: On
никакой разницы, опорное все равно остается примерно 1,1V, а именно:

что не так делаю?
эмулировал в proteus

Добавлено через 1 час 17 минут
решено: допустил ошибку при переключении разрешения АЦП, данные поставил при 8 бит, а затем использовал 10 бит

ATtiny13. Работа с АЦП (Си)
необходима информация о том, как правильно можно использовать ЦАП и компаратор в паре, а именно с.

Смена опорного напряжения
Мега8. Необходимо в процессе работы контроллера менять опорное напряжение. Для одних измерений 5В.

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

Неполадки с АЦП ATTiny13
Здравствуйте! Сейчас делаю нечто вроде цифровой сервы на основе ATTiny13, управляемой по UART.

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

АЦП Attiny13 странное поведение
Всем привет! Ребята помогите, проблема с АЦП. В конце текста описана. Вот настройка Free running;.

Ацп и угол напряжения
Как можно с помощью ацп, сняв мгновенное значение напряжения, вычеслить его угол?

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

Читайте также:  Напряжение бортовой сети шевроле орландо

Источник

Трёхканальный UART АЦП на ATtiny13

Привет хабр. Я уже давно вынашивал сделать UART Аналогового-Цифрового Преобразователя на ATtiny13, зачем делать именно на ATtiny13 ведь есть, к примеру, ATmega8 имеет аж 6 (для DIP корпуса) портов на которых, при помощи мультиплексора, можно проводить измерение АЦП?
Причин несколько:

— ATtiny13 стоит дешевле;
— В ATtiny13 более оптимально используются ресурсы микроконтроллера;
— Размеры;
— Энергопотребление;
— Просто мне так захотелось.

Конечно на мои аргументы можно найти множество контраргументов, например ATmega8 при использовании V-USB может превратится в плату ввода/вывода которой не нужен переходник с UART на USB, правда кроме последнего, и с этим пожалуй не поспоришь.

Поставил себе за цель получить опыт работы с программный UART’ом именно на ATtiny13, а опыт как говорится, бесценный. По-любому пригодится для будущих проектов.
Ну ладно, не буду тянуть и покажу, как работает в железе:

Пару слов по схеме, кстати, вот она:

Скажу сразу, что не плохо бы уделить внимание фильтру питания, у меня это два конденсатора C1 — желательно «керамика» и как можно ближе к ножкам МК, ну и C2 — электролитический, второй можно поставить на 100 мкФ но у меня такого не оказалось под рукой, нашёл на 470 мкФ 10 В. Так же было бы не плохо по конденсатору на каждый порт АЦП, и как можно ближе к МК. R1 не принципиален, но по правилах «хорошего тона» — должен присутствовать.

Данные, как Вы могли видеть, приходят в формате 1023,666,10, ну хоть бери и сохраняй в формате CSV на компе или же другом устройстве, которое будет принимать эти данные.
Кстати принимает данные в моём случае недорогой преобразователь USB — UART основан на микросхеме PL2303HX. Пробовал питать ATtiny13 от бортовых 3.3 В что на преобразователе, по мультиметру к стати 3.4 В, работает, я поначалу думал что изменение питания на такое высокое значение как-то скажется на отправке данных, я где-то читал страшилку мол, нагрей на пару градусов, охлади и всё, прощай адекватные данные… Ничего подобного, охлаждал льдом, слегка грел зажигалкой(без фанатизма) — всё работает нормально, потерь не наблюдал.

Пару слов про код — код написан в среде BASCOM-AVR на Basic’е, вот предлагаю Вашему вниманию мой код на написание я потратил около чем 4-5 часов, так как я раньше не встречался с Basic’ом, но это время было потрачено не только на написание кода но и на то, чтобы разобраться с особенностями BASCOM-AVR, отладка и всякое такое.

Что делает данные код — по началу создаётся программный UART, тут это делается очень просто, задаём нужные параметры, порт, скорость и прочее, потом осуществляется конфигурация АЦП, объявление функции, ну это понятно, потом формируется строчка и результатами усреднённого числа от Samples выборок АЦП. Почему я выбрал именно 64 а не к примеру 42 или 108? Ну потому что 1023 * 64 это равно 65 472, а для типа Word, который я использовал для буфера максимальное значение которое переменная может принять — 65 535, это число является наибольшим числом, представимом в виде двухбайтного слова без знака, если добавить ещё одну выборку переменная попросту обнулится если АЦП возвратит 1023. С типом Long почему-то возникали проблемы, да лично мне и 64 выборки хватает, ниже я покажу как это работает на графике. Ну и потом в UART выводятся результаты.

Читайте также:  Нормальное напряжение в точке b поперечного сечения 120 мпа

Как Вы можете видеть шум конечно присутствует, даже не смотря на то что выводится усреднённое значение из 64 выборок, судя по даташиту шум в ± 2 LSB — норма, у меня же шум 1 LSB.

Как Вы можете видеть, ATtiny13 отправляет значения 15-16 раз за секунду, что я считаю не плохо учитывая что это программный UART да и тиня делает по 64 измерения на порт, а их причём три.

МК потребляет следующий ток:

Питание 5 В — 2.71 мА
Питание 3.3 В 1.75 мА

Пару слов о программированию — как я сказал на видео, частота МК 1.2 МГц, все фьюзы по умолчанию, как в моём предыдущем топике Музыкальный дверной звонок в стиле Star Wars.
Вот фьюзы из калькулятора фьюзов:

Ну и под конец пару фоток из разных ракурсов:

Источник

Урок 9. Работа с АЦП на примере ATtiny13 в BASCOM-AVR

В очередном уроке я расскажу про АЦП и работу с ним в микроконтроллерах AVR. Начнем, пожалуй, с теории: И так, что же такое АЦП? Это аналого-цифровой преобразователь, который преобразует входной аналоговый сигнал в цифровой. АЦП есть практически во всех современных AVR микроконтроллерах, исключения лишь составляют AVR микроконтроллер ATtiny2313 и ещё некоторые. На практике с помощью AVR микроконтроллера и АЦП можно реализовать много интересных вещей: вольтметры, осциллографы, звукозаписывающие устройства, термометры и это далеко не предел! В общем, применяется АЦП там, где аналоговый сигнал нужно перевести в цифровой.

Работа с АЦП в BASCOM-AVR

Для начала работы с АЦП в BASCOM-AVR нужно сконфигурировать сам АЦП, это делается вот так:
Config Adc= режим считывания, Prescaler = частота дискретизации, Reference = источник опорного напряжения
Режимы считывания: Single — единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно.
Частота дискретизации Prescaler может быть 2,4,8,16,32,64 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
Источник опорного напряжения Reference может быть: Aref – внешний источник, Avcc – напряжение питания схемы и Internal – внутренний.
Пример конфигурирования АЦП: Config Adc = Single, Prescaler = Auto, Reference = Internal
После конфигурирования АЦП необходимо его запустить командой Start Adc, теперь можно считать значение с любого канала АЦП командой Getadc(канал АЦП). В документации на микроконтроллер порты с АЦП маркируются так: ADC1, ADC2 и т.д.
Вот так:

Практика работы АЦП на примере ATtiny13

А теперь попробуем поработать с АЦП на практике и напишем программу в BASCOM-AVR. А что же будет делать программа? Спросите вы. А принцип работы такой: вращая движок переменного резистора светодиоды должны загораться в соответствии с напряжением на выходе переменного резистора. Чем больше напряжение, тем больше светится светодиодов. Для начала возьмём микроконтроллер ATtiny13, три светодиода, четыре резистора, переменный резистор и соберём простую схему что ниже:

И напишем несложную программку на BASCOM-AVR, применяя полученные знания:

Компилируем, прошиваем микроконтроллер и наслаждаемся! Кстати фьюз биты микроконтроллера необходимо установить на работу внутреннего тактового генератора на 9.6МГц. Вот пример установки фьюз битов в программе PonyProg2000:

Моя сборка на макетной плате с механическими контактами:

В файлах к статье есть проект в симуляторе Proteus:

Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже

Источник

Оцените статью
Adblock
detector