打印
[STM8]

STM8S105K4结构体变量被改变

[复制链接]
652|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingy|  楼主 | 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);   //在此函数运行完之后,结构体中不该改变的数据都被改变了

使用特权

评论回复
沙发
dingy|  楼主 | 2022-2-20 15:29 | 只看该作者
double setpoint;             //设定值
        
        double proportiongain;       //比列系数  p  测试 设置为0.2
        
        double integralgain;         //积分系数  i   测试 设置为0.015
        
        double derivativegain;        //微分系数   d  测试 设置为 0.2
        
这四个数据自从初始化完之后就没有对他们进行赋值,但是值却发生了改变,是什么原因呢?

使用特权

评论回复
板凳
renyaq| | 2022-2-20 15:30 | 只看该作者

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

这个是指针,并没有定义PID类型的变量
应该是
PID testPID;

使用特权

评论回复
地板
zhenykun| | 2022-2-20 15:32 | 只看该作者
存储位置随机,得到的就是随机的

使用特权

评论回复
5
dingy|  楼主 | 2022-2-20 15:34 | 只看该作者
是指针,我说错了,使用也是指针方式使用的,但是那四个值为什么会改变呢?

使用特权

评论回复
6
pengf| | 2022-2-20 15:36 | 只看该作者

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

使用特权

评论回复
7
zwll| | 2022-2-20 15:38 | 只看该作者
楼主有没有注意过 变成什么值了 呢 是每次都变成固定值还是随机值

使用特权

评论回复
8
renyaq| | 2022-2-20 15:40 | 只看该作者

PID testPID;
PID_init(2000,0.2,0.015,0.2,0,0,&testPID);
PIDRegulation(&testPID,testPID.result);

使用特权

评论回复
9
dingy|  楼主 | 2022-2-20 15:42 | 只看该作者
二楼说的对,你只定义了一个野指针而已,根本没指向具体的变量空间。这种情况死机都算正常的。

使用特权

评论回复
10
zwll| | 2022-2-20 15:44 | 只看该作者

这是自己写的PID?

使用特权

评论回复
11
dengdc| | 2022-2-20 15:46 | 只看该作者
原来如此 不过调试的时候是可以看到他的指向的啊

使用特权

评论回复
12
xxrs| | 2022-2-20 15:49 | 只看该作者
那变成什么值了呢

使用特权

评论回复
13
pengf| | 2022-2-20 15:51 | 只看该作者
真的看不懂啊

使用特权

评论回复
14
jlyuan| | 2022-2-20 15:53 | 只看该作者
指针指的有问题?

使用特权

评论回复
15
chuxh| | 2022-2-20 15:59 | 只看该作者
别用指针会不会好点

使用特权

评论回复
16
stly| | 2022-2-20 16:02 | 只看该作者
没用过结构体

使用特权

评论回复
17
dengdc| | 2022-2-20 16:04 | 只看该作者
应该是指针误操作了

使用特权

评论回复
18
dingy|  楼主 | 2022-2-20 16:05 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

745

主题

10920

帖子

6

粉丝