Сегодня мы рассмотрим способность АЦП генерировать прерывания и выполнять обработку аналоговых сигналов независимо от работы ядра микроконтроллера то есть паралельно выполнению основной программы (Прерывание это команда процессору по которой он останавливает выполнение основной программы и переходит к выполнению подпрограммы - обработчику прерывания, после выполнения которой снова переходит в точку останова основной программы и продолжает ее выполнение с момента останова). Все дело в том том, что АЦП это отдельный независимый узел(блок) микроконтроллера, со своими настройками и возможностью автономной работы. Регистр ADSRB микроконтроллера, как раз и отвечает за работу АЦП в различных режимах, в том числе и в автоматическом непрерывном режиме.
Регистр ADCSRB (ADC Control and Status Register B)
У регистра ADCSRB всего одна группа битов — ADTS[2:0] - биты номер 5, 6, 7.
Источник автоматического запуска задается битами ADTS[2:0] регистра ADCSRB. Возможны следующие варианты:
АЦП прерыванием информирует МК о завершенном преобразовании. Пока осуществляется преобразование, Arduino занимается своими делами — исполняет заданную программу.
Настройка АЦП сводится к следующим действиям:
====Источник автоматического запуска задается битами ADTS[2:0] регистра ADCSRB. Возможны следующие варианты:
2:0] | Источник запуска преобразования ADC |
000 | Постоянное преобразование (Free Running mode) |
001 | Аналоговый компаратор |
010 | Внешний запрос на прерывание 0 |
011 | Timer/Counter0 Compare Match |
100 | Timer/Counter0 Overflow |
101 | Timer/Counter1 Compare Match B |
110 | Timer/Counter1 Overflow |
111 | Timer/Counter1 Capture Event |
АЦП прерыванием информирует МК о завершенном преобразовании. Пока осуществляется преобразование, Arduino занимается своими делами — исполняет заданную программу.
Настройка АЦП сводится к следующим действиям:
- Обнуляем ADCSRB
- Устанавливаем источник опорного напряжения
- Выбираем пин для преобразования
- Запускаем преобразования
- Устанавливаем пределитель частоты
- Включаем автоматическое преобразование
- Разрешаем прерывание после окончания преобразования
- Включаем АЦП
- Запускаем преобразование
ADCSRB = 0x00;
ADMUX = 0b01100000;//A0
ADCSRA = 0b11101111;//делитель 128
=====
volatile int result;
int main()
{
...
//краткая настройка АЦП
ADCSRB = 0;
ADMUX = 96;//A0
ADCSRA = 239;//делитель 128
...
}
//функция для работы с АЦП по прерыванию
volatile bool trueValue = false; ISR(ADC_vect) { if (trueValue) { result = ADCH;
trueValue = false; } else { trueValue = true; } }