В данной статье мы разработаем модель для измерения емкости конденсатора и попутно кратко познакомимся с довольно мощной средой для разработки электронных схем Proteus 8.
Немного теории
Как измерить емкость конденсатора? Емкость это реактивный параметр электрической цепи, а потому его нельзя измерить простым омметром или вольтметром. Однако с этой задачей может легко справиться микроконтроллер (МК).
Если входной сигнал подаётся к Vo а выходной снимается с Vc (см. рисунок), то такая цепь называется цепью интегрирующего типа.
Реакция цепи интегрирующего типа на единичное ступенчатое воздействие с амплитудой Vo определяется следующей формулой:
Vc(t) = Vo*(1 - e^(-t / RC))
У любой емкости существует параметр "постоянная времени" RC, также называемая "тау". Постоянная времени (в секундах) RC-схемы, равна произведению сопротивления схемы (в Омах) и емкости схемы (в Фарадах), т.е.:
τ = R * C,
Vc(t) = Vo*(1 - e^(-t / τ)),
данный параметр характеризует за какое время (секунд) напряжение на заряжаемой емкости Vc окажется равным 62,3% от номинального Vo.
Таким образом, зная сопротивление и время заряда емкости до значения 0,632*Vo, можно рассчитать значение измеряемой емкости.
От теории к делу
Рассмотрим кратко схему
LCD1 экран 122*32 точек, на нем будет выводится измеренное значение емкости конденсатора С1. (а почему матричный? спросите вы. - этоже круто, добавим в нашу разработку немного графики!)
U2-U4 формируют тактовые импульсы Е1, Е2 для LCD1. (да, знаю о чем вы подумали, их можно былобы формировать и программно с МК.)
С1 - "виновник торжества".
R1 - разрядное сопротивление для конденсатора С1. (выбрано с учетом ограничения по току порта МК, хотя реально "пожечь" здесь ничего нельзя.)
R3 - зарядное сопротивление для конденсатора С1.
U1 - "царь всей схемы".
МК работает от 5 Вольт, опорное напряжение АЦП принимаем также 5 Вольт. Стоит заметить, что среда разработки Proteus довольно вольно относится к построению схем, например, питание на некоторые узлы подается по умолчанию, например, питание экрана и МК.
Итак, схема есть. Теперь прикинем алгоритм, что нужно сделать, чтоб измерить емкость:
- подключить емкость С1 (выполнено на схеме).
- разрядить емкость, через R1, до видимого 0 Вольт. Почему "видимого"? Все просто, по экспоненте до абсолютного ноля емкость будет долго разряжаться. В данном случае пренебрежем небольшой погрешностью (нам же не на Андромеду лететь).
- произвести заряд емкости до напряжения 0,632 * 5 Вольт (напряжение питания), одновременно измерив данный промежуток времени.
- Вывести измеренное значение в читаемом (десятичном) виде на экран.
Программная реализация
Программа МК не только измеряет емкость, но и работает с выводом информации на экран, поэтому код получился не маленький, и весь он выходит за рамки статьи. Рассмотрим только основные детали, кто хочет посмотреть код целиком будет ссылка в конце статьи.
Перед началом измерений сбрасываем таймер.
Timer_res:
clr temp
out TCCR1B,temp ;стоп таймер
out TCNT1H,temp ;сброс счетчика
out TCNT1L,temp
ldi temp,C_TOIE1
out TIMSK,temp ;уст.прерывание по таймеру
ret
Подпрограмма разряда выглядит так. C помощью команд sbi/cbi подключаем конденсатор к земле и начинаем измерение, активировав АЦП sbi ADCSRA,6. Разряд будет продолжаться до достижения r1 = 0.
Emk_R:
;притягиваем конденсатор к "земле" схемы
sbi DDRC,1
cbi PORTC,1
sbi DDRC,2
cbi PORTC,2
Emk_R_0:
sbi ADCSRA,6 ;начать измерение
Emk_R_1:
sbic ADCSRA,6
rjmp Emk_R_1 ;ожидание готовности АЦП
in r1,ADCH
tst r1
brne Emk_R_0 ;продолжить разряд
ret
Подпрограмма заряда чуть сложнее, здесь нам надо будет измерять время. Переменная vc устанавливает уровень значения на входе АЦП для напряжения 0,632 от максимального зарядного напряжения. Далее R1 отключаем от цепи, переводя порт в Z-состояние, а на R3 подаем логический 1 ~ 5 Вольт (незначительным падением напряжения на порту пренебрегаем). Затем стартуем таймер и АЦП. При достижении r1 = vc = 0,632*255 цикл измерения завершается, а измеренное время из регистров таймера записывается в регистр Х. Значение 161 берется из расчета, что при максимальном заряде конденсатора напряжение на нем 5 Вольт, так как опорное напряжение АЦП тоже 5 Вольт, то это соответствует значению АЦП = 255. Соответственно значение 161 достигнет как раз при 0,632*5 = 3,16 Вольт.
Emk_Z:
ldi vc,161;=255 * 0,632 уст.уровень заряда при T=R*C (при условии АЦП_опор = V_зар.конд. = 5 Вольт)
cbi DDRC,1 ;переводим порт в Z-состояние
sbi PORTC,2 ;подключаем конденсатор к питанию
ldi temp,C_TCCR1B
out TCCR1B,temp ;старт таймера
Emk_Z_0:
sbi ADCSRA,6 ;начать измерение
Emk_Z_1:
sbic ADCSRA,6
rjmp Emk_Z_1 ;ожидание готовности АЦП
in r1,ADCH
cp r1,vc
brlo Emk_Z_0 ;продолжить заряд
clr temp
out TCCR1B,temp ;стоп таймера
out TIMSK,temp
in xl,TCNT1L ;сохранение времени в Х
in xh,TCNT1H
ret
Теперь нам остается только по формуле τ = R * C, вычислить емкость подключенного конденсатора (несмотря на то, что мы ее уже знаем, да). В данном случае нам дополнительно потребуются подпрограммы умножения и деления больших чисел Umnozh32, Delenie32, а также подпрограммы вывода результата измерения на экран (их можно посмотреть в приложенном файле по ссылке в конце статьи). Текущая емкость рассчитывается в нанофарадах, а для удобства выводится в микрофарадах, подставлением запятой после 3-х десятичных разрядов.
Emk_convert:
;расчет Т = TCNT1 * 128 (мкс), где 128 мкс период таймера
clr r7
clr r6
movw r5:r4,X
clr r3
clr r2
clr r1
ldi temp,128 mov r0,temp
rcall Umnozh32 ;r7_r4 * r3_r0 = r11_r8 ;расчет С = Т / R (нанофарад), где R сопротивление разряда в килоомах
movw r7:r6,r11:r10 movw r5:r4,r9:r8 ldi xh,byte4(1100);сопротивление разряда в килоомах ldi xl,byte3(1100) movw r3:r2,X
ldi xh,byte2(1100) ldi xl,byte1(1100) movw r1:r0,X
rcall Delenie32 ;r7_r4 / r3_r0 = r15_r12 ;вывод полученного значения на дисплэй rcall Line0Disp
movw r5:r4,r13:r12 rcall KonvertChar
rcall Char_to_disp
ldi temp,' ' rcall LoadChar
ldi temp,'М' rcall LoadChar
ldi temp,'К' rcall LoadChar
ldi temp,'Ф' rcall LoadChar
rcall ClearDispEnd
rcall VivNaDisp
ret
Тестирование
Запускаем Proteus (при наличии) и смотрим полученный результат. Можно поиграть с емкостью С1 и посмотреть какие результаты будут выводится на экране. Вот для примера измерение 3-х емкостей:
Заключение
Из теста программы можно сделать вывод, что программа работает, и измеряет емкость конденсатора почти точно в диапазоне от 0,01 мкф до 5 мкф с точностью 10 нф. Для большей точности видимо следует внести коррекцию падения напряжения на порте МК или использовать больше бит АЦП преобразователя и поставить кварц вместо встроенного тактового генератора, а для увеличения диапазона измерений нужно уменьшить\увеличить выборку ТАЙМЕРА и\или зарядный ток через R3. Например, увеличивая период измерения ТАЙМЕРА или уменьшив сопротивление R3, можно мерить большие емкости, а уменьшив - наоборот. В общем вариантов усовершенствования данной схемы масса.
Конечно же, можно собрать эту схему и на реальном микроконтроллере.