МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
ИНДИВИДУАЛЬНОЕ
ДОМАШНЕЕ ЗАДАНИЕ №4
по дисциплине «Микропроцессорные системы»
Тема: Работа с АЦП
Студентка гр. 7501 |
|
Кирьянова А.М |
Преподаватель |
|
Анисимов А.А. |
Санкт-Петербург
2020
Цель работы: написать на языке Assembler программу для работы с АЦП.
Используемые инструменты: отладочная плата ATtiny2313, интегрированная среда разработки AVR Atmel Studio 7.
Основные теоретические положения
Все микроконтроллеры семейства AtMega и некоторые из семейства Tiny имеют встроенный блок аналого-цифрового преобразования (АЦП). Он может использоваться для замены простого, но значительно менее функционального компаратора. Этот АЦП десятиразрядный и многоканальный (количество каналов может варьироваться от 4 до 16 в зависимости от модели микроконтроллера).
Модуль АЦП всего один, на его входе стоит аналоговый мультиплексор, подключающий этот вход к различным выводам МК, что позволяет проводить разделенные во времени измерения сразу нескольких независимых аналоговых величин. Входы мультиплексора могут работать как по отдельности (в несимметричном режиме, измеряя напряжение относительно земли), так и объединяться в пары (только для некоторых моделей микроконтроллеров), измеряя дифференциальное напряжение. Также опционально возможно усиление входного сигнала с фиксированным коэффициентом 10 или 100.
Встроенный АЦП представляет собой преобразователь последовательного приближения с устройством выборки-хранения и фиксированным числом тактов преобразования, равным 13 (14 для дифференциального измерения). Данный класс АЦП занимает промежуточное положение по быстродействию, стоимости и разрешающей способности между последовательно-параллельными и сигма-дельта АЦП и находит широкое применение в системах управления, контроля и цифровой обработки сигналов.
Для выполнения первого преобразования (при первоначальной настройке АЦП) требуется 25 тактов. Тактовая частота преобразования формируется с помощью делителя от опорной частоты микроконтроллера при помощи соответствующего управляющего регистра, рекомендованная частота преобразования – от 50 до 200 кГц, в этом диапазоне наиболее вероятно получение наиболее достоверного результата измерения. Модуль АЦП имеет разрешение в 10 бит, и, по заявлениям разработчиков, абсолютная погрешность не превышает двух младших значащих разрядов (погрешность не более 0,25 % шкалы измерения). Для достижения подобных результатов необходимо применение как аппаратных, так и программных способов повышения точности измерений, с которыми можно дополнительно ознакомиться в фирменной документации.
Также возможно два режима преобразования:
непрерывный (free-running mode), когда по завершении одного цикла преобразования сразу же следует другой;
одиночный (single), когда последовательность циклов регулируется вручную.
Первый способ не отличается высокой точностью измерений и целесообразен только при необходимости максимальной скорости преобразований.
Настройка АЦП
Регистры, задающие режим работы аналого-цифрового преобразователя.
ADMUX (ADC Multiplexer Selection Register) – регистр, определяющий текущий канал АЦП, источник опорного напряжения и режим хранения данных. В этом регистре нас больше всего интересуют биты, описанные далее.
REFS1:0 (Reference Selection Bits) – определяют источник опорного напряжения, относительно которого будет происходить преобразование. Опорное напряжение должно быть как можно более стабильным, без помех и колебаний по напряжению – от этого во многом зависит точность работы АЦП. Все возможные варианты приведены в табл.7.
Таблица 7 – Выбор источника опорного напряжения АЦП
REFS[1:0] |
Источник опорного напряжения |
00 |
Напряжение питания |
01 |
Внутренний ИОН на 1.1 В |
10 |
Внутренний ИОН на 2.2 В |
11 |
Внутренний ИОН на 4.3 В |
Внутренний источник опорного напряжения не очень точный и подходит только для нетребовательных приложений.
MUX4:0 (Analog Channel and Gain Selection Bits) – данные биты определяют текущий вход, с которого мы будем считывать аналоговый сигнал. Также с помощью этих битов выставляется коэффициент усиления при измерении в дифференциальном режиме. Возможные конфигурации для выбора текущего источника входного сигнала представлены в табл. 7.
Таблица 7 – Выбор текущего канала АЦП
MUX4..0 |
Номер канала |
00000 |
ADC0 |
00001 |
ADC1 |
00010 |
ADC2 |
00011 |
ADC3 |
00100 |
ADC4 |
00101 |
ADC5 |
00110 |
ADC6 |
00111 |
ADC7 |
Данные с АЦП записываются в регистровую пару ADCH:ADCL, откуда их можно считать для дальнейшей обработки. Причем здесь есть один важный момент. Регистровая пара 16 разрядная, а АЦП имеет разрядность 10 бит. В итоге лишь один регистр занят полностью, а второй занимают лишь оставшиеся два бита. Исходя из этого факта, выравнивание может производиться как по правому краю – старшие два бита в ADCH, а младшие в ADCL, так и по левому – старшие биты в ADCH, а два младших бита в ADCL:
[9][8][7][6][5][4][3][2]:[1][0][x][x][x][x][x][x]
[x][x][x][x][x][x][9][8]:[7][6][5][4][3][2][1][0]
Для чего хранение данных АЦП-преобразования организовано именно таким образом? Так как в двух младших битах чаще всего достаточно сложно получить значимые данные (скорее всего, мы получим там помехи), можно использовать выравнивание по правому краю и считывать данные преобразования только из одного регистра ADCH, экономя время и программный код. За выравнивание отвечает бит ADLAR. Записывая в него логический ноль, получаем выравнивание по правой границе, записываем единицу – по левой.
Рассмотрим подробнее управляющий регистр ADCSRA (ADC Control and Status Register A), отвечающий за работу АЦП:
ADEN (ADC Enable) – записывая единицу в этот бит, разрешаем использование АЦП.
ADIE (ADC Interrupt Enable) – разрешение прерывания по завершению цикла преобразования.
ADPS2:0 (ADC Prescaler Select Bits) – позволяет выбрать коэффициент делителя тактовых импульсов для установки частоты преобразований (в непрерывном режиме). Значение коэффициента делителя определяется в соответствии с табл. 7.
Таблица 7 – Выбор коэффициента деления
ADPS2 |
ADPS1 |
ADPS0 |
Коэффициент деления |
0 |
0 |
0 |
2 |
0 |
0 |
1 |
2 |
0 |
1 |
0 |
4 |
0 |
1 |
1 |
8 |
1 |
0 |
0 |
16 |
1 |
0 |
1 |
32 |
1 |
1 |
0 |
64 |
1 |
1 |
1 |
128 |
ADFR (ADC Free Running Select) – записывая единицу в этот бит, выбираем непрерывный режим преобразования.
ADSC (ADC Start Conversion) – записывая единицу в этот бит, мы начинаем очередной цикл преобразования в одиночном режиме работы (или первый цикл при непрерывном), который занимает 13 тактов (первый цикл – 25 тактов, здесь осуществляется первоначальная инициализация АЦП), при условии, что с помощью бита ADEN разрешено использование АЦП.
Код программы на языке Assembler:
.CSEG
.ORG 0x0000
RJMP RESET
.ORG 0x0009 // Задание адреса прерывания по окончании преобразования АЦП
RJMP ADC_complete
// Инициализация периферии
RESET:
LDI R16, RAMEND // Загрузка в регистр R16 адреса верхней границы ОЗУ
OUT SPL, R16
LDI R16, 1|(1<<4)
OUT DDRB, R16
LDI R16, (1<<ADLAR)|(1<<MUX0)|(1<<MUX1)
OUT ADMUX, R16 // Копирование из R16 регистр управления мультиплексором АЦП ADMUX
LDI R16, (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)
OUT ADCSRA, R16 // Копирование из R16 в регистр А управления и состояния АЦП ADCSRA
LDI R16, (1<<WGM00)|(1<<WGM01)|(1<<COM0A1)|(1<<COM0A0)
OUT TCCR0A, R16
LDI R16,(1<<CS01)
OUT TCCR0B, R16 // Установка делителя тактовой частоты таймера T0=8
SEI
// Основной цикл программы
MAIN:
// Конец основного цикла программы
RJMP MAIN
// Начало обработчика прерывания от АЦП
ADC_complete:
IN R16, ADCH
OUT OCR0A, R16
SBRS R16, 7
SBI PORTB, 4 // Установка 4-го бит PORTB
SBRC R16, 7
CBI PORTB, 4 // Сброс 4-го бит в регистре PORTB
RETI
Результаты работы программ:
Рисунок 1 – Работа с АЦП при отметке потенциометра 100%
Рисунок 2 – Работа с АЦП при отметке потенциометра 80%
Рисунок 3 – Работа с АЦП при отметке потенциометра 60%
Рисунок 4 – Работа с АЦП при отметке потенциометра 40%
Рисунок 5 – Работа с АЦП при отметке потенциометра 20%
Рисунок 5 – Работа с АЦП при отметке потенциометра 1%
Вывод
В ходе данной работы была смоделирована схема для работы с АЦП на основе микроконтроллеров ATtiny2313, для которого была написаны программы на языке Assembler, иллюстрирующая принцип работы АЦП в данном микроконтроллере. Процесс АЦП управлялся потенциометром, движение ручки которого изменяло яркость свечения светодиода.