在keil5用结构体写pid时我这样写结构体里头的变量无法初始化,请问我的代码有什么问题吗,求指教
PID.h
#ifndef __pid_h
#define __pid_h
#define kp_speed 0
#define ki_speed 0
typedef struct
{
float kp,ki;
int err,last_err;
int integral,maxintegral;
int output,maxoutput;
}SpeedPid;
//速度环pid结构体
PID.c
#include "pid.h"
SpeedPid pid_speed;
void SpeedPid_Init(void)
{
pid_speed.kp=kp_speed;
pid_speed.ki=ki_speed;
pid_speed.err=0;
pid_speed.last_err=0;
pid_speed.integral=0;
pid_speed.maxintegral=10000;
pid_speed.output=0;
pid_speed.maxoutput=999;
}//初始化SpeedPid结构体
int speed_pid(SpeedPid* pidv,int target_speed,int current_speed)//速度环pid
{
pidv->err=target_speed-current_speed;//目标值和当前值做差
if(pidv->err<0.3&&pidv->err>-0.3)pidv->err=0;//当偏差很小时默认误差为0以滤除部分误差
pidv->integral+=pidv->err;//积分项
if(pidv->integral < -pidv->maxintegral) pidv->integral = -pidv->maxintegral;//积分限幅
else if(pidv->integral > pidv->maxintegral) pidv->integral = pidv->maxintegral;
pidv->output=(pidv->kp*pidv->err)+(pidv->ki*pidv->integral);//输出量累计
if(pidv->output>pidv->maxoutput)pidv->output=pidv->maxoutput;//速度环pwm波输出限制
else if(pidv->output<1)pidv->output=1;
else pidv->output=pidv->output;
pidv->last_err=pidv->err;//将err的值给last_err,为下一次pid做准备
return pidv->output;
}
main.c
#include "pid.h"
int PWM;
SpeedPid PIDS;
SpeedPid_Init();
PWM=speed_pid(&PIDS,Targetspeed,CurrentSpeed);
Setmotorvoltage(PWM);//速度环pid计算后输出