(кросс-пост в
http://www.microchip.su/)При измерении температуры, поскольку она меняется медленно, возможны всякие красивые трюки и фокусы.
Во-первых, можно легко и просто увеличить эквивалентную разрядность АЦП, тем самым увеличив разрешение. В "общем виде" для этого ко входному сигналу надо подмешать ма-аленькую долю сигнала от некого ЦАП-чика, а потом проделать серию A/D преобразований, последовательно увеличивая сигнал на выходе ЦАП-а и суммируя результат. Например, если АЦП 8-битный, и в наличии есть 3-битный ЦАП, то разрядность АЦП можно увеличить до 11 бит, если сигнал с выхода ЦАПа подмешать на вход АЦП с такой пропорции, чтобы 1 шаг ЦАП-а соответствовал 1/8 от одного шага АЦП.
В случае с NTC этот фокус производится при помощи 3 резисторов с дискретных выходов мелкоконтроллера на вход АЦП. Вернее, при помощи 5 высокоомных резисторов одного номинала: старший разряд - два резистора в параллель, средний разряд - один резистор, младший разряд - два резистора последовательно. Конечно, величина пропорции подмешивания в каждый момент отчасти зависит от величины сопротивления NTC, т.е. от температуры. Поэтому разогнать до 11 бит во всем диапазоне не получится, но примерно 10-битное разрешение вытягивается без проблем. У меня такой "разогнанный" термометр чувствувал, когда я подносил к термистору руку на расстояние ~20 см.
Во-вторых, после того, как разрядность АЦП разогнана до такого уровня, что младшие разряды становятся просто шумом (это важно, чтобы они шумели, иначе не выйдет), дальнейшее увеличение разрядности практически бесплатно получается за счет использования предельно упрощенного варианта фильтра Калмана, т.е. рекурсивного фильтра, который при смешном минимуме задействованных ресурсов обеспечит такой же результат, как метод наименьших квадратов.
Если "на пальцах", то сделать можно так (как вариант).
- Измеряете температуру "разогнанным" (шумным) АЦП, получившееся значение обозначим X (что есть сумма 8 последовательных измерений при пошаговом нарастании кода на выходе 3-битного псевдо-ЦАПа)
- Измеренному значению X верите не безоговорочно, а чуть-чуть, скажем всего на 1/16. То есть, текущее значение температуры вычисляете так:
T = T - T/16 + X
Понятно, что самое первое значение 11-битной температуры загоняете в 16-битную переменную напрямую:
T = X*16, или, если на си, то T = (X << 4);
А все последующие уже вычисляете по "недоверчивой" формуле
T = T - (T >> 4) + X;
В сумме у вас получится примерно 14-битное разрешение на 8-битном АЦП. Вуаля!