Управляют этим процессом две переменных: счетчик циклов countcyk
и счетчик преобразований count. Первый из них увеличивается на 1 каждый раз, когда происходит прерывание таймера. Когда его величина достигает 32 (т. е. когда устанавливается единица в бите 5, см. команду sbrs countcyk, 5), то значение счетчика сбрасывается для следующего цикла, и происходит запуск преобразования АЦП, причем для канала, соответствующего значению бита в регистре Flag, указывающего, что именно мы измеряем сейчас: температуру или давление. Таким образом измерения равномерно распределяются по времени.Сами преобразования отсчитываются счетчиком count
до 64 (поэтому цикл одного измерения занимает чуть более секунды: 32x64 = 2048 прерываний таймера, а в секунду их происходит примерно 1953). Когда это значение достигается, то мы переходим к обработке результатов по описанным ранее алгоритмам: сумма измерений делится на 64 (т. е. вычисляется среднее за секунду), затем вычитается или прибавляется значение коэффициента Z и полученная величина умножается на коэффициент К, точнее — на его целый эквивалент, полученный умножением на 1024. Затем произведение делится на это число (отбрасывается младший байт и оставшиеся сдвигаются на два разряда вправо) и преобразуется к распакованному двоично-десятичному виду, отдельные цифры которого размещаются в памяти для последующей индикации. Как только очередной такой цикл заканчивается, меняется значение бита в регистре Flag, поэтому давление и температура измеряются попеременно. В целом выходит, что значение каждой из величин меняется примерно раз в две секунды и представляет собой среднее за половину этого периода. Собственно результат измерения читается в прерывании АЦП (процедура по метке readADc), которое происходит автоматически по окончании каждого преобразования. В нем увеличивается значение счетчика count, извлекается из памяти предыдущее значение суммы показаний (в зависимости от регистра Flag — температуры или давления), считываются значения АЦП, суммируются с предыдущими значениями, и сумма записывается обратно в память. Практически весь алгоритм мы описали — осталось только понять, как получить значения коэффициентов преобразования К и Z и затем произвести точную калибровку.
Калибровка
Для того чтобы прибор заработал, в него необходимо ввести предварительные значения коэффициентов преобразования К
и Z, причем такие, желательно, чтобы они были достаточно близки к настоящим, и измеритель не показал бы нам сразу «погоду на Марсе». В программе «зашиты» некие значения коэффициентов (см. процедуру Reset, Секцию Запись коэффициентов в самом конце программы), которые вы можете использовать, если в точности воспроизведете схему по рис. 20.4 и используете тот же самый датчик давления. Как они получены?Схема датчика температуры при указанных параметрах должна выдавать, как вы можете подсчитать, значение от 0 до 5 В в диапазоне температур примерно от -47 до 55 °C. То есть на 102 °C у нас приходится 1024 градации АЦП, и крутизна характеристики, если считать градусы с десятичными долями, составит 1020/1024 = 0,996 тысячных долей градуса на единицу кода АЦП. Для вычислений в МК эту величину мы хотим умножить на 1024, так что можно было бы и не делить — ориентировочное значение коэффициента К
и так будет 1020.Величину Z
, соответствующую 0 °C, вычислить также несложно. Мы полагаем, что нулевому значению кода соответствует температура -47°, тогда значение кода в нуле должно составить величину 470, поделенную на крутизну: 470/0,996 = 471.Теперь разберемся с давлением. «Если повар нам не врет», то диапазон датчика, соответствующий изменению напряжения на его выходе от 0 до 4,6 В, составляет примерно 850 мм рт. ст. Диапазон 0–4,6 В будет соответствовать изменению кодов примерно от 0 до 940 единиц, т. е. крутизна К
равна 850/940 = 0,904 мм рт. ст. на единицу кода. В приведенном для наших расчетов виде это составит 0,904 — 1024 = 926. «Подставка» Z есть значение кода на нижней границе диапазона датчика, которая равна около 11 мм. рт. ст., соответственно, Z = 11/0,904 = 12 единиц. Полученные величины «по умолчанию» и «зашиваем» в программу.Для уточнения этих величин необходимо произвести калибровку. Откалибруем уже отлаженный прибор сначала по температуре. Для этого следует запустить прибор и поместить датчик температуры в воду, записав для двух значений температур (как можно ближе к 0°, но не ниже его, и около 30–35 °C) показания датчика (t
) и реальные значения температуры по образцовому термометру (t'). Они, естественно, будут различаться.Для расчета новых (правильных) значений коэффициентов K
' и Z' достаточно решить относительно них систему уравнений: