这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 手把手教你玩转直流电机双环PID调试

共170条 1/17 1 2 3 4 5 6 ›| 跳转至

手把手教你玩转直流电机双环PID调试

助工
2015-10-29 16:20:45     打赏

直流电机速度位置双环控制简明教程

1.速度闭环控制

我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器是通过软件实现其控制算法的,所以必须对模拟调节器进行离散化处理,这样它只需根据采样时刻的偏差值计算控制量。因此,我们需要使用离散的差分方程代替连续的微分方程。

假定采样时间很短时(我们的代码中是10ms),可做如下处理:

用一介差分代替一介微分;

用累加代替积分。

根据增量式离散PID公式

Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

e(k)本次偏差

e(k-1)上一次的偏差

e(k-2)次的偏差

Pwm代表增量输出

在我们的速度控制闭环系统里面只使用PI控制,因此对PID控制器可简化为以下公式:

Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)

具体通过C语言实现的代码如下:

int Incremental_PI (int Encoder,int Target)

{

float Kp=100,Ki=100; //PI参数由电机的种类和负载决定

static int Bias,Pwm,Last_bias;

Bias=Encoder-Target; //计算偏差

Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器

Last_bias=Bias; //保存上一次偏差

return Pwm; //增量输出

}

入口参数为编码器的速度测量值和速度控制的目标值,返回值为电机控制PWM。

第一行代码为PI参数的定义,PI参数在不同的系统中不一样,我们的代码中的PID参数,仅针对平衡小车之家的电机空载时调试得到。

第二行是相关内部变量的定义。

第三行是求出速度偏差,由测量值减去目标值。

第四行使用增量PI控制器求出电机PWM。

第五行保存上一次偏差,便于下次调用。

最后一行是返回。

在10ms定时中断里面调用该函数实现我们的控制目标:

Moto1=Incremental_PI(Encoder,Target_velocity);

Set_Pwm(Moto1);       //===赋值给对应MCU的PWM寄存器

具体请结合完整代码理解,我们的代码基于STM32F103C8控制器,但是把基于C语言的PID控制器部分剥离,并放在control.c里面,故对STM32不熟悉的同学依然可以使用记事本打开这个文件观看。

2.位置闭环控制

根据位置式离散PID公式

Pwm=Kp*e(k)+Ki*e(k)+Kd[e(k)-e(k-1)]

e(k):本次偏差

e(k-1):上一次的偏差

∑e(k):e(k)以及之前的偏差的累积和;其中k为1,2,,k;

Pwm代表输出

在我们的位置控制闭环系统里面只使用PI控制,因此对PID控制器可简化为以下公式:

Pwm=Kp*e(k)+Ki*∑e(k)

具体通过C语言实现的代码如下:

int Position_PI (int Encoder,int Target)

{

float Kp=15,Ki=0.01;

static int Bias,Pwm,Integral_bias;

Bias=Encoder-Target;                //计算偏差

Integral_bias+=Bias; //求出偏差的积分

Pwm=Kp*Bias+Ki*Integral_bias;       //位置式PI控制器

return Pwm;                         //增量输出

}

入口参数为编码器的位置测量值和位置控制的目标值,返回值为电机控制PWM。

第一行代码为PI参数的定义,PI参数在不同的系统中不一样,我们的代码中的PID参数,仅针对平衡小车之家的电机空载时调试得到。

第二行是相关内部变量的定义。

第三行是求出速度偏差,由测量值减去目标值。

第四行通过累加求出偏差的积分。

第五行使用位置式PI控制器求出电机PWM。

最后一行是返回。

在10ms定时中断里面调用该函数实现我们的控制目标:

Moto1=Position_PI(Encoder,Target_position);

Set_Pwm(Moto1);       //===赋值给PWM寄存器

具体请结合完整代码理解。

3.速度位置双环控制

速度位置双环控制由以上两个控制器进行嵌套,具体原理不再细讲,只对核心代码进行讲解:

Encoder=Read_Encoder(2);

Position+=Encoder;

Moto1=Position_PI(Position,Target_position);

Moto1=Incremental_PI(Encoder,-Moto1);

第一行是通过M法测速获得电机速度。

第二行是通过累加求出速度的积分,也就是电机的位置信息。

第三行是位置外环控制器,求出控制输出量,作为速度内环的控制目标值。

第四行是速度内环。

因为双环控制过程较复杂,故给出其控制原理图如下:

附件所给的代码都经过测试,如果同学们测试的时候发现不能实现控制目标,请对调编码器的AB相。

笔者水平有限,有错误之处请批评指出,以上内容由平衡小车之家原创,转载或引用请注明出处。

来点干货,以下是相关的代码和原理图,取消了网盘链接,上传了附件,直接下载即可

下载附件:——回复可见内容——




关键词: PID     双环     速度     位置     直流    

菜鸟
2015-10-29 16:22:59     打赏
2楼
大赞 学习一下

菜鸟
2015-10-29 16:32:10     打赏
3楼
赞一个,先mark了~

菜鸟
2015-10-29 16:37:35     打赏
4楼
标记一下

菜鸟
2015-10-29 17:00:27     打赏
5楼

赞一个,学习了


助工
2015-10-29 17:07:53     打赏
6楼
不错不错,很好的学习资料。

助工
2015-10-29 17:14:21     打赏
7楼
点赞,学习。。。

助工
2015-10-29 18:09:53     打赏
8楼
让我感觉又学了一遍自控原理!!wonderful………

菜鸟
2015-10-29 19:19:07     打赏
9楼
好东西,多谢楼主分享,学习了

院士
2015-10-29 19:31:05     打赏
10楼
这个经验分享真棒。

共170条 1/17 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]