АЦП из компаратора, на примере 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.

Проверка на железе

Проверка на железе

Скачать исходники и проект для proteus

3 комментария на « АЦП из компаратора, на примере PIC16F628A»

  1. ВИТАЛИЙ пишет 07.04.2011 в 00:28 #

    СПАСИБО!!!

  2. Паха пишет 16.12.2012 в 05:51 #

    дорогие товарищи, ознакомтесь пожалуйста с этим документом (ACHTUNG ENGLISH) http://www.microchip.ru/cdrom/ww1.microchip.com/downloads/en/AppNotes/00700a.pdf
    на 628 можно сделать не простенький а многоразрядный и довольно высокоточный АЦП, для измерения медленно изменяющихся сигналов.

  3. Sergey пишет 27.03.2013 в 22:47 #

    Thanks alot and respect!!!

Комментарии RSS

Оставьте отзыв