Интегратор: цифровой и аналоговый элемент схемы

Содержание

Интегратор – это электронный узел, выполняющий математическую операцию интегрирования. В цифровой технике интегратор реализуется с помощью специальных цифровых элементов, обладающих способностью накапливать сумму поданных на вход значений сигнала за определенный промежуток времени.

Виды интеграторов:

  1. Интегратор на операционном усилителе: чаще всего применяется в аналоговых схемах для выполнения операции интегрирования непрерывного сигнала.
  2. Цифровой интегратор: используется в цифровых устройствах для интегрирования ряда дискретных значений сигнала.

Особенности построения

Основой интегратора является элемент, способный складывать значения сигнала и выдавать их с учетом временных параметров. Для цифрового интегратора характерны использование цифровых элементов типа регистров, счетчиков, а также алгоритмов обработки данных.

Важным элементом в построении аналогового интегратора является операционный усилитель. На рисунке 1 показан сумматор-интегратор, также представлена формула расчета выходного напряжения. Если поменять местами резистор и конденсатор, получим дифференциатор.

Интегратор-сумматор на ОУ
Рисунок 1. Аналоговый интегратор с формулой расчета

В цифровом интеграторе важным элементом является запаздывающий регистр z^(-1), который накапливает значение. Данный тип интегратора представляет собой рекурсивный фильтр первого порядка с коэффициентом 1(b) и коэф a.

RTL примера модуля интегратора и отчет о компиляции
Рисунок 2. RTL Цифрового интегратора

Различие аналогового от цифрового

Основное различие между аналоговым и цифровым интегратором заключается в способе обработки сигнала. Аналоговый интегратор работает с непрерывными значениями входного сигнала, в то время как цифровой интегратор оперирует дискретными значениями, представленными в цифровой форме. Цифровой интегратор обладает более высокой точностью благодаря использованию цифровых методов обработки данных.

Применение интегратора

Интеграторы широко применяются в различных областях, включая системы управления, цифровую обработку сигналов, измерительные устройства, электронику медицинских приборов и многое другое. Они позволяют проводить анализ сигналов, вычислять интегралы сигналов и выполнять другие полезные функции.

Реализация Цифрового Интегратора на языке Verilog

В интегратор реализованы следующие параметры:

  • KOEF_ENA — Учитывает коэффициент перед фильтром. Данный коэффициент представляет 1/период дискретизации.
  • PERIOD — Период дискретизации. Схема расчета описана ниже и в комментариях кода.
  • DATA_WIDTH — Битовая длина информационной линии.
Точечная нотация фиксированной точки равна 1.15. На такой нотации работают большинство сигнальных процессоров. Код создавался и тестировался Quartus9.1, поэтому была необходимость прописывать умножение отдельным модулем. Однако, программа также можно использовать в своих проекта на Xilinx. Реализация параметров PERIOD не возможна на системных функциях в Quartus9.1, но проектах Vivado можно задействовать функции. Иным образом программа искажала generate RTL(см generate).
module integr(data, clk, reset, out, cn); // 1 - включение коэф дискретизации, 0 - отключение parameter KOEF_ENA = 1; // мой пример... Частота дискретизации 500 КГц. 1/500 = 0.002 // В данном случае точечная нотация с фиксированой точкой 1.15 // следовательно. 0.002*(2**16) = 65.536 => PERIOD = 65 parameter [15: 0] PERIOD = 82; parameter DATA_WIDTH = 16; input [(DATA_WIDTH - 1): 0] data; input reset, clk; output [(DATA_WIDTH - 1): 0] out; output [(DATA_WIDTH - 1): 0] cn; // переполнение wire [(DATA_WIDTH*2 - 1): 0] koef_after; wire [(DATA_WIDTH - 1): 0] add1; reg [(DATA_WIDTH - 1): 0] z1 = 0; generate if (KOEF_ENA) begin unsigned_multiply #(DATA_WIDTH - 1) mult1(PERIOD, data, koef_after); end else begin assign koef_after = {data, 15'h00}; end endgenerate assign {cn, add1} = (koef_after >> 15) + z1; assign out = add1; always @(posedge clk, posedge reset) begin if (reset) begin z1 <= 0; end else begin z1 <= add1; end end endmodule module unsigned_multiply #(parameter WIDTH=8) ( input [WIDTH-1:0] dataa, input [WIDTH-1:0] datab, output [2*WIDTH-1:0] dataout ); assign dataout = dataa * datab; endmodule

Пример реализации интегратора на STM32

Для создания интегратора на микроконтроллере STM32F401, принимающего данные по SPI на частоте 1 МГц, вам потребуется настроить периферию SPI и реализовать алгоритм интегрирования данных. Ниже приведен пример кода на языке программирования C/C++ для STM32CubeIDE, который настраивает SPI на частоту 1 МГц и реализует простой интегратор для принятия данных по SPI:
#include "stm32f4xx_hal.h" SPI_HandleTypeDef hspi; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); uint8_t receivedData; uint32_t sum = 0; while (1) { HAL_SPI_Receive(&hspi, &receivedData, 1, HAL_MAX_DELAY); sum += receivedData; // Простой интегратор, складываем принятые данные } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_SPI1_Init(void) { hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_SLAVE; hspi.Init.Direction = SPI_DIRECTION_2LINES; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.TIMode = SPI_TIMODE_DISABLE; hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi.Init.CRCPolynomial = 10; hspi.Init.NSS = SPI_NSS_SOFT; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // Настройка скорости передачи hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; if (HAL_SPI_Init(&hspi) != HAL_OK) { Error_Handler(); } }

Данный код настраивает SPI1 в режиме SLAVE, принимает данные и суммирует их в переменной ‘sum’. Не забудьте дополнить код обработчиками прерываний, если они необходимы в вашем приложении.

Заключение

Интегратор цифровой элемент – важный компонент современной электроники, находящий применение в различных областях науки и техники. Понимание его принципов работы и особенностей построения позволяет создавать более эффективные устройства и системы. Данная статья поможет широкому аудиторию получить информацию о данном уникальном узле электроники.