Современная электроника №9/2019

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 54 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2019 Пирометр на ПЛИС Часть 2 Во второй части статьи, посвящённой описанию работы пирометра на базе промышленного инфракрасного датчика температуры, рассматриваются проект ПЛИС, наладка и регулировка устройства, а также рассказывается об осуществлении обмена данными с ПК. Павел Редькин (ppr1@yandex.ru) П РОЕКТ ПЛИС Проект ПЛИС пирометра написан на алгоритмическом языке Verilog HDL. Он включает в себя следующие модули: модуль верхнегоуровня (файлTEMPER_ IR_LCD0802.v), модульФАПЧ(файлALT_ PLL.v), модуль подавления дребезжания кнопок (файлnoise_filter_butt.v), модуль формирования сигналов озвучивания кнопок (файлbuzzer_butt.v), модульобме- на данными с датчиком температуры семейства MLX90614 (файл MLX90614_ wr_rd.v), модульрасчётаCRC (файлCRC8_ D40.v), модульобмена даннымисмикро- схемой FRAM-памяти FM24LC16 (файл FM24LC16_wr_rd.v), модуль передачи байта данных через UART (файл UART_ byte_tx.v), модуль приёма байта данных черезUART (файлUART_byte_rx.v), модуль двухступенчатоготриггера дляформиро- вания положительных импульсов дли- тельностью один период синхросигна- ла по фронту входного сигнала (файл Trigger_2st_front.v), модульпреобразова- ния чиселиз двоичного в двоично-деся- тичноечетырёхразрядноепредставление (файл binar_BCD_XXXX.v). Общая структура проектаПЛИС доста- точно полноиллюстрируется структур- ной схемой устройства [1]. Модуль верх- него уровня включает в себя несколько контроллеров, не выделенных в проек- те в отдельныефайлы: контроллерЖКИ, контроллер обработки сигналов кнопок, контроллер формирования звуковых сигналов, контроллер передачи блока данных через UART, контроллерприёма блока данных через UART, контроллер вычислений и сравнения результата с порогом (вычислитель). В состав вычис- лителя также входит контроллер вычис- ления значения CRC и его сравнения со значением СRC, принятым из датчика. Описанный ранее алгоритм вычисле- ния температурыдатчика снекоторыми вариациями реализован в вычислителе. Поскольку всематематическиеоперации в этомпроекте являютсяцелочисленны- ми, тодля достижения требуемых точно- стииразрешающейспособностиизмери- теляониосуществляютсянадисходными значениямитемпературы T A и T O , предва- рительноумноженнымина10. Дробные части этих исходных значений, а также дробные части результатов операций над ними при вычислениях отбрасыва- ются. Таким образом, в качестве конеч- ного результата вычислений получает- ся целочисленное значение температу- ры, представленное в единицах0,1°C. Это значение в десятичномвиде с десятичной запятойпередмладшимразрядомотобра- жается на ЖКИ, а также выдаётся через UART. Указаннымспособомобеспечива- етсяразрешающая способность вычисли- теля, равная0,1°C. Такоеразрешение явля- ется достаточным для обеспечения точ- ностиизмерений, равной 0,2°C. Вместо деления на 50 в проектеПЛИС реализовано умножение на 41943 с последующим делением на 2097152. Пара чисел 41943 и 2097152 подобрана из расчёта 41943/2097152=0,0199999 ≈ ≈ 0,02=1/50. Это сделано для обеспечения максимальной точности вычислений. Операция умножения над целочислен- ными сомножителями в проекте ПЛИС даёт целый результат без появления каких-либоошибок, однакоприделении целыхчисел вПЛИСдробная часть част- ногобудет автоматическиотброшена, и этоприведёт кпоявлениюошибкиокру- гления, которая будет темзначительнее, чемменьше делимое. Вместо этогоисход- ное значение температуры умножается на 41943, а вместо деления на 2097152 используется логический сдвиг вправона 21разряд, поскольку 2097152=2 21 . Приме- нённый способцелочисленного деления Листинг 1 // деление результата умножения на 2097152 = 2**21, // что эквивалентно лог сдвигу вправо на 21 разряд //result_ – результат умножения слова данных из датчика на 419430 Temper_kelvin_x10_ish <= (result_ >> 21); Листинг 2 // Преобразование результата вычитания // (в регистре result_sub) из дополнительного кода в прямой код // с выводом на индикацию знака получившегося числа (значение температуры) // Результат преобразования (Temper_decimal) направляется на преобра- зование из двоичного в двоично-десятичный вид always@(posedge clk_pll) begin if (result_sub[15] == 0) // результат вычитания положительный // (знаковый разряд 0) begin Temper_decimal <= result_sub; // преобразование не требуется, // результат готов if (Temper_decimal == 0) begin REG_LCD_STR1_POZ0 <= " "; // индикация нулевого // результата end else begin REG_LCD_STR1_POZ0 <= "+"; // индикация // положительного результата end end else // результат вычитания отрицательный // (знаковый разряд 1) begin // преобразование отрицательного результата // из дополнительного в прямой код Temper_decimal <= ~(result_sub - 1); // вычитание из числа 1 и // побитовая инверсия разности // запись преобразованного результата в прямом коде REG_LCD_STR1_POZ0 <= "-"; // индикация // отрицательного результата end end

RkJQdWJsaXNoZXIy MTQ4NjUy