Site Loader

AVR. Описание работы АЦП




Email автора.

Copyright: Сухарев Евгений, 2005


Описание работы Аналого-цифрового преобразователя.
Прерывания от АЦП


ATMega16 содержит в себе 10-битовый АЦП, вход которого может быть соединён с одним из восьми выводов Port A. АЦП Mega16, как и любому другому АЦП, нужно опорное напряжение для целей сравнения со входным ( если измеряемое равно опорному, то получаем максимальный код в двоичном виде). Опорное напряжение подаётся на вывод ADRef или может использоваться внутренний генератор с фиксированным напряжением 2,65 В. Полученный результат можно представить в таком виде:

АЦП включается установкой бита ADEN в регистре ADCSRA.

После преобразования, 10-битный результат оказывается в 8-битных регистрах ADCL и ADCH. По умолчанию, младший бит результата находится справа (то есть в bit 0 регистра ADCL, так называемое правое ориентирование). Но порядок следования битов на левое ориентирование можно сменить установив бит ADLAR в регистре ADMUX. Это удобно, если требуется получить 8-битовый результат. В таком случае требуется прочитать только регистр ADCH. В противном случае, Вы должны сначала прочитать регистр ADCL первым, а ADCH вторым, чтобы быть уверенным в том, что чтение этих двух регистров относится к результату одного преобразования.

Одиночное преобразование может быть вызвано записью бита ADSC в регистр ADCSRA. Этот бит остаётся установленным всё время, занимаемое преобразованием. Когда преобразование закончено, бит автоматически устанавливается в 0. Можно также начинать преобразования по событиям из разных источников. Модуль АЦП также может работать в режиме «свободного полёта». В таком случае АЦП постоянно производит преобразование и обновляет регистры ADCH и ADCL новыми значениями.

Для выполнения преобразования модулю АЦП необходима тактовая частота. Чем выше эта частота, тем быстрее будет происходить преобразование (оно, обычно, занимает 13 тактов, первое преобразование занимает 25 тактов). Но чем выше частота (и выше скорость преобразования), тем менее точным получается результат. Для получения максимально точного результата, модуль АЦП должен тактироваться частотой в пределах от 50 до 200 КГц. Если необходим результат с точностью менее 10 бит, то можно использовать частоту больше 200 КГц. Модуль АЦП содержит делитель частоты, чтобы получать нужную тактовую частоту для преобразования из частоты процессора.

Регистр ADMUX задаёт входной контакт порта A для подключения АЦП, ориентирование результата и выбор опорной частоты. Если установлен бит ADLAR, то результат лево-ориентирован. Опорная частота от внутреннего генератора задаётся выставленными в 1 битами REFS1 и REFS0. Если оба бита сброшены, то опорная частота берётся от контакта AREF. В случае, если REFS1=0 а REFS0=1, опорная частота берётся от AVCC с внешним конденсатором, подключенным к AREF. Выбор контакта ввода выполняется следующим образом:

Регистр контроля и статуса АЦП ADCSRA:

Бит ADEN=1 включает модуль АЦП.
Запись единицы в ADSC запускает цикл преобразования. В режиме «свободного полёта» запись единицы запускает первое преобразование, последующие запускаются автоматически.
ADIF — флаг прерывания АЦП. Этот бит устанавливается в 1 когда АЦП завершено преобразование и в регистрах ADCL и ADCH находятся актуальные данные. Этот флаг устанавливается даже в том случае, если прерывания запрещены. Это необходимо для случая программного опроса АЦП. Если используются прерывания, то флаг сбрасывается автоматически. Если используется программный опрос, то флаг может быть сброшен записью лог.1 в этот бит.

ADIE — Если в этом бите установлена единица, и прерывания разрешены глобально, то при окончании преобразования будет выполнен переход по вектору прерывания от АЦП.
Биты ADPS2..0 задают коэффициенты предделителя частоты:

Atmega8 ацп

Re: пассики для проигрывателей винила Re: Динамическая индикация на LCD дисплее Re: Пассик на пленочный магнитофон Re: Продам набор SMD конденсаторов в корпусе


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

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

Содержание:

  • AVR Урок 22. Изучаем АЦП. часть 1
  • roboforum.ru
  • Работа с АЦП (ATMega8, Atmel Studio 6.2)
  • АЦП микроконтроллеров AVR. Делаем цифровой вольтметр 0 — 25V
  • Урок 5. Работа с АЦП
  • АЦП микроконтроллеров AVR. Делаем цифровой вольтметр 0 — 25V
  • Работа АЦП микроконтроллера AVR Atmega8
  • ШИМ и АЦП в Atmega8
  • ATMega8: зачем подключаться VCC и AVCC?
  • 10-битное значение АЦП для измерения напряжения

ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Программирование МК AVR. Урок 22. Часть 3. Изучаем АЦП

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


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

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

