打印
[STM8]

STM8S105K4结构体变量被改变

[复制链接]
1583|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 | 只看该作者
存储位置随机,得到的就是随机的

使用特权

评论回复
评论
Hellobaby123 2018-7-18 15:27 回复TA
已经初始化之后,值就应该是我赋给他的数据啊 
5
Hellobaby123|  楼主 | 2018-7-18 15:25 | 只看该作者
ayb_ice 发表于 2018-7-18 15:11
//产生结构体变量
PID *testPID;

是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢?

使用特权

评论回复
6
ayb_ice| | 2018-7-18 15:32 | 只看该作者
Hellobaby123 发表于 2018-7-18 15:25
是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢? ...

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

使用特权

评论回复
评论
Hellobaby123 2018-7-18 16:00 回复TA
PID_init(2000,0.2,0.015,0.2,0,0,testPID); 有这个赋值的,还需要怎么操作? 
7
八层楼| | 2018-7-18 15:33 | 只看该作者
楼主有没有注意过 变成什么值了 呢 是每次都变成固定值还是随机值

使用特权

评论回复
评论
Hellobaby123 2018-7-18 16:00 回复TA
很奇怪的值 
8
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);

使用特权

评论回复
评论
Hellobaby123 2018-7-18 16:11 回复TA
哦哦,明白了,是没有实列造成的。谢谢! 
Hellobaby123 2018-7-18 16:07 回复TA
没有问题了,请问是什么原因造成这个问题的呢? 
Hellobaby123 2018-7-18 16:01 回复TA
我试试这样的 
Hellobaby123 2018-7-18 16:01 回复TA
我试试这样的 
9
江闲月| | 2018-7-18 16:22 | 只看该作者
二楼说的对,你只定义了一个野指针而已,根本没指向具体的变量空间。这种情况死机都算正常的。

使用特权

评论回复
10
yiyigirl2014| | 2018-7-18 20:06 | 只看该作者
这是自己写的PID?

使用特权

评论回复
11
wowu| | 2018-7-20 08:41 | 只看该作者
六楼正解  我也算是学习了

使用特权

评论回复
12
磨砂| | 2018-7-21 08:21 | 只看该作者
原来如此 不过调试的时候是可以看到他的指向的啊

使用特权

评论回复
13
Mattheww| | 2018-7-23 19:10 | 只看该作者
那变成什么值了呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