Цитата(rezident @ Jul 21 2009, 04:12)

Это надо уметь написать так, чтобы не было ничего понятно, но зато создавалась иллюзия простоты реализации.
1. Схема подключения датчика понятна? Если не сильно углубляться в нюансы: NTC термистор одним концом подключен к питанию, вторым - к эталонному резистору R
ref. Эталонный резистор вторым концом подключен к земле. АЦП в качестве опорного напряжения использует питание. Точка соединения термистора и эталонного резистора заведена на вход АЦП, но не напрямую, а через резистор Rs величиной в несколько кОм. Этот дополнительный резистор не обязателен, но он полезен для того, чтобы сгладить вариации сопротивления источника сигнала. Зачем это нужно - см. п.2.
2. Устройство псевдо-ЦАПа понятно? 3 разряда любого порта ввода-вывода микроконтроллера настроены на вывод. Обозначим их DAC0 (младший бит ЦАПа), DAC1 и DAC2 (старший бит).
- Между DAC0 и входом АЦП стоит цепочка из двух последовательно включенных высокоомных резисторов номинала Rx, в сумме 2*Rx.
- Между DAC1 и входом АЦП включен один резистор номинала Rx.
- Между DAC2 и входом АЦП включены два резистора номинала Rx в параллель, в сумме Rx/2.
Номинал Rx соотносится с R
ref и Rs таким образом, чтобы при изменении сигнала на выходе DAC0 из 0 в 1 (или из 1 в 0) сигнал на входе АЦП менялся чуть больше, чем на 1/8 от его дискретности. Например, при питании в 5 В и разрядности АЦП 10 бит дискретность АЦП составляет примерно 4.9 мВ. Значит, резисторы надо выбрать так, чтобы при изменении DAC0 сигнал на входе АЦП сдвинyлся примерно на 0.62 мВ.
3. Как получить результат от "разогнанного АЦП" - понятно? По шагам:
3.1. Устанавливаем DAC2=0, DAC1=0, DAC0=0. Делаем АЦП преобразование, результат
заносим в 16-битную переменную
Х.
3.2. Устанавливаем DAC2=0, DAC1=0, DAC0=1. Делаем АЦП преобразование, результат
прибавляем к 16-битной переменной
Х.
3.3. Устанавливаем DAC2=0, DAC1=1, DAC0=0. Делаем АЦП преобразование, результат
прибавляем к 16-битной переменной
Х.
...
3.8. Устанавливаем DAC2=1, DAC1=1, DAC0=1. Делаем АЦП преобразование, результат
прибавляем к 16-битной переменной
Х.
Если АЦП 10-битный, в переменной
Х получился 13-битный результат.
4. Как сделать псевдо-фильтр Калмана (или максимально упрощенный
tracking g-h filter, если угодно) - понятно?
4.1. При инициализации делаем первое АЦП-преобразование (как в п.3), умножаем результат
X на 8 (т.е. сдвигаем 13-битный результат
X на 3 разряда влево (X << 3)) и запоминаем в 16-битной переменной
Т. То есть, "вес" переменной
Т в восемь раз больше, чем "вес" одного измерения
X.
4.2. Все последующие результаты
X, полученные от АЦП п.3, добавляем к
Т без сдвига, предварительно вычтя из
T одну восьмую. Одна восьмaя получается, если
T сдвинуть вправо на 3 разряда. На cи это выглядит так:
T = T - (T >> 3) + X;Естественно, чтобы успевать отследить колебания температуры, измерения надо теперь делать в несколько раз чаще.