锟0409 2023-11-05 15:16 采纳率: 0%
浏览 33

在keil5写结构体时遇到的一些问题

在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计算后输出
  • 写回答

2条回答 默认 最新

  • 机电侠克 2023-11-05 15:25
    关注

    改变一下PID初始化函数,这个函数传入要初始化的结构体变量,PID.c定义结构体删掉

    评论

报告相同问题?

问题事件

  • 修改了问题 11月5日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开