При использовании АЦП микроконтроллера AtMega 8, опорное напряжение необходимо подавать на соответствующую ножку контроллера. Измерение напряжения производится в диапазоне от 0 до Vref.

Весь этот диапазон делится в соответствии с разрядностью. То есть если разрядность АЦП — 10 Бит, то диапазон делится на , если 8 бит, то на и так далее. То есть, чем меньше разрядность — тем ниже точность преобразования. На выходе АЦП мы получим численное представление входного напряжения. Легко подсчитать, что шаг измерения равен 0. То есть, для получения значения входного напряжения, необходимо шаг измерения умножить на выходное значение АЦП. АЦП в AtMega 8 всего один, однако, имеет 8 входных каналов.

АЦП микроконтроллера AtMega 8, может работать как в режиме однократного преобразования, так и в режиме непрерывного преобразования Следующее преобразование начинается сразу после предыдущего. Если у вас ещё остались вопросы на тему использования АЦП микроконтроллера, мы будем рады ответить на них в комментариях! Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.

Незаконное копирование, цитирование, воспроизведение преследуется по закону! А если надо измерить напряжение вольт, то как это реализовать при помощи atmega8? Ведь если правильно понял, то можно измерять до 5 вольт.

Спасибо Вам, DamiKK. Подаем мы 15 вольт. Делитель делит и на микроконтроллер подается допустим 5 вольт. А как снятое значение с ножки увеличивается до 15? Да, я читал Ваши объяснения в уроке про биты и шаги измерения. Но так и не смог пристроить объяснения к своему вопросу. Хотя получается что надо снятое значение умножить на 3.

Объясните, пожалуйста. Желательно с куском кода, обрабатывающем эту операцию. На делитель напряжения подается в,с него снимается пропорциональное входному напряжение. Допустим при номиналах 1кОм,Ом, если на входе 12вольт, то на выходе примерно 3. При подаче 15в, на выходе будет почти 5 вольт. А это уже напряжение которое можно подать на АЦП.

Думаю, все понятно? Но я ведь спросил о том, как эти самые 3. Какой участок кода за это отвечает? Просто умножайте коэффицент делителя напряжения на значение полученное АЦП. Если я Вас правильно понял. У меня еще вопрос. Не могу понять в чем дело. Схему проверил. А вот по свойствам не знаю. Атмга — 8 МГц.

Кристалл так же. Питание везде 5v. LCD не трогал. Переменный — LOG и 10 кОм. Необходимо настроить среду разработки. Добрый день! Сверьте регистры микроконтроллеров, и расположение выводов. Тогда все станет понятно Если нет, пишите.

В AVR studio. Или это можно как то включить? Объявите переменную i до начала исполняемого кода прошивки. То есть в самом начале функции или программы. Добрый день, помогите пожалуйста воплотить такое же, но в алгоритм билдере имеется пласа с атмега8 и дисплейчик. Аналоговые порты могут работать в режиме оратного ЦА преобразования? Такого в составе AtMega8 нет.

Ваш e-mail не будет опубликован. Урок 8. Урок 4. Тактирование микроконтроллера. Похожие статьи Библиотека для работы с LCD. AVR для начинающих. Урок 9. Аналоговый компаратор. Урок Урок 6. STM32 для начинающих. Урок 7.

Добавить комментарий Отменить ответ Ваш e-mail не будет опубликован. Iconic One Theme Powered by WordPress.


roboforum.ru

Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. Делаем модульный многоканальный АЦП DIY или Сделай сам Из песочницы В различных проектах часто бывает необходимо следить за множеством параметров, которые представлены аналоговыми величинами. Конечно, часто хватает микроконтроллера, но иногда алгоритм обработки слишком сложен для него и требуется использование полноценного компьютера. К тому же на нём гораздо проще организовывать сохранение логов и красивую визуализацию данных.

Даже в таблице ATMega8 он говорит так: AVCC — это вывод напряжения питания для A /D преобразователя, порт C (), и АЦП (). Он должен быть.

Работа с АЦП (ATMega8, Atmel Studio 6.2)

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

АЦП микроконтроллеров AVR. Делаем цифровой вольтметр 0 — 25V

Прошу помощи у более опытных товарищей. В один мой проект необходимо внедрить Atmega8 — ШИМ Здраствуйте! Использую МК Atmega8. Частота 1МГц.

Re: пассики для проигрывателей винила

Урок 5. Работа с АЦП

Попробуем сделать датчик освещености. В комбинации с модулем RTC такой датчик может управлять освещением и подсветкой в системах типа: «умный дом». Датчик будет на фоторезисторе, сопротивление которого обратно пропорционально уровню освещености. Фоторезистор будет подключаться по схеме делителя напряжения , где в верхнее плечо будет установлен постоянный резистор 10K, а в нижнее сам фоторезистор. Нулевая точка будет поключена к пину ADC0 микроконтроллера. По такой же схеме можно подключать терморезистор или клавиатурную сборку на тактовых кнопках, где к каждой кнопке будет подключен резистор с каким-то своим индивидуальным значенем.

