Современная электроника №4/2024
ИНЖЕНЕРНЫЕ РЕШЕНИЯ 47 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 4 / 2024 Листинг 2. Подпрограмма вывода гистограммы //----------------------------------- u//--------------------------------- void outUL(uint16_t UL,uint8_t NK) { //UL - показание АЦП в мВ uint8_t c, c_ost, byte_verh,NA,KA; uint16_t ost; c = UL / 320; //целая часть ost = UL % 320; //остаток c_ost = ost / 40; // // byte_verh=0xff-(0xff << c_ost); byte_verh = ~(0xff << c_ost); //»~» - побитовое дополнение/инвер- сия всех бит for (k = 0; k < c; k++) { ML[k] = 0xff; //закраска синим нижних строк } ML[c] = byte_verh; // верхний байт if (c < 6) { for (k = c + 1; k < 7; k++) { ML[k] = 0x00; //закраска черным верхних строк } } if (NK==1){ NA=90;//левый канал KA=110; } else { NA=20;//правый канал KA=40; } //--------------------------------- //вывод массива на экран //--------------------------- CS = 1; //----------------------- // Построение гистограммы //---------------------- outcmd(0x21); // Установка столбца outcmd(NA); // Начальный адрес outcmd(KA); // Конечный адрес outcmd(0x22); // Установка строки outcmd(0); // Начальный адрес outcmd(6); // Конечный адрес DC = 1; //Данные CS = 0; for (l = 0; l < 20; l++) { // 20 столбцов for (k = 0; k < 7; k++) { // 7 строк outspi(ML[k]); // Закраска } } CS = 1; } // конец п/п //---------------------------- 2200 мВ , или , другими словами , область отображения напряжения на дисплее чуть больше реального напряжения . Поскольку каждая строка состоит из 8 пикселей , имеет смысл выяснить , какому напряжению соответствует каж - дая строка . Для этого умножим 40 мВ на 8 пикселей и получим : 40 мВ × 8 пик - селей = 320 мВ . Поскольку 7- я строка жёлтого цвета отражает режим работы выше предела , в котороммогут возник - нуть искажения , порог начала тако - го режима будет составлять : 6 строк × × 320 мВ = 1920 мВ . Учитывая , что Ку ОУ DA1 и DA2 составляет 2, реальное напря - жение порога будет составлять : 1920 мВ / / 2 = 960 мВ = 0,96 В , т . е . почти такому же значению (0,95 В ), которое использо - валось в пик - детекторе , описанном в [2]. Таким образом , получаем следу - ющий алгоритм получения высоты столбца для вывода на экран дисплея . Выясняем , сколько целых строк , например , переменная c содержит , если входное напряжение равно UL, для чего его необходимо разделить на 320: с = = UL/320. В эти ( нижние ) строки необ - ходимо выводить байт 0xff, т . е . полно - стью их закрашивать . Далее необходимо выяснить , сколько пикселей потребует - ся вывести в верхнюю строку , или , дру - гими словами , чему должно равняться значение самого верхнего байта . Для этого нужно получить остаток ost от деления (ost = UL % 320) и разделить его на 40 мВ , т . е . получить целую часть остатка (c_ost = ost/40). Необходимо отметить , что всё деление производит - ся в целых числах . Для получения зна - чения самого верхнего байта (byte_verh) количество его младших бит , которые соответствуют пикселям , должно рав - няться числу остатка c_ost. Если , напри - мер , c_ost = 3, то значение byte_verh = = 00000111, при c_ost = 5 byte_verh = =00011111 и т . п . Каким образом это получить ? Самый простой путь – напи - сать 7 операторов if, в которых перечис - лить все комбинации . Но такой путь , во - первых , очень долгий и , во - вторых , займёт много места в программе . Одна - ко можно поступить следующим про - стым способом . Если взять байт со всеми единицами 11111111 2 = 0xff и сдви - нуть его влево на число остатка , т . е . если , например , c_ost = 3, то при таком сдвиге правые три бита обнулятся : 11111000 2 . Если теперь инвертировать все биты полученного числа , то полу - чим 00000111, т . е . то , что требуется . Опе - ратор инверсии всех бит числа (~), как правило , называют двоичным дополне - нием или , реже , инверсией . Таким обра - зом , получаем следующее выражение для верхнего байта : byte_verh = ~(0xff << c_ost). Для вывода столбца предус - мотрен массив с 8- ю элементами ML[8], в который и будут выводиться данные . Исходя из количества столбцов в дис - плее (128), имеет смысл количество столбцов для каждой гистограммы принять равным 20, или , другими сло - вами , ширину гистограммы принять равной 20 пикселям , и две гистограм - мы расположить на некотором рассто - янии друг от друга . Например , гисто - грамму левого канала выводить с 90 по 110- й столбец , а правого – с 20 по 40- й . Подпрограмма вывода гистограм - мы outUL(uint16_t UL,uint8_t NK) так - же оформлена в виде функции , аргу - ментами которой являются входное напряжение (UL) и номер канала АЦП (NK). Для обращения к ней необходимо указать напряжение ( например , U1) и номер канала ( например , 1). Например , для вывода гистограммы левого кана - ла необходимо написать : outUL(U1,1). Подпрограмма с комментариями приведена в листинге 2, и , учитывая предыдущее объяснение , её неслож - но понять . Оценим время работы этой подпро - граммы . Скорость работы интерфейса SPI – около 12 Мбод ( см . рис . 4 е ), или 12 000 000 бод / 8 = 1 500 000 байт / с . Учи - тывая , что каждая гистограмма состоит из 20 столбцов по 7 байт каждый , полу -
RkJQdWJsaXNoZXIy MTQ4NjUy