Подписаться на получение новых статей на почту:

Шаг №32. Настраиваем АЦП для кнопок на AVR. Делитель напряжения

Всем привет. В прошлой статье мы с Вами подвели итог проделанной работы поконтроллеру сбору данных и спланировали работу дальше. Первым пунктом мы прописали подключение кнопок для коррекции времени. Для этого используем вывод АЦП и делитель напряжения. Один раз АЦП мы уже использовали, в статье №9 (Основа работы барьера на микроконтроллере AVR.). Перед подключением рассмотрим АЦП.

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

Модуль АЦП в AVR ATmega 8

АЦП обладает следующими характеристиками:

разрешающая способность. Обычно у ATmega это 2 в 10 степени, т.е. 1024 кодовые комбинации. Но не забываем что мы делаем проект на ATmega 8, у которого ADC4 и ADC5 – 8-битные. Эти ножки мы уже использовали для передачи информации по интерфейсу TWI.  Я подключил к ADC0.

Следующая характеристика –это абсолютная погрешность, которая допускается ±2МЗР, где МЗР- это младшие значащие разряды, т.е. минимальный размер напряжения, который может преобразовать АЦП. Ниже в программе мы непременно вернемся к этим характеристикам.

И две последние - интегральная нелинейность ±0.5МЗР и быстродействие до 15 тыс. выборок в секунду.

АЦП может работать в двух режимах:
— одиночное преобразование, запускается пользователем;
 — непрерывное преобразование, использовали в статье № 9, при построении барьера.

Мы будем использовать 1-й вариант. Для управления модулем АЦП используется 3 регистра, для atmega 8 (для других моделей смотрим даташит):

- ADCSR – регистр состояния и управления;
— ADMUX – регистр управления мультиплексором;
— SFIOR – регистр специальных функций.

Рассмотрим каждый. Начнем с 1-го. Изображен на рисунке ниже.

Регистр управления ADCSR АЦП AVR

В программе настройка регистра управления будет выглядеть следующим образом: включаем АЦП, режим одиночного преобразования, разрешаем прерывание, частота преобразования Fcpu/128.
ADCSR = (1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

Последние два разряда регистра – это выбор коэффициента пред делителя, рис. нижеПред делитель АЦП ADPS для AVR

Запуск каждого преобразования мы будем осуществлять установкой разряда ADSC, как говорится вручную ( ADCSRA |= (1<<ADSC) ). Цикл преобразования начинается по первому нарастающему фронту тактового сигнала, после установки ADSC. Если используется запуск по прерыванию, то цикл начинается после установки флага прерывания, при котором осуществляется сброс пред делителя модуля АЦП. Чем обеспечивается фиксированная задержка между генерацией запроса и началом цикла преобразования. Длительность цикла составляет 13 (не симметричный вход) и 13 или 14 тактов(дифференциальный). В нашем «камне» только несимметричный вход. Выборка и запоминание входного сигнала в течении 1,5 и 2,5 тактов соответственно. По окончанию разряд ADSC сбрасывается в 0 при одиночном преобразовании. Затем устанавливается флаг на прерывание ADIF и генерируется запрос на прерывание . Данный флаг сбрасывается аппаратно при запуске подпрограммы прерывания или программно. Завершение прерывания осуществляется установкой 1 в разряд ADIE (при I регистра SREG).

Идем далее. Переходим к регистру управления мультиплексором ADMUX. Рисунок ниже.

Регистр управления мультиплексором ADMUX для AVR

Ни рисунке модуля (вверху) АЦП видно, что все выводы АЦП подключены к мультиплексору. Мультиплексор в свою очередь является устройством, который подключает несколько входов к одному выходу, где вход/входы выбирается комбинацией управляющих сигналов. Получается своего рода коммутатор.

Выводы микроконтроллера подключенные к АЦП, определяются состоянием разрядов MUX3…MUX0 регистра ADMUX. Ниже таблица управление входным мультиплексором в ATmega 8.

Управление мультиплексором АЦП MUX для AVR

С выводами определились выберем источник опорного напряжения (ИОН), с которым будет сравниваться входное напряжение на АЦП и на оснавании этой разницы формируется соответствующий цифровой сигнал на выходе. А напряжение равное опорному кодируется как цифровой 0.  Источник выбирается разрядами REFS1:REFS0 регистра ADMUX. (на рис. ниже)

Источник опорного напряжения АЦП REFS для AVR

И последний разряд остался в этом регистре это ADLAR – выравнивание результата преобразования. Как получается результат: по завершению преобразования, при установке флага ADIF, результат сохраняется в регистре данных АЦП. Т.к. АЦП 10 — разрядный, то он располагается в двух регистрах ADCH:ADCL, доступных только для чтения. По умолчанию результат преобразования выравнивается вправо, т.е. когда ADLAR =0.  В документации четко сказано, что для получения результата преобразования сначала необходимо прочитать регистр ADCL, а потом только ADCH.!!!! НО если результат преобразования выровнять влево и достаточно точности 8-разрядного значения, то можно прочитать только содержимое регистра ADCH. Чем мы и воспользуемся.

В программе, настройка регистра управления, будет выглядеть следующим образом: ИОН – напряжение питания AVcc, выравниваем результат преобразования влево, к АЦП подключаем нулевой канал ADC0.

ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);

