Форум программистов, компьютерный форум, киберфорум
yariko
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Измерение емкости на ATMEGA8

Запись от yariko размещена 18.09.2023 в 13:27

Как измерить емкость конденсатора? Емкость это реактивный параметр электрической цепи, а потому его нельзя измерить простым омметром или вольтметром. Однако с этой задачей может легко справиться микроконтроллер (МК).
У любой емкости существует параметр "постоянная времени" RC, также называемая "тау". Постоянная времени (в секундах) RC-схемы, равна произведению сопротивления схемы (в Омах) и емкости схемы (в Фарадах), т.е.:
Vc(t) = Vo*(1 - e^(-t / τ)),
τ = R * C
,
данный параметр характеризует за какое время (секунд) напряжение на заряжаемой емкости Vc окажется равным 62,3% от номинального Vo.
Нажмите на изображение для увеличения
Название: Series_RC_capacitor_voltage-ru.svg.png
Просмотров: 14
Размер:	52.2 Кб
ID:	8268
Таким образом, зная сопротивление и время заряда емкости до значения 0,632*Vo, можно рассчитать значение измеряемой емкости. Время заряда можно легко измерить с помощью МК.
Тестировать устройство будем в среде моделирования Proteus 8.

Схема
Нажмите на изображение для увеличения
Название: схема.png
Просмотров: 17
Размер:	35.6 Кб
ID:	8267
Рассмотрим кратко схему
LCD1 экран 122*32 точек, на нем будет выводится измеренное значение емкости конденсатора С1. (а почему матричный? спросите вы. - этоже круто, добавим в нашу разработку немного графики!)
U2-U4 формируют тактовые импульсы Е1, Е2 для LCD1. (да, знаю о чем вы подумали, их можно былобы формировать и программно с МК.)
С1 - "виновник торжества".
R1 - разрядное сопротивление для конденсатора С1. (выбрано с учетом ограничения по току порта МК, хотя реально "пожечь" здесь ничего нельзя.)
R3 - зарядное сопротивление для конденсатора С1.
U1 - "царь всей схемы".
МК работает от 5 Вольт, опорное напряжение АЦП принимаем также 5 Вольт. Стоит заметить, что среда разработки Proteus довольно вольно относится к построению схем, например, питание на некоторые узлы подается по умолчанию, например, питание экрана и МК.
Итак, схема есть. Теперь прикинем алгоритм, что нужно сделать, чтоб измерить емкость:
1.подключить измеряемую емкость (С1).
2.разрядить емкость, до видимого 0 Вольт. Почему "видимого"? Все просто, по экспоненте до абсолютного ноля емкость будет долго разряжаться. В данном случае пренебрежем небольшой погрешностью (нам же не на Андромеду лететь).
3.произвести заряд емкости до напряжения 0,632 * 5 Вольт (напряжение питания), одновременно измерив данный промежуток времени.
4.вывести измеренное значение в читаемом (десятичном) виде на экран.

Программная реализация
Программа МК не только измеряет емкость, но и работает с выводом информации на экран. Рассмотрим только основные детали, кто хочет посмотреть код целиком будет ссылка в конце статьи.

Перед началом измерений сбрасываем таймер.
Assembler
1
2
3
4
5
6
7
8
Timer_res:
clr temp
out TCCR1B,temp ;стоп таймер
out TCNT1H,temp ;сброс счетчика
out TCNT1L,temp
ldi temp,C_TOIE1
out TIMSK,temp ;уст.прерывание по таймеру
ret
Подпрограмма разряда выглядит так. C помощью команд sbi/cbi подключаем конденсатор через R1 к земле и начинаем измерение на нем 0 Вольт, активировав АЦП sbi ADCSRA,6. Разряд будет продолжаться до достижения r1 = 0.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 Вольт.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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-х десятичных разрядов.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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 и посмотреть какие результаты будут выводится на экране. Вот для примера измерение, как видно, текущее и измеренное значение емкости совпало:
Нажмите на изображение для увеличения
Название: proteus_test_1.png
Просмотров: 12
Размер:	36.3 Кб
ID:	8269

Заключение
Из теста программы можно сделать вывод, что программа работает, и измеряет емкость конденсатора почти точно в диапазоне от 0,01 мкф до 5 мкф с точностью 10 нф. Для большей точности видимо следует внести коррекцию падения напряжения на порте МК или использовать больше бит АЦП преобразователя и поставить кварц вместо встроенного тактового генератора, а для увеличения диапазона измерений нужно уменьшить\увеличить выборку ТАЙМЕРА и\или зарядный ток через R3. Например, увеличивая период измерения ТАЙМЕРА или уменьшив сопротивление R3, можно мерить большие емкости, а уменьшив - наоборот. В общем еще много вариантов усовершенствования данной схемы.

Файлы проекта
Proteus_TestC.zip
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru