ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
1 февраля
1494124 Топик полностью
Связанные сообщения
Personal
Ну что же. Купил DHO914 за 87 тыс.2025-01-20
Где в даташитах на тиристоры указывается встроенное сопротивление утечки между управляющим электродом и катодом?2025-01-16
я использую. считаю что пить можно и нужно. что бы печень не пострадала от радости, это нужно делать грамотно. использую самопер...2025-01-08
Смотри чего алишечка накинула. Можно аж в несколько слоев усадить.2024-12-25
Я бы вам рекомендовал обычный резистивный делитель 1:2 или 1:3 или 1:4 так, чтобы при 1В в цепи 120В на входе АЦП было бы 0,5......2024-08-29
[обновлено 17.04.24]купил себе домой rigol mso5074, накатил патч. теперь он mso5354. все работает.2024-04-19
Ещё так можно.2022-08-08
LordNфилософ (28.01.2025 13:22, просмотров: 158) ответил LordN на задал вопрос по пид-регулятору, ответ как себе, очень общий. без очень важных мелочей
### Модифицированный код на C с ограничениями на выходной сигнал, интегральную часть и мёртвой зоной для ошибки 

### Модифицированный код на 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** — диапазон, в котором ошибка игнорируется.

Эти изменения делают ПИД-регулятор более устойчивым и пригодным для реальных задач.

ЛН