АЦП из компаратора, на примере PIC16F628A
АЦП очень полезная штука, но, к сожалению, она есть не во всех микроконтроллерах. Зато большинство МК оснащены аналоговыми компараторами. В этой статье я расскажу, как из аналогового компаратора микроконтроллера PIC16F628A можно сделать простенький АЦП.
Схема
Схема очень простая. На вход RA1 подаётся измеряемое напряжение (напряжение не должно превышать напряжение питания микроконтроллера, в данном примере 5В). Это изменяемое напряжение даёт переменный резистор R3 подключенный между небом входом питания и землёй. Для оценки результатов работы прошивки в схему добавлен вольтметр. Для работы МК и отображения результатов в схеме присутствуют кварцевый резонатор, знакогенерирующий LCD Winstar 16×2 и немного обвязки.
В этом микроконтроллере компаратор имеет встроенный источник опорного напряжения. Но к сожалению возможности его не очень велики: при напряжении питания 5В он может выдавать опорное напряжение до 3,59В с шагом 0,21В, т.е. всего 20 значений. Для некоторых задач хватит и этого.
При инициализации контроллера нужно уделить внимание тому, чтобы выводы МК, которые использует компаратор (в примере это RA1 и RA2) были проинициализированы как входы и на входе опорного напряжения (RA2) не висела ни какой периферии.
CMCON=0b00000101; // используется только второй компаратор TRISA=0x06; // RA1 и RA2 - выводы компаратора
Задаём массив с параметрами конфигурации регистра VRCON и соответствующими значениями напряжений.
const unsigned char AtDTest_mass[21][2]= { {0b11100000, 0}, {0b11100001, 21}, {0b11100010, 42}, {0b11100011, 63}, {0b11100100, 83}, {0b11100101,104}, {0b11100110,125}, {0b11100111,146}, {0b11101000,167}, {0b11101001,188}, {0b11101010,208}, {0b11101011,229}, {0b11101100,250}, {0b11001000,250}, {0b11001001, 10},//266 {0b11001010, 25},//281 {0b11001011, 41},//297 {0b11001100, 57},//313 {0b11001101, 72},//328 {0b11001110, 88},//344 {0b11001111,103} //359 };
Что бы не расходовать драгоценную память попусту – значения напряжений будем хранить не в дробном виде, а умноженными на 100. А что бы они ещё и в unsigned char влезли – смешение на 256 будет производиться в функции.
В массиве повторяется напряжение 2,5В, это связана с изменением 5 бита регистра VRCON, который отвечает за выбор диапазона выходного напряжения.
Так же следует не забывать, что приведённые значения верны только при напряжение питания МК 5В, если оно будет отличаться – всё придётся пересчитывать.
Функция псевдо АЦП на компараторе выглядит следующим образом:
int AtDTest() { int otvet=0; unsigned char i; i=21; // количество элементов массива // или возможных вариантов +1 VRCON=0b11101111; do { i--; VRCON=AtDTest_mass[i][0];// устанавливаем опорное напряжение delay(10); // задержка } while(i>0&&C2OUT==1); // делаем, пока не прошли все варианты // или не нашли нужное напряжение VRCON=0; // выключаем источник опорного напряжения otvet=AtDTest_mass[i][1]; // вычисляем напряжение if(i>13)otvet+=256; // корректировка напряжения, с учётом переполнения return otvet; }
Смысл самой функции аналогового цифрового преобразователя следующий:
Постепенно уменьшая опорное напряжение ожидать сработки компаратора. Как только компаратор сработал, смотрим, какое опорное напряжение было выставлено, искомое напряжение чуть выше его. Искомое напряжение лежит в пределе между ним и выше лежащем. Например: компаратор сработал на 10 шаге – то искомое напряжение лежит между 2,08 и 2,29 вольтами.
Обратите внимание, что функция возвращает величину напряжения умноженную на 100.
Проверка на железе
Alex_EXE | 03.03.2011 | Микроконтроллеры |
ВИТАЛИЙ пишет 07.04.2011 в 00:28 #
СПАСИБО!!!
Паха пишет 16.12.2012 в 05:51 #
дорогие товарищи, ознакомтесь пожалуйста с этим документом (ACHTUNG ENGLISH) http://www.microchip.ru/cdrom/ww1.microchip.com/downloads/en/AppNotes/00700a.pdf
на 628 можно сделать не простенький а многоразрядный и довольно высокоточный АЦП, для измерения медленно изменяющихся сигналов.
Sergey пишет 27.03.2013 в 22:47 #
Thanks alot and respect!!!