АЦП микроконтроллеров AVR. Делаем цифровой вольтметр 0 — 25V

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

Микроконтроллер используем Atmega8, с 10 битным АЦП. Это значит что диапазон 10В будет разделен на значений. 10В/=0.

Работа АЦП микроконтроллера AVR Atmega8

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

ШИМ и АЦП в Atmega8

ВИДЕО ПО ТЕМЕ: Аналоговый компаратор, прерывания по АЦП в AVR

Решил собрать вольтметр. Схема простая — делитель напряжения на резисторах. Приснятии показаний с делителя наблюдается сдедущая картина: напряжение на входе постоянное мультметр вроде не врет, показания не скачут , при преобразовании в цифру и вывод на экран, напряжение начинает «скакать» на младших разрядах. Как избавиться? Мультиметр усредняет побольше, а у вас всего по двум значениям усредняется.

Расмотрим настройку аналого-цифрового преобразователя на примере микроконтроллера Atmega8. Всю подробную информацию можно посмотреть в документации на микроконтроллер.

ATMega8: зачем подключаться VCC и AVCC?

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

10-битное значение АЦП для измерения напряжения

Народ пишет и в личку, и в комменты, некоторые даже звонят. Не знаю, может народ не понимает английского для прочтения и изучения даташитов, но книга А. Управляется он в ATmega8 всего двумя регистрами.


авр — ATMega8: зачем нужно связывать VCC и AVCC?

спросил

Изменено 2 года, 5 месяцев назад

Просмотрено 37 тысяч раз

\$\начало группы\$

Я часто читаю, что рекомендуется подключать VCC к AVCC. Даже в даташите на ATMega8 написано так:

AVCC — вывод напряжения питания для аналого-цифрового преобразователя, порт C (3. .0), и АЦП (7..6). Он должен быть внешне подключен к VCC, даже если АЦП не используется. Если используется АЦП, его следует подключить к VCC. через фильтр нижних частот. Обратите внимание, что порт C (5..4) использует цифровое питание. напряжение, Вкз.

Но нигде не могу найти объяснение почему они должны быть подключены. Простая схема мигания светодиода работает без подключения VCC и AVCC.

Мне просто нужно принять это или есть веская причина?

  • авр
  • атмега
  • базовый

\$\конечная группа\$

3

\$\начало группы\$

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

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

Разработчики Atmel решили, что наличие отдельных аналоговых VCC и заземления — это лучший способ обеспечить относительно бесшумную аналоговую секцию, позволяя пользователям добавлять фильтрацию и разделение цифровых и аналоговых плоскостей даже внутри ATmega. Это не только ATMega8, на самом деле все ATMega и даже некоторые ATTiny имеют этот дизайн.

\$\конечная группа\$

1

\$\начало группы\$

Молодец, что спросил причину!

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

Простые проекты «мигалки» не предъявляют требований к шуму и точности.

Теперь, если вы имеете в виду, должны ли они быть подключены к одному и тому же НАПРЯЖЕНИЮ, ответ — да в пределах +/- 0,3 В от VCC

Из полного описания ATMega8:

«АЦП имеет отдельный вывод аналогового напряжения питания, AVCC. AVCC не должен отличаться от VCC более чем на ±0,3 В». и «AVCC — вывод напряжения питания для аналого-цифрового преобразователя»

Резюме: AVCC и VCC должны иметь одинаковое напряжение (в пределах +/- 0,3 В), и он обозначен как отдельный контакт, чтобы позволить разработчику размещать дополнительные фильтры на этом входе, чтобы исключить шум из чувствительного A. /D преобразователь часть микросхемы.

Надеюсь, это поможет!

\$\конечная группа\$

\$\начало группы\$

Часто на цифровых контактах питания и заземления появляются небольшие помехи. Трудно устранить все эти шумы, когда цифровая схема переключает значительное количество тока, а шум источника питания 150 мВ или около того вряд ли повлияет на схему, питаемую от цифровых выводов питания. Однако наличие шума 150 мВ на аналоговых выводах питания сделало бы очень трудным или невозможным достижение аналоговой схемой точности в доли процента. Тот факт, что аналоговые контакты разделены, означает, что можно получить точные показания, даже если в цифровом источнике питания есть шум 150 мВ, при условии, что цифровой источник не колеблется более чем на 300 мВ, а аналоговый источник находится где-то в пределах 300 мВ от обоих крайних значений диапазона цифрового питания. Устранение 99% шума от источника питания, который питает только аналоговый вывод питания, и обеспечение того, чтобы напряжение источника было близко к цифровому напряжению питания, часто намного проще, чем пытаться устранить все шумы от цифрового питания.

\$\конечная группа\$

\$\начало группы\$

Просто чтобы добавить еще одну причину, по которой AVCC следует подключать даже в простых проектах.

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

