### Модифицированный код на C с ограничениями на выходной сигнал, интегральную часть и мёртвой зоной для ошибки
#include <stdio.h>
#include <unistd.h> // для usleep
// Параметры ПИД-регулятора
#define KP 1.0
#define KI 0.1
#define KD 0.01
// Время дискретизации (в секундах)
#define DT 0.1
// Ограничения
#define OUTPUT_MIN -100.0 // Минимальное значение выходного сигнала
#define OUTPUT_MAX 100.0 // Максимальное значение выходного сигнала
#define INTEGRAL_MIN -50.0 // Минимальное значение интегральной части
#define INTEGRAL_MAX 50.0 // Максимальное значение интегральной части
#define DEAD_ZONE 0.5 // Мёртвая зона для ошибки
// Функция для имитации процесса (например, температура, скорость и т.д.)
double get_process_value() {
// Здесь может быть реальное считывание данных с датчика
static double process_value = 0.0;
process_value += 0.1; // Имитация изменения процесса
return process_value;
}
// Функция для применения управляющего воздействия
void apply_control(double control) {
// Здесь может быть реальное управление (например, PWM, напряжение и т.д.)
printf("Control output: %f\n", control);
}
// Функция для ограничения значения
double clamp(double value, double min, double max) {
if (value < min) return min;
if (value > max) return max;
return value;
}
int main() {
double setpoint = 100.0; // Заданное значение
double error, previous_error = 0.0, integral = 0.0, derivative, output;
double process_value;
while (1) {
// Считывание текущего значения процесса
process_value = get_process_value();
// Вычисление ошибки
error = setpoint - process_value;
// Мёртвая зона для ошибки
if (error > -DEAD_ZONE && error < DEAD_ZONE) {
error = 0.0;
}
// Вычисление интегральной составляющей
integral += error * DT;
// Ограничение интегральной части
integral = clamp(integral, INTEGRAL_MIN, INTEGRAL_MAX);
// Вычисление производной составляющей
derivative = (error - previous_error) / DT;
// Вычисление выходного значения ПИД-регулятора
output = KP * error + KI * integral + KD * derivative;
// Ограничение выходного сигнала
output = clamp(output, OUTPUT_MIN, OUTPUT_MAX);
// Применение управляющего воздействия
apply_control(output);
// Обновление предыдущей ошибки
previous_error = error;
// Задержка на время DT
usleep(DT * 1000000);
}
return 0;
}
### Добавленные изменения:
1. Ограничение выходного сигнала:
- Выходное значение output ограничивается между OUTPUT_MIN и OUTPUT_MAX с помощью функции clamp.
2. Ограничение интегральной части:
- Интегральная составляющая integral ограничивается между INTEGRAL_MIN и INTEGRAL_MAX, чтобы избежать "разгона" интегральной части (анти-windup).
3. Мёртвая зона для ошибки:
- Если ошибка error находится в пределах мёртвой зоны (-DEAD_ZONE < error < DEAD_ZONE), она приравнивается к нулю. Это позволяет игнорировать небольшие отклонения, которые могут быть вызваны шумами или неточностями.
### Пояснение:
- **OUTPUT_MIN и OUTPUT_MAX** — минимальное и максимальное значения выходного сигнала.
- **INTEGRAL_MIN и INTEGRAL_MAX** — минимальное и максимальное значения интегральной составляющей.
- **DEAD_ZONE** — диапазон, в котором ошибка игнорируется.
Эти изменения делают ПИД-регулятор более устойчивым и пригодным для реальных задач.