Даже если не требуется обработка аналоговых сигналов, регистр ADCON1 все равно необходимо конфигурировать — в этом случае используются значения Ь’0110’ или Ь’0111’, при которых все выводы, которые могут использоваться АЦП, конфигурируются как цифровые[182]. Невыполнение этого требования представляет собой одну из наиболее распространенных ошибок, поскольку большинство современных моделей имеют аналоговые модули и, как было указано на стр. 496, при сбросе по включению питания все соответствующие выводы по умолчанию конфигурируются как аналоговые. Соответственно, при чтении состояния таких выводов будет всегда возвращаться 0. Как уже было отмечено, все выводы, используемые для считывания аналогового сигнала, должны быть сконфигурированными как входы (1 в соответствующих битах регистров TRIS).
Как мы видели из Рис. 14.10, операция последовательного приближения заключается в последовательном сравнении с долями фиксированного опорного напряжения, каждая последующая из которых в 2 раза меньше предыдущей. Соответственно, точность данной операции зависит от качества этого опорного напряжения. Как правило, указанный параметр (точность) определяется ценой единицы младшего бита (LSB), т. е. шагом квантования. В случае 10-битного преобразования эта величина составляет
В качестве опорного напряжения можно использовать напряжение питания самого микроконтроллера, скажем, 5 В. Так, при значении битов PCFG[3:0] = = b’1110’ вывод RA0 конфигурируется как аналоговый, а в качестве опорного используется напряжение VDD. В этом случае значение, полученное в результате оцифровки, даст нам долю от напряжения питания, которой соответствует входное аналоговое напряжение.
Использование напряжения питания в качестве опорного является не самым лучшим выбором с точки зрения помехозащищенности. К тому же его значение может изменяться в некоторых пределах. Если требуется более высокая точность или опорное напряжение, отличное от напряжения источника питания, то для подключения внешнего источника опорного напряжения можно задействовать определенные аналоговые входы. Все модули АЦП позволяют использовать хотя бы одно внешнее напряжение. Что же касается PIC16F87X, то в этом микроконтроллере можно использовать одно или два внешних опорных напряжения. В частности, при PCFG[3:0] = Ь’0101’ выводы RA[1:0] конфигурируются в качестве аналоговых входов, а вывод RA3 используется для подключения внешнего прецизионного источника опорного напряжения
В некоторых случаях может потребоваться измерение напряжений относительно уровня, отличающегося от
ADFM (формат результата преобразования)
В рассматриваемом нами модуле АЦП используется два регистра для хранения 10-битного результата. Поскольку суммарная разрядность пары регистров ADRESH: ADRESL составляет 16 бит, то возможны два способа размещения 10-битного результата в этих регистрах.
В большинстве приложений вполне хватает 8-битных значений — в таких случаях можно спокойно отбросить два младших бита результата преобразования. Из Рис. 14.13, а видно, что эту операцию проще всего осуществить, выравнивая результат преобразования влево и игнорируя содержимое регистра ADRESL.
Рис. 14.13.
Если же необходимо полное 10-битное значение, то бит ADCONl[7] следует установить в 1 для выравнивания результата по правому краю. Как видно из Рис. 14.13, б, в этом случае результат представляет собой 10-битное число, расширенное до 16 бит заполнением старших битов нулями. Соответственно для обработки этого значения можно использовать обычную 16-битную арифметику.
Процесс преобразования
После того как модуль АЦП сконфигурирован, оцифровка выбранного аналогового канала, с точки зрения пользователя, выглядит достаточно просто. Предполагая пока, что прерывания не используются, можно выделить следующие этапы преобразования (включая, для полноты, этап инициализации), которые в графическом виде изображены на Рис. 14.14:
1. Конфигурирование модуля АЦП:
• Конфигурирование выводов портов как аналоговых входов и/или входов опорного напряжения (ADCON1).
• Выбор источника тактового сигнала АЦП (ADCON0).
• Выбор входного канала АЦП (ADCON0).
• Включение модуля АЦП (ADCON0).