Я только что столкнулся с этой проблемой в одном из моих «быстрых и грязных» хакерских проектов с использованием ATmega88P.

После подключения AVCC напрямую к VCC проблема с тем, что БПК не сбрасывал сброс, была решена. Так как я не использую никакую другую аналоговую периферию в своем проекте, я не стал заморачиваться с правильной развязкой. Это решение найдено в одной из тем форума avrfreaks после долгих поисков. См.: http://www.avrfreaks.net/comment/349747#comment-349747

\$\конечная группа\$

\$\начало группы\$

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

\$\конечная группа\$

\$\начало группы\$

Я полагаю, что некоторые контакты, включая PORTC:0-3, на самом деле питаются от Avcc, и если вы не подключите Avcc, эти контакты не будут работать.

\$\конечная группа\$

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

3а. ИСПОЛЬЗОВАНИЕ АЦП — AVR ASM ВВЕДЕНИЕ

РУКОВОДСТВО ДЛЯ ДЕБИЛОВ ПО ADC v2.4


от [email protected]
ОГЛАВЛЕНИЕ:
  • ИЗМЕРЕНИЕ СОПРОТИВЛЕНИЯ С АЦП
  • МЕТОД ОЖИДАНИЯ ПРЕОБРАЗОВАНИЯ
  • РЕЖИМ АВТОНОМНОЙ РАБОТЫ
  • ЛЕВЫЙ РЕГУЛИРУЕМЫЙ РЕЖИМ ВЫХОДА
  • МЕТОД ПРЕРЫВАНИЯ используется для преобразования аналогового сигнала в цифровой
  • 9000 цифровой. Он делает это, измеряя напряжение на своем входном контакте. Они не только могут преобразовывать аналоговый сигнал, такой как музыка, в цифровой формат, но их также можно использовать для измерения сопротивления.

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

    Для этого учебника мы используем AVR ATtiny13 из-за его простоты и небольшого количества контактов. Этот чип имеет один АЦП, который можно использовать для считывания до четырех входов. ATtiny13 работает на частоте 1,2 МГц (генератор 9,6 МГц, разделенный на 8) с 1 КБ ОЗУ. Примеры программ должны работать на ATtiny 13, ATtiny25, ATtiny45 или ATtiny85. Схемы и код должны легко адаптироваться к большинству любых чипов AVR Core.

    Выводы микросхемы ATtiny13:

     АТТИНИ13
    .-----.
    ADC0/PB5 --|1 A 8|-- Vcc
    ADC3/PB3 ->|2 T 7|-- PB2/ADC1
    АЦП2/PB4 --|3 N 6|-- PB1
    Земля --|4 Y 5|-->PB0
    `-----'
     

    Из схемы видно, что входы АЦП находятся на контактах 1, 7, 2 и 3 или Порт B5, Порт B2, Порт B3 и Порт B4. Мы будем использовать ADC3/PortB3 (вывод 2) для нашего входа и порт B0 (вывод 5) для вывода.

    ГЛАВА 1: ИЗМЕРЕНИЕ СОПРОТИВЛЕНИЯ С ПОМОЩЬЮ АЦП:

    Если мы подключим резистор между входным контактом АЦП и землей, и если внутренний резистор активен, мы получаем следующую схему:

     Вкк
                           | |
                           | Z ВНУТРЕННИЙ
                           | Z ПОДТЯГИВАНИЕ
                           | Z РЕЗИСТОР
                           | |
             PIN-код АЦП3 |
                 +-------------+-->[АЦП]
                 |
                 Я |
       РЕЗИСТОР Z | (ATTINY13)
                 Я |
                 |
                ЗЕМЛЯ
     

    Два резистора образуют делитель напряжения, и напряжение на входном контакте будет зависеть от на номинал нашего переменного резистора:

     3 В постоянного тока
                     |
                     Z ВНУТРЕННИЙ
                     Z РЕЗИСТОР
                     Z
                     |
                     +---------> 0-3VDC К АЦП
                     |
       ПЕРЕМЕННАЯ Z |
       РЕЗИСТОР Z<--' (ТИПИЧНЫЙ ДЕЛИТЕЛЬ НАПРЯЖЕНИЯ)
                 Z
                 |
               ЗЕМЛЯ
     

    Схема, которую мы используем, приведена ниже. Мы подключаем светочувствительный резистор (LDR) между контактом 2 (PortB3) и землей. LDR изменяет свое сопротивление в зависимости от того, сколько света попадает на устройство. LDR также известны как ячейки с дисульфидом кадмия (CDS). Я вытащил один из автоматического ночника, который купил в долларовом магазине. Если у вас нет LDR, вы можете заменить переменный резистор (потенциометр).

    Для выхода подключите небольшой динамик на контакте 5 (PortB0) к земле. Если вы используете более 3 вольт, установите резистор 100-220 Ом между динамиком и землей:

    3 В постоянного тока
    |
    АТТИНИ13 |
    .-----. |
    --|1 А 8|--'
    .---------|2 Т 7|--
    | --|3 Н 6|--
    | .--|4 Y 5|---[]< ДИНАМИК
    | | `-----' |
    LDR или Z | |
    ПЕРЕМЕННАЯ Z<-. | |
    РЕЗИСТОР Z | | |
    | | |
    +---+-------------+ ЗЕМЛЯ
     

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

    Ниже представлена ​​блок-схема АЦП в ATtiny13. Мультиплексор (MUX) выбирает один из четырех входов для подачи на АЦП. Прескейлер определяет скорость преобразования. Выходные данные имеют разрядность десять бит, поэтому младшие восемь бит помещаются в регистр ADCL; а регистр ADCH удерживает оставшиеся старшие биты в своем младшем конце:

    .-------. .-----.
    | ВВОД | | АЦП |=====>[------98] АДКН
    АЦП0 -->| МУЛЬТИПЛЕКС |===>| | [76543210]АДКЛ
    АЦП1 -->| | | |
    АЦП2 -->| | | |<-- ТАЙМЕР-ПРЕСКАЛЕР
    АЦП3 -->| | `-----'
    | |<------------- ВХОД-СЕЛЕКТОР
    `-------'
     

    ГЛАВА 2: ЖДИТЕ ПРЕОБРАЗОВАНИЯ МЕТОД:

    Наша первая программа указана ниже. Объяснение следует за списком. Наша стратегия состоит в том, чтобы начать аналого-цифровое преобразование на ADC3, затем опросите флаг, который сообщает нам, когда преобразование завершено. Затем мы производим звук в динамике и делаем паузу на некоторое время. это определяется значением напряжения/сопротивления, которое было измерено. Результатом является изменение частоты звука на основе нашего ввода от LDR:

     ;----------------------------------------------------;
    ; БАЗОВЫЙ ТЕРМЕННЫЙ ЭФИРНЫЙ ТЕЛЕФОН;
    ; ИГРАЕТ НОТЫ В СООТВЕТСТВИИ С СВЕТОМ;
    ; ВЕРСИЯ ATTINY13, RETRODAN@GMAIL. COM;
    ;-----------------------------------------------------;
    .include "TN13DEF.INC" ;ОПРЕДЕЛЕНИЯ AVR ATTINY13
    .DEF А = R16
    .DEF АХ = R17
    .DEF B = R18
    .DEF C = R20
    .ОРГ $0000
     
    СБРОС: SBI PORTB,3 ;ВКЛЮЧИТЬ ПОДТЯГИВАЮЩИЙ РЕЗИСТОР
    SBI DDRB,0 ;УСТАНОВИТЬ PORTB0 ДЛЯ ВЫВОДА НА ДИНАМИК
    RLOOP:
    LDI A,0b1100_0011 ;ВКЛЮЧИТЬ, НАЧАТЬ ПРЕОБРАЗОВАНИЕ И УСТАНОВИТЬ ПРЕДСКАЛЕР
    ВНЕ ADCSRA,A
    LDI A,0b0000_0011 ;ВЫБЕРИТЕ ВХОД АЦП #3, PORTB 3
    ВЫХОД ADMUX,A
    ПОДОЖДИТЕ: В A,ADCSRA ;ПРОЧИТАЙТЕ СТАТУС
    ANDI A,0b0001_0000 ;ПРОВЕРИТЬ ФЛАГ (1<
     

    Сначала мы говорим ассемблеру загрузить определения используемого нами чипа. Операторы .DEF — это наши собственные определения используемых нами регистров:

     .include "TN13DEF.INC" ;ОПРЕДЕЛЕНИЯ AVR ATTINY13
    .DEF А = R16
    .DEF АХ = R17
    .DEF B = R18
    .DEF C = R20
     

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

     . ORG $0000
     

    Мы используем PortB3 (ADC3) в качестве входа. Ранее мы отключили функцию сброса чипа этого вывода. Теперь пишем в него единицу, чтобы активировать его подтягивающий резистор. Мы также устанавливаем бит в регистре направления данных для порта B (DDRB), который мы будем использовать. как вывод на наш динамик:

     СБРОС: SBI PORTB,5 ;ВКЛЮЧИТЬ ПОДТЯГИВАЮЩИЙ РЕЗИСТОР
    SBI DDRB,0 ;УСТАНОВИТЬ PORTB0 ДЛЯ ВЫВОДА НА ДИНАМИК
     

    Далее мы настраиваем АЦП с помощью регистра управления и состояния АЦП (ADCSRA). Старший бит (ADEN) включает АЦП. И 7-й бит говорит АЦП начать преобразование. Младшие три бита этого регистра выбирают наш предварительный делитель/делитель. В техническом описании сказано, что АЦП лучше всего работает на частоте от 50 до 200 кГц. Наша основная тактовая частота составляет 1,2 МГц, если мы разделим ее на восемь, это даст нам скорость АЦП 150 кГц:

     РЛООП:
    LDI A,0b1100_0011 ;ВКЛЮЧИТЬ, НАЧАТЬ ПРЕОБРАЗОВАНИЕ И УСТАНОВИТЬ ПРЕДСКАЛЕР
    ВНЕ ADCSRA,A
     

    Мы выбираем вход АЦП №3, установив младшие два бита регистра ADMUX на три. Обратите внимание, что вы должны сделать это после того, как АЦП был включен предыдущими командами:

     LDI A,0b0000_0011 ;ВЫБЕРИТЕ ВХОД АЦП #3, PORTB 3
    ВЫХОД ADMUX,A
     

    Теперь ждем завершения преобразования, наблюдая за флагом ADC (ADIF). Когда он установлен в единицу, преобразование выполняется:

     ПОДОЖДИТЕ: В A,ADCSRA ;ПРОЧИТАЙТЕ СТАТУС
    ANDI A,0b0001_0000 ;ПРОВЕРИТЬ ФЛАГ (1<
     

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

     IN A,ADCL ;НЕОБХОДИМО ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    IN AH,ADCH ; ТРЕБУЕТСЯ, ХОТЯ НЕ ИСПОЛЬЗУЕТСЯ
     

    Подпрограмма PAUSE ожидает отрезок времени, основанный на самых младших восьми битах нашего Преобразование АЦП, которое мы читаем в регистр «А».

     RCALL PAUSE ;ЗАДЕРЖКА ПЕРЕМЕННОГО ВРЕМЕНИ НА ОСНОВЕ A
     

    Процедура SOUND просто переключает выходной контакт, который мы подключили к нашему динамику на контакте 0 порта B:

     RCALL SOUND ;ИЗВЕСТИ ЗВУК НА ДИНАМИКЕ
     

    После обновления выходного сигнала нашего динамика и создания звука мы зацикливаемся и запускаем процесс заново:

     RJMP RLOOP
     

    Процедура SOUND читает в PortB, затем переключает самый младший бит, PortB,0 контакт, к которому подключен наш динамик, результатом будет щелчок на нашем динамике. Мы делаем щелчки достаточно быстро, и мы можем услышать результат в виде тона, исходящего из динамика:

     ЗВУК: LDI C,1
    В Б, ПОРТБ
    МУН Б, С
    ВЫХОДНОЙ ПОРТB
    РЕТ
     

    Процедура PAUSE принимает значение нашего преобразования (ADCL), которое было считано в регистр «A», и начинает вычитать единицу, пока не достигнет нуля, а затем возвращается. Результатом является пауза переменной длины, которая управляется значением, хранящимся в регистре «А». это вызовет изменение частоты нашего звукового выхода.

     ПАУЗА: ДЕК А
    БРНЕ ПАУЗА
    РЕТ
     

    Если вы запрограммировали свой чип и подключите схему, как описано. Вы можете махнуть рукой над LDR, и динамик издаст звук напоминает научно-фантастические фильмы 1950-е годы.

    При изменении количества света, попадающего на LDR, сопротивление LDR будет меняться. вызывая сдвиг напряжения на нашем входе в АЦП. Это изменение напряжения будет преобразовано в цифровое значение с помощью АЦП. Мы считываем это значение в регистр «А» и передаем различную частоту на наш выходной динамик. изменяя продолжительность времени, которое мы проводим в нашей программе PAUSE. В результате получается музыкальный инструмент, которым мы управляем, взмахивая рукой над цепью.

    ГЛАВА 3: АВТОНОМНЫЙ РЕЖИМ:

    При использовании метода Free-Running АЦП устанавливается на самозапуск после каждого преобразования. Мы не ждем завершения преобразования (и установки флага ADIF). Читая выходные регистры АЦП в автономном режиме, мы можем получить значение конверсии из его последнего чтения.

    На этот раз мы включаем АЦП с помощью бита включения АЦП в регистре управления и состояния АЦП (ADCSRA). Мы сообщаем системе, что хотим автоматического обновления, устанавливая бит ADATE, и мы начинаем процесс преобразования, устанавливая бит ADCS. Нижние два бита задают для нашего предварительного масштабатора/делителя значение деления на восемь:

     LDI A,0b1110_0011 ;[ADEN,ADSC,ADATE,ADIF,_,ADIE,ADPS2,ADPS1,ADPS0]
    OUT ADCSRA,A ;НАЧАТЬ АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ
     

    Мы можем исключить те части нашей программы, которые ожидают установки флага ADIF. Читаем выходные регистры ADCL и ADCH. Помните, что мы должны прочитать оба, и что ADCL должен быть прочитан первым:

     РЛООП:
    IN A,ADCL; ДОЛЖЕН ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    IN AH,ADCH ; ТРЕБУЕТСЯ, ХОТЯ НЕ ИСПОЛЬЗУЕТСЯ
     

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

     ЗВУК: LDI C,1
    В Б, ПОРТБ
    МУН Б, С
    ВЫХОДНОЙ ПОРТB,B
    РЕТ
     

    Согласно спецификации, мы можем переключать выходы регистра PortB, написав единицу на соответствующий PIN-код. Таким образом, всю подпрограмму SOUND можно заменить одной командой:

     SBI PINB,0 ;ВКЛЮЧИТЬ ДИНАМИК НА PORTB0
     

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

     .INCLUDE "TN13DEF.INC" ;ОПРЕДЕЛЕНИЯ AVR ATTINY13
    .DEF А = R16
    .DEF АХ = R17
    .ОРГ $0000
    СБРОС: ;ОТРЕГУЛИРУЙТЕ ПРЕСКАЛЕР НА 50–200 КГц, СИСТЕМНЫЕ ЧАСЫ СОСТАВЛЯЮТ 1,2 МГц.
    LDI A,0b1110_0011 ;[ADEN,ADSC,ADATE,ADIF,_,ADIE,ADPS2,ADPS1,ADPS0]
    OUT ADCSRA,A ;НАЧАТЬ АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ
    LDI A,0b0000_0011 ;ВЫБЕРИТЕ АЦП №3 (ПОРТ B 3)
    ВЫХОД ADMUX,A
    SBI PORTB,PORTB3 ;ВКЛЮЧИТЬ ПОДТЯГИВАЮЩИЙ РЕЗИСТОР
    SBI DDRB,0 ;УСТАНОВИТЬ PORTB0 ДЛЯ ВЫВОДА НА ДИНАМИК
    RLOOP:
    IN A,ADCL; ДОЛЖЕН ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    IN AH,ADCH ; ТРЕБУЕТСЯ, ХОТЯ НЕ ИСПОЛЬЗУЕТСЯ
    RCALL PAUSE; ПЕРЕМЕННАЯ ЗАДЕРЖКА ВРЕМЕНИ НА ОСНОВЕ
    SBI PINB,0 ;ВКЛЮЧИТЬ ДИНАМИК НА ПОРТУB0
    RJMP RLOOP
    ПАУЗА: ДЕКАБРЬ А
    БРНЕ ПАУЗА
    РЕТ
     

    ГЛАВА 4: ЛЕВЫЙ РЕГУЛИРУЕМЫЙ РЕЖИМ ВЫВОДА:

    В этой версии мы используем автономный режим, но система автоматически сдвигает наш результат влево в регистр ADCH. Чтобы перевести систему в режим левого сдвига, мы устанавливаем бит ADLAR регистра ADMUX в единицу. Примечание: содержимое регистра ADMUX вступает в силу только ПОСЛЕ того, как АЦП был активирован битом ADEN регистра ADCSRA, поэтому мы размещаем эту часть нашего кода ПОСЛЕ установки регистра ADCSRA:

     LDI A,0b1110_0011 ;[ADEN,ADSC,ADATE,ADIF,-,ADIE,ADPS2,ADPS1,ADPS0]
    OUT ADCSRA,A ;НАЧАТЬ АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ
    LDI A,0b0010_0011 ;УСТАНОВИТЕ РЕЖИМ СМЕЩЕНИЯ ВЛЕВО И ВЫБЕРИТЕ ВХОД АЦП №3
    ВЫХОД ADMUX,A
     

    В наших предыдущих версиях программы десятибитный результат сдвигался вправо в Регистр ADCL и два старших бита хранились в регистре ADCH, который мы никогда не использовали. На этот раз мы собираемся перенести результат в регистр ADCH и проигнорировать младшие два бита нашего десятибитного преобразования, которые хранятся в регистре ADCL.

     АДЧ: АДКЛ
    РАНЬШЕ: [-,-,-,-,-,-,9,8] [7,6,5,4,3,2,1,0]
    НА ЭТОТ РАЗ: [9,8,7,6,5,4,3,2] [1,0,-,-,-,-,-,-] <-- СМЕЩЕН ВЛЕВО
     

    Итак, как вы можете видеть ниже, мы читаем младший байт в A, затем игнорируем результат и загрузите старший байт в A, чтобы результат был старшими восемью битами нашего результата, игнорируя младшие два бита:

     IN A,ADCL; НЕОБХОДИМО ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    В А, АДЧ ;
     

    Результатом этих изменений является программа ниже:

     . INCLUDE "TN13DEF.INC" ;ОПРЕДЕЛЕНИЯ AVR ATTINY13
    .DEF А = R16
    .ОРГ $0000
    СБРОС: ;ОТРЕГУЛИРУЙТЕ ПРЕСКАЛЕР НА 50–200 КГц, СИСТЕМНЫЕ ЧАСЫ СОСТАВЛЯЮТ 1,2 МГц.
    LDI A,0b1110_0011 ;[ADEN,ADSC,ADATE,ADIF,-,ADIE,ADPS2,ADPS1,ADPS0]
    OUT ADCSRA,A ;НАЧАТЬ АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ
    LDI A,0b0010_0011 ;УСТАНОВИТЕ РЕЖИМ СМЕЩЕНИЯ ВЛЕВО И ВЫБЕРИТЕ ВХОД АЦП №3
    ВЫХОД ADMUX,A
    SBI PORTB,PORTB3 ;ВКЛЮЧИТЬ ПОДТЯГИВАЮЩИЙ РЕЗИСТОР
    SBI DDRB,0 ;УСТАНОВИТЬ PORTB0 ДЛЯ ВЫВОДА НА ДИНАМИК
    RLOOP:
    IN A,ADCL; ДОЛЖЕН ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    В А, АДЧ ;
    RCALL PAUSE; ПЕРЕМЕННАЯ ЗАДЕРЖКА ВРЕМЕНИ НА ОСНОВЕ
    SBI PINB,0 ;ВКЛЮЧИТЬ ДИНАМИК НА ПОРТУB0
    RJMP RLOOP
    ПАУЗА: ДЕКАБРЬ А
    БРНЕ ПАУЗА
    РЕТ
     

    ГЛАВА 5: МЕТОД ПРЕРЫВАНИЯ:

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

     RLOOP: RJMP RLOOP
     

    Когда прерывания разрешены командой SEI, система ищет в нижней части памяти . ORG $0000 таблицу переходов к различным прерываниям. Вектор перехода при включении/сбросе — это первый вектор с адресом .ORG $0000, который мы указываем на нашу основную программу.

     .ORG $0000
    СБРОС RJMP
     

    Если мы обратимся к техническому описанию, то обнаружим, что вектор прерывания для АЦП находится в $0009, поэтому мы помещаем здесь переход к нашей процедуре прерывания:

     .ORG $0009
    RJMP ANA_CONV
     

    И мы говорим системе разрешить прерывания с помощью команды Set Enable Interrupt SEI:

     SEI ;ГЛОБАЛЬНО ВКЛЮЧИТЬ ПРЕРЫВАНИЯ
     

    Теперь мы собираемся установить регистр состояния и управления АЦП так же, как и в прошлый раз, за ​​исключением мы собираемся также установить бит разрешения прерывания АЦП ADIE в единицу. Это означает, что бит ADEN разрешения АЦП установлен; установлен бит начала преобразования АЦП ADSC; установлен бит автоматического обновления ADATE; установлен бит ADIE разрешения прерывания от АЦП; и предварительный масштабатор/делитель настроен на деление на восемь:

     LDI A,0b1110_1011 ;[ADEN,ADSC,ADATE,ADIF,_,ADIE,ADPS2,ADPS1,ADPS0]
    OUT ADCSRA,A ;НАЧАТЬ АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ
     

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

     ANA_CONV:
    НАЖМИТЕ A ;СОХРАНИТЕ СОДЕРЖИМОЕ РЕГИСТРА "A" ДЛЯ ВОССТАНОВЛЕНИЯ
    НАЖМИТЕ AH ;СОХРАНИТЕ СОДЕРЖИМОЕ РЕГИСТРА "AH"
    IN A,SREG ;СОХРАНИТЕ СОСТОЯНИЕ СИСТЕМЫ ДЛЯ ВОССТАНОВЛЕНИЯ
    НАЖМИТЕ А
     

    В основе нашей программы прерывания мы считываем результаты преобразования АЦП с помощью чтение младшего байта ADCL, за которым следует старший байт ADCH. Затем мы вызываем процедуру PAUSE, после чего переключаем наш выходной бит, подключенный к нашему динамику:

     IN A,ADCL; НЕОБХОДИМО ПРОЧИТАТЬ ADCL ПЕРЕД ADCH
    IN AH,ADCH ; ТРЕБУЕТСЯ, ХОТЯ НЕ ИСПОЛЬЗУЕТСЯ
    RCALL PAUSE; ПЕРЕМЕННАЯ ЗАДЕРЖКА ВРЕМЕНИ НА ОСНОВЕ
    SBI PINB,0 ;ВКЛЮЧИТЬ ДИНАМИК НА ПОРТУB0
     

    После восстановления регистров путем извлечения их из стека, мы заканчиваем нашу процедуру прерывания командой возврата из прерывания RETI:

     POP A ;ВОССТАНОВЛЕНИЕ СОСТОЯНИЯ СИСТЕМЫ
    ВНЕШНИЙ СРЕГ, А
    POP AH ;ВОССТАНОВИТЬ РЕГИСТР "AH"
    POP A ;ВОССТАНОВИТЬ РЕГИСТР "A"
    РЕТИ
     

    После внесения этих изменений наша полная программа становится:

     .

    alexxlab

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

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