И последний регистр SFIOR – регистр специальных назначений. Рис. ниже.

SFIOR регистр специальных функций АЦП для AVR

Как видите в данной модели контроллера, всего один разряд ADCHM. Который отвечает за увеличение частоты выборки. Т.е. когда нужна частота более 200 кГц и точность преобразования менее 10 разрядов. Но при этом увеличивается потребление микроконтроллера. Мы данным регистром пользоваться не будем.

Итак разберем как преобразовываются значения. Для этого существует формула для несимметричных выходов   

 ADC= 1024*Vin/Vref.

В нашем случае мы обойдемся 8-разрядной точностью:

ADC= 255*Vin/Vref.

Где
Vin –значение входного напряжения
Vref – величина опорного напряжения.

Идем дальше. Нам необходимо что бы при нажатии определенной кнопки ей соответствовало свое напряжение. Для этого кнопки подключим к делителю напряжения (Рис. ниже)

Делитель напряжения для кнопок на АЦП

Где R6, R5 –делитель. R3 – подтягиваем ногу к земле, через большое сопротивление , для предотвращения появления на нем наводок, помех и др. Как говорится что б ножка не “болталась в воздухе”. R4 – токоограничивающий резистор. R3, C1 – низкочастотный фильтр для защиты от дребезга кнопок и помех, что является рекомендацией в документации .

 

В делителе для простоты расчета берем сопротивление одного номинала – 2 кОм. Рассчитаем значение входного напряжения в зависимости от нажатой кнопки по формуле для верхней кнопки:

S1 = 5В * (4/(2+2))= 5 В.

— для нижней:

S2 = 5В *(2 /(2+2))=2,5 В;

Далее наши значения входного напряжения подставляем в формулу для расчета  ADC:

ADCs1= 255 * 5 В/5 В = 255.
ADCs2= 255 * 2,5 В/5 В = 127,5.

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

Подключение внешнего питания к АЦП

Т.к. АЦП это точный измеритель напряжения, то для точности ставят фильтры от помех в питающей цепи. Ставят дроссель примерно 10 мкГн между AVcc и Vcc, конденсатор дополнительно успокоит питание на АЦП. Также не лишне будет ставить керамический конденсатор, примерно 100 нФ между Vcc и GND, которій сгладит импульсные помехи в шине питания вызванные работой цифровых схем.

Также для более точных измерений проводят разделение земли на цифровую и аналоговую, и соединяют их в одной точке. На AVсс подается напряжение через фильтрующий дроссель. Дополнительно для повышения точности вход AREF, т.к. мы его не используем  (для подключения источника внутреннего напряжения, относительно чего будет считать АЦП), рекомендуется вешать конденсатор, что немного улучшит качество опорного напряжения АЦП . Ну и напоследок можно повесить  конденсатор на 47мКФ в цепи питания, который сгладит более глубокие броски напряжения.

Для двух кнопок нам не надо точные измерения, поэтому напрямую подключаем AVcc к внешнему питанию, а AGND садим на цифровую землю.

Хочется отметить что в микроконтроллере ATmega 8 есть аппаратный баг. Vcc и AVcc связаны между собой внутри кристалла. Сопротивление между ними составляет примерно 5 Ом. Но это не значит, что нет необходимости подключать  AVcc.

В этой статье мы кратенько рассмотрели настройки АЦП. Как его применить под кнопки. Подключение питания и настройка источника опорного напряжения для АЦП.

В следующей статье подключим кнопки, напишем код, протестируем в протеусе и в железе. Одновременно порт АЦП, будет в качестве интерфейса TWI и обработчик кнопок. На этом все. Всем пока.

Просмотрено 5595 раз.

Я на Google+

Шаг №32. Настраиваем АЦП для кнопок на AVR. Делитель напряжения: Один комментарий

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

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting