[STM8] STM8S105K4结构体变量被改变

[复制链接]
 楼主| 发表于 2022-2-20 15:27 | 显示全部楼层 |阅读模式
定义一个结构体如下:
typedef struct{
        double setpoint;             //设定值
        
        double proportiongain;       //比列系数  p  测试 设置为0.2
        
        double integralgain;         //积分系数  i   测试 设置为0.015
        
        double derivativegain;        //微分系数   d  测试 设置为 0.2
        
        double lasterror;              //前一拍偏差
        
        double result;                //输出值
        
        double integral;               //积分值 误差值之和
}PID;

//调整函数
void PIDRegulation(PID * vPID,double processValue){          //此算法出现问题的原因是在操作结构体的其他元素时,会不知名导致另外元素的值发生
                                                               //改变解决办法是将里面的可能发生改变的量用其它变量来代替
        double thisError;                  //定义误差
        aa=0.2;
        bb=0.015;
        cc=0.2;
        thisError = vPID->setpoint-processValue;  //计算误差
        
        vPID->integral += thisError;       //误差求和
        vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
        
        vPID->lasterror = thisError;

}

//初始化函数
void PID_init(float set,float p,float i,float d,float error,float sumi,PID *tempPID){
        tempPID->setpoint = set;
        tempPID->proportiongain = p;
        tempPID->integralgain = i;
        tempPID->derivativegain = d;
        tempPID->lasterror = error;
        tempPID->integral = sumi;
        tempPID->result = 0;
}

//产生结构体变量
PID *testPID;

//赋值
PID_init(2000,0.2,0.015,0.2,0,0,testPID);
//调用调整函数
PIDRegulation(testPID,testPID->result);   //在此函数运行完之后,结构体中不该改变的数据都被改变了
 楼主| 发表于 2022-2-20 15:29 | 显示全部楼层
double setpoint;             //设定值
        
        double proportiongain;       //比列系数  p  测试 设置为0.2
        
        double integralgain;         //积分系数  i   测试 设置为0.015
        
        double derivativegain;        //微分系数   d  测试 设置为 0.2
        
这四个数据自从初始化完之后就没有对他们进行赋值,但是值却发生了改变,是什么原因呢?
发表于 2022-2-20 15:30 | 显示全部楼层

//产生结构体变量
PID *testPID;

这个是指针,并没有定义PID类型的变量
应该是
PID testPID;
发表于 2022-2-20 15:32 | 显示全部楼层
存储位置随机,得到的就是随机的
 楼主| 发表于 2022-2-20 15:34 | 显示全部楼层
是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢?
发表于 2022-2-20 15:36 | 显示全部楼层

指针都没有指向具体实例,当然会错了,不死机就是非常幸运了
发表于 2022-2-20 15:38 | 显示全部楼层
楼主有没有注意过 变成什么值了 呢 是每次都变成固定值还是随机值
发表于 2022-2-20 15:40 | 显示全部楼层

PID testPID;
PID_init(2000,0.2,0.015,0.2,0,0,&testPID);
PIDRegulation(&testPID,testPID.result);
 楼主| 发表于 2022-2-20 15:42 | 显示全部楼层
二楼说的对,你只定义了一个野指针而已,根本没指向具体的变量空间。这种情况死机都算正常的。
发表于 2022-2-20 15:44 | 显示全部楼层

这是自己写的PID?
发表于 2022-2-20 15:46 | 显示全部楼层
原来如此 不过调试的时候是可以看到他的指向的啊
发表于 2022-2-20 15:49 | 显示全部楼层
那变成什么值了呢
发表于 2022-2-20 15:51 | 显示全部楼层
真的看不懂啊
发表于 2022-2-20 15:53 | 显示全部楼层
指针指的有问题?
发表于 2022-2-20 15:59 | 显示全部楼层
别用指针会不会好点
发表于 2022-2-20 16:02 | 显示全部楼层
没用过结构体
发表于 2022-2-20 16:04 | 显示全部楼层
应该是指针误操作了
 楼主| 发表于 2022-2-20 16:05 | 显示全部楼层
嗯,我再好好缕一缕吧,有了好消息及时通知大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

745

主题

10920

帖子

6

粉丝
快速回复 返回顶部 返回列表