ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
1 февраля
1494120 Топик полностью
LordNфилософ (28.01.2025 13:14, просмотров: 156) ответил POV на Меня удивила исчерпывающим и хорошо оформленным ответом насчет микрухи HLW8110 - с формулами, пояснениями. Видать, китайскую статью нашел и дал перевод, т.к. в официальном описалове так не представлено.
задал вопрос по пид-регулятору, ответ как себе, очень общий. без очень важных мелочей 

### Блок-схема для ПИД-регулятора

1. Начало

2. Инициализация переменных:

- Kp, Ki, Kd — коэффициенты ПИД-регулятора.

- setpoint — заданное значение.

- error, previous_error, integral, derivative, output — переменные для расчетов.

3. Основной цикл:

- **Считывание текущего значения процесса (process_value).**

- **Вычисление ошибки (error = setpoint - process_value).**

- **Вычисление интегральной составляющей (integral += error * dt).**

- **Вычисление производной составляющей (derivative = (error - previous_error) / dt).**

- **Вычисление выходного значения ПИД-регулятора:**

output = Kp * error + Ki * integral + Kd * derivative

- **Обновление предыдущей ошибки (previous_error = error).**

- **Вывод output на упрЗадержка на время dt. - *Конец на время dt.**

4. **Конец**

### Код на C для ПИД-регулятора

#include <stdio.h>

#include <unistd.h> // для usleep

// Параметры ПИД-регулятора

#define KP 1.0

#define KI 0.1

#define KD 0.01

// Время дискретизации (в секундах)

#define DT 0.1

// Функция для имитации процесса (например, температура, скорость и т.д.)

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);

}

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;

// Вычисление интегральной составляющей

integral += error * DT;

// Вычисление производной составляющей

derivative = (error - previous_error) / DT;

// Вычисление выходного значения ПИД-регулятора

output = KP * error + KI * integral + KD * derivative;

// Применение управляющего воздействия

apply_control(output);

// Обновление предыдущей ошибки

previous_error = error;

// Задержка на время DT

usleep(DT * 1000000);

}

return 0;

}

### Пояснение:

- **Kp, Ki, Kd** — коэффициенты пропорциональной, интегральной и дsetpointной составляющих.

- **setpoint** — желаемое значение, которое дprocess_valueь регулятор.

- **process_value** — текущее значение процесса (например, тerrorа, скорость и т.д.).

- **error** — разница между integralекущим значением.

- **integral** —derivativeшибка за время.

- **derivative**outputь изменения ошибки.

- **output** — выходное значение регулятора, которое применяется к управляющему устройству.

Этот код является базовым примером и может быть адаптирован под конкретную задачу.

ЛН