В микроконтроллерах Atmel (на которых построена Arduino) имеется встроенный аналогово-цифровой преобразователь (АЦП). Именно он отвечает за оцифровку сигнала с аналоговых входов. Причем в один момент времени АЦП может оцифровывать сигнал только с одного аналогового входа. Сам процесс оцифровки сводится к последовательному подбору наиболее близкого к входному напряжения с известным (референсным) значением. К слову, у микроконтроллера так же есть дополнительный вход AREF для подачи внешнего референсного напряжения. В Arduino по умолчанию референсным является напряжение питания микроконтроллера. Но если, например, Ваш МК питается от пяти вольт, а датчик на вход АЦП возвращает максимум 3.3В, то стоит подключить напряжение 3.3В к входу AREF и до преобразования вызвать функцию analogReference(). В IDE Arduino за работу с АЦП отвечает функция analogRead(pin). Эта функция включает АЦП, выбирает заданный вход, производит преобразование и возвращает результат с 10-ти битной точностью. Понятно, что такая операция не выполняется за один такт. Не выполняется она и за два, и за десять тактов… И резонно появляется следующий вопрос: как быстро работает analogRead? Для оценки времени преобразования я сделал простой тест. 1. К аналоговому входу 5 подключим переменный резистор. 2. Напишем скетч, в котором будем в основном цикле вызывать analogRead и писать полученное значение в UART. 3. Будем засекать время по таймеру непосредственно перед и сразу после вызова analogRead. Разница этих двух значений поможет оценить скорость преобразования. Для эксперимента я взял FreeDuino на Atmega168, загрузил в нее скетч и… результат мне не понравился совершенно. Микроконтроллеру для оцифровки аналогового сигнала понадобилось в среднем 111мкс. Это много! Но почему так и можно ли что-то сделать для увеличения скорости? Для этого необходимо разобраться как микроконтроллер управляет АЦП.
|