Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

320 Часть 111. Практическое программирование микроконтроллеров AVR единица в старшем разряде означает знак минус, он бы вывел сначала этот знак, а потом применил бы к отрицательному числу операцию neg, получив абсолютное значение, и уже его вывел бы на дисплей. Но электронщик не хочет связывать себя никакими договоренностями, принципиально зависящими от количества разрядов, которыми мы оперируем (см. гл аву 8) . У него изначально есть положительная вели­ чина- код АЦП, и все расчеты он предпочитает производить в положительной области. К знаку минус электронщик обращается только при отображении чисел на дисплее, и делает это, например, следующим образом. Пусть для датчика ТМР36 и опорного напряжения 2, 56 вольта величина кода АЦП будет лежать в указанных ранее пределах: от 40 до 600 с крутизной 4 единицы кода на 1 °С и значением при О 0С, равном 200. При этом в обе стороны от значения 200 абсолютное значение температуры станет увеличиваться, значит, мы получим два градуировочных уравнения с одинаковыми коэффициентами, но отличающимися знаками. При изменении кода в меньшую сторону придется еще где-то отдельно засвечивать знак минус. В программном исполнении это может выглядеть примерно так. В начале мы для удобства преобразуем наше градуировочное уравнение следующим образом: LI у = а0 + а 1 х --+ у = а 1 (х - ko) -для положительной области (х >= ko); LI у = а0 + а 1 х --+ у = a 1 (ko - х) - для отрицательной области (х· < ko) . Очевидно, что k0 здесь просто равно коду АЦП х в точке, где функция у (в нашем случае - температура) обращается в О. Значение этого коэффициента, который мы назовем «подставкой», очень просто вывести из изначального градуировочного уравнения : k0 = - ао/а1 • На самом деле в уравнении прямой, у которой аргумент (код) лежит в положительной области, а функция (температура) переходит через ноль, коэффициент а0 должен быть отрицательным, так что «подставка» ko всегда будет иметь положительное значение. Иногда при калибровке удается непосредст­ венно измерить k0 , положив температуру у равной нулю, но чаще его приходится вычислять из градуировочного уравнения по приведенной формуле. Теперь алгоритм получается простой и понятный: сначала мы сравниваем текущее значение кода х с «подставкой» k0, и если оно больше или равно ему, то вычисляем температуру по первому уравнению и гасим знак минус, если меньше - вычисляем по второму и зажигаем знак минус. В листинге 1 1 . 1 0 в переменные Koe ffH : KoeffL предварительно загружается из EEPROM значение «подставки» ko (в общем случае она может иметь 1 6 разрядов), к выводу Portв , 6 подключен знак минус. ; учет знака : ер AregL , KoeffL ; сравниваем подставку с данными ере AregH, KoeffH brsh ЬО ; если данные больше , то переход, знак + suЬ KoeffL , AregL ; иначе - , вычитаем из подставки данные sbc KoeffH, AregH

RkJQdWJsaXNoZXIy MTExODQxMg==