#include <stdio.h>
#define DEV_MOTOR_RECV_MAX_LEN (100)
#define DEV_MOTOR_RECV_TIME_MAX (80)
#define DEV_MOTOR_SEND_MAX_LEN (20)
#define DEV_MOTOR_MAX_NUM (6)
#define DEV_MOTOR_PID_KP (100)
#define DEV_MOTOR_PID_KI (0.2)
#define DEV_MOTOR_PID_KD (0)
typedef struct
{
float target_val;
float err;
float err_last;
float Kp,Ki,Kd;
float integral;
float output_val;
}dev_motor_pid_t;
typedef struct
{
dev_motor_pid_t pid[DEV_MOTOR_MAX_NUM];
}dev_motor_t;
static dev_motor_t s_dev_motor;
float dev_motor_pid_realize(int index, float actual_val)
{
s_dev_motor.pid[index].err = 20 - actual_val;
s_dev_motor.pid[index].integral += s_dev_motor.pid[index].err;
s_dev_motor.pid[index].output_val = s_dev_motor.pid[index].Kp * s_dev_motor.pid[index].err +
s_dev_motor.pid[index].Ki * s_dev_motor.pid[index].integral +
s_dev_motor.pid[index].Kd * (s_dev_motor.pid[index].err - s_dev_motor.pid[index].err_last);
s_dev_motor.pid[index].err_last = s_dev_motor.pid[index].err;
return s_dev_motor.pid[index].output_val;
}
int main () {
for (int i = 0; i < DEV_MOTOR_MAX_NUM; i++)
{
s_dev_motor.pid[1].Kp = DEV_MOTOR_PID_KP;
s_dev_motor.pid[1].Ki = DEV_MOTOR_PID_KI;
s_dev_motor.pid[1].Kd = DEV_MOTOR_PID_KD;
}
printf("PID PWM:%.3f\n", dev_motor_pid_realize(1, 10));
return 0;
}