====== Аналого-цифровой преобразователь ====== Аналого-цифровой преобразователь или АЦП (англ. //analog to digital converter//, сокращ. ADC) преобразовывает аналоговое значение напряжения в цифровое значение. Разрешённый диапазон напряжения АЦП AVR микроконтроллера находится в рамках 0-5,5 V. Цифровое значение 10-битное, но его точность ±2 единицы. Ошибка может увеличиться, если не защитить напряжение питания чипа от помех. У AVR существует отдельное питание для АЦП и отдельный вывод напряжения сравнения. Отдельное питание помогает снизить интерференцию и не должно отличаться от напряжения питания чипа больше, чем на 0,3 V. Питание сравнения определяет максимальное цифровое значение. Другими словами, если питание сравнения 3 V, то вход с таким же напряжением выдаёт значение в 210 - 1 т.е. 1023. АЦП AVR работает по методу последовательного приближения (англ. //successive approximation//). Вкратце, измеряемое напряжение сравнивается с конкретными уровнями напряжения, а представление результатов происходит битовыми массивами. Данный метод требует много времени, так как нахождение каждого бита из окончательного значения происходит отдельно. Контроллеру AVR требуется во время работы 13 тактов для одного измерения и 25 тактов для самого первого измерения (при запуске). Эти такты не являются рабочими тактами контроллера, они получены частотным делителем специально для АЦП. Для получения максимальной точности такт АЦП должен быть 50-200 kHz. На более высоком такте пропадает точность. Иногда большое количество измерений важнее, чем точность и в таком случае оправдано использование большей частоты. Время, требующееся для одного измерения, в документации к AVR указано как 13-260 µs. Пользователь может считать результат измерения 8- и 10-битным. Так как AVR 8-битный, для значений измерения у АЦП имеется два 8-битных регистра. В настройках можно указать, какие 2 бита (первые или последние) 10-битного значения пойдут в отдельный регистр. Если отделяются 2 бита, которые меньше всего характеризуют результат, можно результат измерения считать 8-битным – подобная комбинация называется выравниванием по левому краю (англ. //left align//). Обратную комбинацию, когда оба регистра считываются и результат представлен в 10-битном формате, называют выравниванием по правому краю (англ. //right align//). Измеряемых каналов входного напряжения у AVR обычно 8, в серии ATtiny они одиночные, у некоторых чипов серии ATmegal 16, но преобразователь всё же один. Для использования разных входов в чипе существует встроенный мультиплексор. Вход мультиплексора определяется специальным регистром. АЦП обладает некоторыми другими свойствами: преобразование в спящем режиме процессора для уменьшения помех и возможность использования внутреннего фиксированного напряжения сравнения (2,56 V, у некоторых и 1 V). Требуется измерить 3 напряжения канала АЦП ATmega128 в промежутке 0-5 V с 8-битной точностью. #include int main() { unsigned char result; // Выбор вывода AREF сравнительным напряжением // (предположительно он включен в +5V питание) // Выбор канала 3 мультиплексором // Результат с левым расположением ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); // Запуск АЦП, налаживание преобразовательного такта // в 16 раз медленнее рабочего такта ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); // Ожидание завершения измерения while (ADCSRA & (1 << ADSC)) continue; // Считывание 8-битного результата result = ADCH; }