В очередном уроке я расскажу про АЦП и работу с ним в микроконтроллерах 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, применяя полученные знания:
$regfile = "attiny13.dat" $crystal = 9600000 Config Adc = Single , Prescaler = Auto , Reference = Internal Config Portb.0 = Output Config Portb.1 = Output Config Portb.2 = Output Start Adc Do If Getadc(2) >= 341 Then Portb.0 = 1 Else Portb.0 = 0 End If If Getadc(2) >= 682 Then Portb.1 = 1 Else Portb.1 = 0 End If If Getadc(2) >= 1000 Then Portb.2 = 1 Else Portb.2 = 0 End If Loop End
Компилируем, прошиваем микроконтроллер и наслаждаемся! Кстати фьюз биты микроконтроллера необходимо установить на работу внутреннего тактового генератора на 9.6МГц. Вот пример установки фьюз битов в программе PonyProg2000:
Моя сборка на макетной плате с механическими контактами:
В файлах к статье есть проект в симуляторе Proteus:
Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже
Урок 10. Работа с UART интерфейсом
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
IC1 | МК AVR 8-бит | ATtiny13 | 1 | Поиск в магазине Отрон | ||
R1-R3 | Резистор | 150 Ом | 3 | Поиск в магазине Отрон | ||
R4 | Резистор | 10 кОм | 1 | Поиск в магазине Отрон | ||
R5 | Переменный резистор | 20 кОм | 1 | Поиск в магазине Отрон | ||
HL1-HL3 | Светодиод | 3 | Поиск в магазине Отрон | |||
Bat1 | Элемент питания | 3 Вольт | 1 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- mc128.rar (13 Кб)
Комментарии (21) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
If Getadc(2) >= 341 Then // Условие. Если считанное значение с 2-го канала АЦП равно и превышает 341, то выполняется нижеследующая строка
...
Else // Иначе. Т.е. если вышестоящее условия не выполнилось, то переходим в этот блок условия
...
End If // Конец блока if
Вопрос у меня другой: мы имеем входы ADC0, ADC1,ADC2,ADC3. Они будут работать как отдельные 4 ацп, или это одно ацп с 4 входами через мультиплексор,которое их попеременно опрашивает и сливает результат в одну кучу? Хотелось бы использовать контроллер как 2,3,4 независимых АЦП,с которых можно читать данные. Кто подскажет, возможен такой режим?
Four Multiplexed Single Ended Input Channels
$crystal = 9600000
$swstack = 8
$framesize = 16
Проверял на Bascom 2.0.7.1, 2.0.5.0, 1.11.9.8. Пока не критично, но очень интересно как Вы добиваетесь оптимизации.
А именно, чтобы начал работать вход ADC2D (PB4), в программе в регистр ADMUX надо вписать именно 4, а не 2. Похоже это глюк модели в Протеусе.