硬汉嵌入式论坛

 找回密码
 立即注册
查看: 753|回复: 6
收起左侧

[有问必答] 在整定PID参数时,数值一直在震荡,振幅有40%,请各位指点指点

[复制链接]

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2025-3-17 09:45:51 | 显示全部楼层 |阅读模式
如题 ,现在在做一个给气囊打气,并将气囊压力保持在设定值的项目。气压传感器是IIC通信的,间隔1秒发送一次数据。微型气泵用来打气,使用PWM控制,因为气囊不大,微型气泵在PID工作时达不到工作电压范围就超调了,然后开始震荡。
又因为微型气泵不在工作电压范围,就导致在同一PWM值下,有时启动,有时不启动,现象就是一直在振幅40%左右震荡。
调整多次PID参数都是这样,没什么改善。第一次做PID,不是很懂,请各位大神指点指点。
PID参数初始化:

[C] 纯文本查看 复制代码
void  PID_Init(float Kp, float Ki, float Kd, float setpoint, float dt) 
{
    pid.Kp = Kp;                  	// 比例系数
    pid.Ki = Ki; 					// 积分系数
    pid.Kd = Kd;  					// 微分系数
    pid.setpoint = setpoint; 		// 目标压力值
    pid.integral = 0; 				// 积分项累计值,误差和
    pid.prev_error = 0;  			// 上一次误差(用于微分计算)
    pid.dt = dt;					// 控制周期(需与传感器采样周期匹配)
    pid.out_min = 0; 				// PWM最小占空比(如0%)
    pid.out_max = 360;				// PWM最大占空比(如100%)
}

[C] 纯文本查看 复制代码
    PID_Init(0.5, 0.03, 0.1, 50.0, 1);

PID计算函数:
[C] 纯文本查看 复制代码
float  PID_Compute(float measured) 
{
    float  error,derivative,output;
	//计算误差	
	error = pid.setpoint - measured;
    
    // 积分项
    pid.integral += error * pid.dt;
   
    // 微分项
	derivative = (error - pid.prev_error) / pid.dt;
    
    // 计算输出
    output = pid.Kp * error + pid.Ki * pid.integral + pid.Kd * derivative;
    
    // 输出限幅
    output = (output > pid.out_max) ? pid.out_max : 
             (output < pid.out_min) ? pid.out_min : output;
    
    return  output;
}

main函数调用:
[C] 纯文本查看 复制代码
		if(g_RunTime-TIME2>=1000)//1s间隔,因为传感器反应时间
		{
			Lwp6130_Send_Command_BLAST();
			current_pressure = Lwp6130_FullData_Read_BLAST();						
			
			// PID计算并更新PWM
			output1 = PID_Compute(current_pressure);			
			pwmvalue=(uint16_t)(output1*10+1000);
			printf("current_pressure=%f,output1=%f,pwmvalue=%d\r\n",current_pressure,output1,pwmvalue);
			TIM_SetCompare2(TIM4, pwmvalue); 

			TIME2=g_RunTime;
		}

PWM初始化:
[C] 纯文本查看 复制代码
TIM4_PWM_init(3599,0);

回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

积分
78
发表于 2025-3-17 19:20:45 | 显示全部楼层
去掉KI,只使用PD控制就可以了
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-3-18 09:28:36 | 显示全部楼层
xfcbbs2 发表于 2025-3-17 19:20
去掉KI,只使用PD控制就可以了

感谢回答,我试过了,还是不行
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-3-18 16:51:08 | 显示全部楼层
我有个 i2c 读气压传感器 然后 pid 控制气泵的开源项目,可以参考一下:

https://github.com/dukelec/cdpump
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-3-18 16:54:49 | 显示全部楼层
> 气压传感器是IIC通信的,间隔1秒发送一次数据
> 气囊不大

pid 控制,采集数据的频率不能太低,不然滞后严重容易震荡

再就是,pid 的波形要在电脑显示出来,开源 cdpump 的开源上位机就可以显示,这样方便查问题和调参数
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2025-3-18 18:46:52 | 显示全部楼层
用vofa之类的把你的气压的参数打印出来,看看曲线。
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-3-19 08:39:52 | 显示全部楼层
好的,感谢各位指点
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 03:31 , Processed in 0.054189 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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