PID算法测试
#include <stdlib.h>
#include <stdio.h>
int right_speed;
int left_speed;
float Kp = 10, Ki = 0.5, Kd = 0.1;
float error = 0, P = 0, I = 0, D = 0, PID_value = 0;
float previous_error = 0;
int sensor[5] = {0, 0, 0, 0, 0};
int initial_motor_speed = 50;
void read_sensor_values(void);
void calc_pid(void);
void motor_control(void);
void operation(void);
void line(void)
{
printf("*************************************");
}
int main(void)
{
int i , j , count;
printf("请输入测试次数:\n");
scanf("%d",&count);
for(i=0;i<count;i++)
{
line();
line();
printf("\n\n(%d)请输入五路传感器数值\n",i+1);
for(j=0;j<5;j++)
scanf("%d",&sensor[j]);
printf("\n输入成功!\n");
read_sensor_values();
calc_pid();
motor_control();
operation();
line();
}
}
void read_sensor_values()
{
sensor[5]=1;
if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
{
error = 0;
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
error = 0;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
{
error = 3;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
error = 2;
}
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
error = -3;
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
error = -2;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
error = 2;
}
if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 1))
{
error = 3;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 1) && (sensor[4] == 0))
{
error = 2;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
error = 0;
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
error = -2;
}
else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
error = -3;
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
if (error == -2)
{
error = -3;
}
else
{
error = 3;
}
}
}
void calc_pid()
{
P = error;
I = I + error;
D = error - previous_error;
PID_value = (Kp * P) + (Ki * I) + (Kd * D);
previous_error = error;
printf("\n\nerror(误差)=%f\npid_value(pid值)=%f\n\n",error,PID_value);
}
void motor_control()
{
left_speed = initial_motor_speed + PID_value;
right_speed = initial_motor_speed - PID_value;
if(left_speed <0)
{
left_speed = 0;
}
if(left_speed > 100)
{
left_speed = 100;
}
if(right_speed < 0)
{
right_speed = 0;
}
if(right_speed > 100)
{
right_speed = 100;
}
}
void operation(void)
{
if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
{
printf("up\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
printf("up\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
printf("left\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
printf("left\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 1))
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 1) && (sensor[4] == 0))
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
{
printf("up\nright_speed=%d\nleft_speed=%d\n",50,50);
}
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
printf("left\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
printf("left\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
if (error < 0)
{
printf("left\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else if(error > 0)
{
printf("right\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
else
{
printf("stop\nright_speed=%d\nleft_speed=%d\n",right_speed,left_speed);
}
}
}