Наиболее часто употребляемые быстрые методы измерения влажности среды основываются на:
- замере электрического сопротивления двух контактов;
- изменении емкости электродов, связанном с изменением диэлектрической проницаемостью контролируемой среды.
Однако, они обладают существенными недостатками.
Измерение сопротивления, по сути, дает информацию не столько о влажности, сколько о солености, ибо ток, в бОльшей степени, зависит от насыщенности электролита. Дистиллированная (чистая) вода не проводит электрический ток. Дополнительным паразитным фактором является износ электродов, связанный с активной ионизацией (в случае металлических контактов) или с обрастанием внешними солями графитовых покрытий. Таким образом, за время жизни датчика, его придется неоднократно калибровать или достаточно часто заменять.
Емкостные датчики в полной мере избавлены от перечисленных проблем, но их эффективность зависит от толщины базового диэлектрического покрытия. И тут мы опять имеем "палку о двух концах" - тонкое покрытие не дает достаточной механической защищенности, а толстое - существенно снижает чувствительность прибора. Идеальным изоляционным материалом для подобного рода сенсоров был бы фторопласт (обладающий приличной прочностью и химической стойкостью), но его нанесение пленкой с толщинами около 0.1мм - та еще задача.
Итак, в первом случае мы измеряем сопротивление электролита, во втором - диэлектрическую проницаемость. Безусловно, на этом отнюдь не заканчиваются физические параметры, находящиеся в зависимости от влажности. При наличии воображения, вполне можно представить себе измерение изменяемого объема гигроскопичного материала (того же желатина), причем, измерять можно не только геометрию, но и то же электрическое сопротивление, растворив в нем мелкодисперсный металлический порошок или тот же графит (при высыхании, частицы будут сжиматься, уменьшая электрическое сопротивление); изменение удельного веса; теплопроводности... И что только вода не делает с материалами...
Мы же пойдем "путем дедушки Ленина" - иным.
Вспомним за поглощение водой электромагнитных волн... А с чего бы вы думали господа китайцы по сию пору не производят радиоуправляемых подводных лодок для полюбоваться морскими красотами? Проблема радиосвязи с глубоководными мобильными аппаратами как раз и проистекает от того, что вода поглощает энергию высокочастотных колебаний (да вспомним хоть микроволновку, в которой СВЧ греет исключительно воду!).
Не буду расписывать за теорию (самому лень глубоко лезть в тему), но вкратце ситуация выглядит так - чем выше частота магнитного поля, тем больше оно поглощается водой, переходя в тепло. Вроде все просто... Ан не совсем!
Ведь в нашу задачу входит не отопление путем глобального прогрева почвы, а лишь измерение при минимальном воздействии на внешнюю среду. То есть, вгонять в землицу бешеные киловатты на гигагерцах - не наш путь. Отсюда проблемы с преобразованием мощности потерь в какую-нибудь приемлемую физическую величину, легко поддающуюся измерению. Повторюсь, мы не можем тупо накачивать катушку через резистор и измерять падение напряжения на нем - кроме дрейфа всех параметров оно нам ничего не даст.
Решение приходит из детства радиосвязи. В 20х..30х годах прошлого века, господа радиолюбители вовсю развлекались разного рода регенераторами, позволяющими на минимальной элементной базе получить значительные успехи по увеличению чувствительности и избирательности радиоприемников. Суть данного метода заключается в том, что колебательный контур дополнительно возбуждается за счет слабой положительной обратной связи в усилительном каскаде. Такое схемное решение позволяет сильно повысить добротность входного контура и дает тому возможность заводиться от слабейших внешних полей. Сложность реализации упирается в необходимость регулировки глубины обратной связи так, чтобы приемник не сорвался в режим стабильной генерации. Из-за этого, регенеративные приемники, кроме ручки настройки частоты, имели еще и верньер ПОС.
В дальнейшем, господа изобретатели придумали принудительно гасить сорвавшийся с цепи генератор и, в зависимости от метода гашения, образовались два схемных решения - сверхрегенератор, самостоятельно срывающийся на некоторое константное время при достижении определенного напряжения в контуре, и собственно регенератор с внешним гашением. Цимес сей немудреной схемотехники в том, что на выходе мы получаем по сути ШИМ сигнал, сильно зависящий от внешних полей.
А вот тут вернемся к витым рогам наших муфлонов... Дело в том, что на скорость нарастания колебаний в генераторе, при прочих равных факторах, влияет и добротность контура. Все что нам остается - добиться бОльшей его зависимости от добротности (вспомним за потери в воде), нежели от внешних помех.
Максимальное усиление регенератора, как приемника, достигается за счет максимальной крутизны характеристики усилителя при минимальной глубине ПОС (эка завернул!). Что до влияния ДОБРОТНОСТИ, на время регенерации, то тут слегка загрубленная обратная связь наш первейший помощник - нам надо лишь отсекать условия возникновения генерации по потребляемой энергии. Фактор усиления сохраняется, но уже не внешних радиосигналов (ака радиопомех), а практически исключительно потерь в контуре.
Наиболее подходящим НМВ решением является применение схемы Колпитца - она позволяет использовать простую катушку и легко управлять условиями возникновения генерации.
огрызок схемы из проекта
В приведенной схеме, контрольный генератор заводится пилообразным напряжением, формируемым на конденсаторе С8. Резистор R16 подобран так, что во всем диапазоне измерений возбуждение происходит на относительно пологом участке "пилы". Впрочем, никто не мешает генерировать идеальную пилу с помощью ШИМ микроконтроллера или заменив R15 источником тока. Я ставил перед собой задачу удовлетвориться минимумом деталей.
При возникновении колебаний, происходит "перетекание" части эмиттерного тока транзистора Q2 в базу транзистора Q1, открывая его и давая сигнал на микроконтроллер. При этом, в программе происходит захват значения образцового счетчика.
Собственно, огрызок кода выглядит следующим образом:
unsigned int max_m_value;
unsigned int min_m_value = 0;
unsigned int EEMEM stored_min_m_value = 0;
unsigned int moisure = 0;
unsigned char moisure_changed = 0;
unsigned char mw_mc = 0;
#define m_mode_moisure 1
unsigned char m_mode = 0;
void start_moisure() {
if (!m_mode) {
m_mode = m_mode_moisure;
TCNT1 = 0;
TCCR1A = 0x00; // normal operation
TCCR1B = 0x81; // cancel noise at falling edge & max speed
DDRB &= ~0x02; // powering generator
TIFR |= 0x20;
max_m_value = 0;
mw_mc = 5;
}
}
void stop_moisure() {
TCCR1B = 0x00; // stop timer
DDRB |= 0x02; // stop generator
m_mode = 0;
}
ISR(TIMER1_OVF_vect) {
if (TCCR1A & 0x03) { // restart metering
TCNT1 = 0;
TCCR1A = 0x00; // normal operation
TIFR |= 0x20;
switch (m_mode) {
case m_mode_moisure:
DDRB &= ~0x02; // powering generator
break;
}
} else { // error
switch (m_mode) {
case m_mode_moisure:
moisure_changed |= moisure != 0xFFFF;
moisure = 0xFFFF;
stop_moisure();
break;
}
}
}
ISR(TIMER1_CAPT_vect) {
unsigned int x;
x = ICR1;
switch (m_mode) {
case m_mode_moisure:
if (max_m_value < x) max_m_value = x;
if (!(--mw_mc)) {
if (max_m_value > min_m_value) x = max_m_value - min_m_value;
else x = 0;
if (diff_bw(x, moisure) > 1) {
moisure = x;
moisure_changed = 1;
}
stop_moisure();
} else { // stop generator
DDRB |= 0x02; // discharge capacitor
TCNT1 = 0;
TCCR1A = 0x02; // 9 bit PWM mode
TIFR &= ~0x20; // disable input capture
}
break;
}
}
После старта измерений мы захватываем МАКСИМАЛЬНОЕ время (на минимальное влияют помехи), вычитаем из него, предварительно настроенное, минимальное время и, вуаля! получаем дельту времени, зависящую от влажности контролируемого материала.
Что до конструкции самого датчика, я предпочитаю плоскую катушку (в данном случае 10мкГн), залитую эпоксидкой, слоем в пару-тройку миллиметров. Это убирает влияние изменений межвитковой емкости и ограничивает потери приемлемым диапазоном.