МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
Отчет
по Лабораторной работе №4
Тема: Программирование АЦП
Студент гр. 7503 _____________________ Марсаль Г. О.
Преподаватель _____________________ Анисимов А. А.
Санкт-Петербург
2020
Цель работы: Исследование принципов работы АЦП микроконтроллера ATtiny15. Получение навыков программирования АЦП на языке Assembler, пользования средами разработки AVR Atmel Studio 7 и Proteus 8.
Используемые инструменты: Интегрированная среда разработки AVR Atmel Studio 7, САПР Proteus 8; методические указания к выполнению работы.
Теоретическое обоснование темы работы
Все микроконтроллеры семейства AtMega и некоторые из семейства Tiny (как, например, микроконтроллер AtTiny15) имеют встроенный блок аналого-цифрового преобразования (далее в тексте – АЦП). Он может использоваться для замены простого, но значительно менее функционального компаратора. Этот АЦП десятиразрядный и многоканальный (количество каналов может варьироваться от 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.1
Таблица 7.1. Выбор источника опорного напряжения АЦП
REFS[1:0] |
Источник опорного напряжения |
00 |
Напряжение питания |
01 |
Внутренний ИОН на 1.1В |
10 |
Внутренний ИОН на 2.2В |
11 |
Внутренний ИОН на 4.3В |
Внутренний источник опорного напряжения не очень точный и подходит только для нетребовательных приложений.
MUX4:0 (Analog Channel and Gain Selection Bits) – данные биты определяют текущий вход, с которого мы будем считывать аналоговый сигнал. Также с помощью этих битов выставляется коэффициент усиления при измерении в дифференциальном режиме. Возможные конфигурации для выбора текущего источника входного сигнала представлены в табл. 7.2.
Таблица 7.1. Выбор каналов мультиплексора
Данные с АЦП записываются в регистровую пару 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. Записывая в него логический ноль, получаем выравнивание по правой границе, записываем единицу – по левой.
Рассмотрим подробнее управляющий регистр ADCSR (ADC Control and Status Register), отвечающий за работу АЦП:
ADEN (ADC Enable) – записывая единицу в этот бит, разрешаем использование АЦП.
ADIE (ADC Interrupt Enable) – разрешение прерывания по завершению цикла преобразования.
ADPS2:0 (ADC Prescaler Select Bits) – позволяет выбрать коэффициент делителя тактовых импульсов для установки частоты преобразований (в непрерывном режиме). Значение коэффициента делителя определяется в соответствии с табл. 7.3.
Таблица 7.3. Выбор коэффициента деления
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 разрешено использование АЦП.
ОБРАБОТКА РЕЗУЛЬТАТОВ РАБОТЫ
Код написанной программы для МК AtTiny15 на языке Assembler:
; ----- Начало таблицы прерываний -----
.ORG 0x0000
RJMP RESET
.ORG 0x0005 ; Адрес прерывания по переполнению
RJMP TIM0_OVF
.ORG 0x0008 ; Адрес прерывания по выполнению АЦП
RJMP ADC_CMPLT
.ORG INT_VECTORS_SIZE
RESET:
; ----- Инициализация периферии -----
LDI R16,0b01000010
OUT TIMSK,R16 ; Разрешаем прерывания
LDI r16, (1 << PB1) ; Настройка PB1 как выхода
OUT DDRB, r16
LDI R16, 0b00000010
OUT PORTB, R16
LDI R16, 0b00000000 ; Начальное значение таймера
OUT TCNT1,R16
LDI R16, 0b00000001 ; Задаем режим работы генератора
OUT TCCR0, R16
LDI R16, 0b11110101 ; Задаем режим работы ШИМ
OUT TCCR1, R16
LDI R16, 0b00100000 ; Выбираем канал АЦП и настраиваем сдвиг данных в регистре данных АЦП
OUT ADMUX, R16
CLR R16
SEI ; Глобальное разрешение прерываний
MAIN: RJMP MAIN ; Бесконечный пустой цикл
TIM0_OVF: ; Прерывание по переполнению таймера T0
LDI R16, 0b11001000 ; Запускаем АЦП
OUT ADCSR, R16
RETI
ADC_CMPLT:
LDI R19, 45
IN R17, ADCH ; Cчитываем данные из старшего регистра АЦП
OUT OCR1A, R19
OUT OCR1B, R17
RETI
Схема, смоделированная в Proteus 8 приведена на рис. 1.
Рисунок 1 – Вид схемы
Уровень аналогового сигнала задается путём перемещения движка потенциометра и изменяет уровень от 0 до 5 В. Параллельно выходу потенциометра включен вольтметр, регистрирующий уровень сигнала на входе МК.
ШИМ сигнал снимается с выхода PB1 и идёт на цепочку интегрирования и осциллограф. Соответственно, яркость светодиода изменяется в зависимости от скважности импульсов, задаваемой при помощи считанного из АЦП значения.
Результат работы схемы приведен на рис. 2, 3, 4, 5.
Рисунок 2 – Уровень напряжения на входе 0 В (положение потенциометра – 100%)
Рисунок 3 – Уровень напряжения на входе 2.11 В (положение потенциометра – 70%)
Рисунок 4 – Уровень напряжения на входе 3,0 В (положение потенциометра – 50%)
Рисунок 4 – Уровень напряжения на входе 3,95 В (положение потенциометра – 25%)
Как видно из рисунков, результат работы схемы соответствует ожиданиям, следовательно, работа была выполнена верно.
Выводы: В данной работе было произведено моделирование аналого-цифрового преобразования на базе МК AtTiny15, с использованием прерываний по переполнению таймера. Использование АЦП является важным навыком при разработке медицинской техники, предназначенной для измерения и регистрации биологических сигналов.