ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
1 февраля
1494485 Топик полностью
Eddy_Em (30.01.2025 09:46, просмотров: 115) ответил LordN на смотри ниже, я его тоже просил об этом же, он мне что-то написал, но такое, использовать в лоб нельзя, надо долго и нудно пилить напильником
Жесть-то какая! Зачем на ублюдской змеюке-то? 

Я на С попросил, он дал очень даже вменяемый код:

#include <stdio.h>
#include <time.h>

// PID structure to hold controller state
typedef struct {
    double Kp;  // Proportional gain
    double Ki;  // Integral gain
    double Kd;  // Derivative gain
    double setpoint;  // Desired value
    double integral;  // Integral term
    double previous_error;  // Previous error for derivative term
    clock_t last_time;  // Last time stamp for time delta calculation
} PIDController;

// Initialize PID controller
void PID_Init(PIDController *pid, double Kp, double Ki, double Kd, double setpoint) {
    pid->Kp = Kp;
    pid->Ki = Ki;
    pid->Kd = Kd;
    pid->setpoint = setpoint;
    pid->integral = 0.0;
    pid->previous_error = 0.0;
    pid->last_time = clock();
}

// Compute PID output
double PID_Compute(PIDController *pid, double measured_value) {
    // Calculate time difference
    clock_t now = clock();
    double time_diff = (double)(now - pid->last_time) / CLOCKS_PER_SEC;
    pid->last_time = now;

    // Calculate error
    double error = pid->setpoint - measured_value;

    // Proportional term
    double Pout = pid->Kp * error;

    // Integral term
    pid->integral += error * time_diff;
    double Iout = pid->Ki * pid->integral;

    // Derivative term
    double derivative = (error - pid->previous_error) / time_diff;
    double Dout = pid->Kd * derivative;

    // Save error for next derivative calculation
    pid->previous_error = error;

    // Calculate total output
    double output = Pout + Iout + Dout;

    return output;
}

int main() {
    // Example usage
    PIDController pid;
    double setpoint = 100.0;  // Desired value
    double measured_value = 0.0;  // Initial measured value

    // Initialize PID controller with gains and setpoint
    PID_Init(&pid, 2.0, 0.5, 1.0, setpoint);

    // Simulate control loop
    for (int i = 0; i < 100; i++) {
        // Compute PID output
        double output = PID_Compute(&pid, measured_value);

        // Simulate system response (e.g., update measured_value)
        measured_value += output * 0.1;  // Example system dynamics

        // Print results
        printf("Iteration %d: Setpoint = %.2f, Measured = %.2f, Output = %.2f\n",
               i, setpoint, measured_value, output);

        // Simulate delay (e.g., for real-time systems)
        // sleep(1);  // Uncomment if running in a real-time environment
    }

    return 0;
}



Вот хоть прямо так бери куски, и используй. Хоть на ПК, хоть на МК…


[code]

test

[/code]

eddy-em.livejournal.com github.com/eddyem