#include <stdio.h>
// PID 구조체 정의
typedef struct {
double Kp; // 비례 상수
double Ki; // 적분 상수
double Kd; // 미분 상수
double prev_error; // 이전 오차
double integral; // 적분 값
} PIDController;
// PID 초기화 함수
void PID_Init(PIDController *pid, double Kp, double Ki, double Kd) {
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->prev_error = 0.0;
pid->integral = 0.0;
}
// PID 계산 함수
double PID_Compute(PIDController *pid, double setpoint, double measured_value,
double dt) {
double error = setpoint - measured_value;
pid->integral += error * dt;
double derivative = (error - pid->prev_error) / dt;
double output =
(pid->Kp * error) + (pid->Ki * pid->integral) + (pid->Kd * derivative);
pid->prev_error = error;
return output;
}
int main()
{
PIDController pid;
PID_Init(&pid, 1.0, 0.1, 0.01); // Kp, Ki, Kd 값 초기화
double setpoint = 100.0; // 목표 값
double measured_value = 0.0; // 초기 측정 값
double output = 0.0;
double dt = 1; // 시간 간격 (초 단위)
// 시뮬레이션 루프
for (int i = 0; i < 100; i++)
{
output = PID_Compute(&pid, setpoint, measured_value, dt);
// 여기서 measured_value는 시스템의 응답을 시뮬레이션하거나 실제 측정 값을
// 사용
measured_value += output * dt; // 단순 시뮬레이션을 위한 업데이트
printf("시간: %.1f, 출력: %.2f, 측정 값: %.2f\n", i * dt, output,
measured_value);
}
return 0;
}
# Kp, Ki, Kd 값을 조정하며 테스트하여 최적의 상태를 찾아야 함.
'Software > C언어' 카테고리의 다른 글
[C언어] unsigned 자료형 사용 시 주의사항 (0) | 2022.12.08 |
---|---|
[C언어] 문자열 입출력 함수 (0) | 2020.10.08 |
[C언어] 기본 입출력 함수 (0) | 2020.10.05 |
[C언어] visual studio 기본 사용법 (0) | 2020.09.24 |
[C언어] #include 의 " " 와 < > 의 차이 (0) | 2020.09.23 |