编辑代码

#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 = /*s_dev_motor.pid[index].target_val*/20 - actual_val;
    
    /*积分项*/
    s_dev_motor.pid[index].integral += s_dev_motor.pid[index].err;

    /*PID算法实现*/
    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 () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
    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;
}