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

[复制链接]
1850|19
 楼主| Hellobaby123 发表于 2018-7-18 15:01 | 显示全部楼层 |阅读模式
定义一个结构体如下:
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);   //在此函数运行完之后,结构体中不该改变的数据都被改变了

 楼主| Hellobaby123 发表于 2018-7-18 15:03 | 显示全部楼层
double setpoint;             //设定值
        
        double proportiongain;       //比列系数  p  测试 设置为0.2
        
        double integralgain;         //积分系数  i   测试 设置为0.015
        
        double derivativegain;        //微分系数   d  测试 设置为 0.2
        
这四个数据自从初始化完之后就没有对他们进行赋值,但是值却发生了改变,是什么原因呢?
ayb_ice 发表于 2018-7-18 15:11 | 显示全部楼层
//产生结构体变量
PID *testPID;

这个是指针,并没有定义PID类型的变量
应该是
PID testPID;
wowu 发表于 2018-7-18 15:11 | 显示全部楼层
存储位置随机,得到的就是随机的

评论

已经初始化之后,值就应该是我赋给他的数据啊  发表于 2018-7-18 15:27
 楼主| Hellobaby123 发表于 2018-7-18 15:25 | 显示全部楼层
ayb_ice 发表于 2018-7-18 15:11
//产生结构体变量
PID *testPID;

是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢?
ayb_ice 发表于 2018-7-18 15:32 | 显示全部楼层
Hellobaby123 发表于 2018-7-18 15:25
是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢? ...

指针都没有指向具体实例,当然会错了,不死机就是非常幸运了

评论

PID_init(2000,0.2,0.015,0.2,0,0,testPID); 有这个赋值的,还需要怎么操作?  发表于 2018-7-18 16:00
八层楼 发表于 2018-7-18 15:33 | 显示全部楼层
楼主有没有注意过 变成什么值了 呢 是每次都变成固定值还是随机值

评论

很奇怪的值  发表于 2018-7-18 16:00
ayb_ice 发表于 2018-7-18 15:33 | 显示全部楼层
PID testPID;
PID_init(2000,0.2,0.015,0.2,0,0,&testPID);
PIDRegulation(&testPID,testPID.result);

评论

哦哦,明白了,是没有实列造成的。谢谢!  发表于 2018-7-18 16:11
没有问题了,请问是什么原因造成这个问题的呢?  发表于 2018-7-18 16:07
我试试这样的  发表于 2018-7-18 16:01
我试试这样的  发表于 2018-7-18 16:01
江闲月 发表于 2018-7-18 16:22 | 显示全部楼层
二楼说的对,你只定义了一个野指针而已,根本没指向具体的变量空间。这种情况死机都算正常的。
yiyigirl2014 发表于 2018-7-18 20:06 | 显示全部楼层
这是自己写的PID?
wowu 发表于 2018-7-20 08:41 | 显示全部楼层
六楼正解  我也算是学习了
磨砂 发表于 2018-7-21 08:21 | 显示全部楼层
原来如此 不过调试的时候是可以看到他的指向的啊
Mattheww 发表于 2018-7-23 19:10 | 显示全部楼层
那变成什么值了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部