PID(比例-积分-微分)控制器广泛应用于工业控制系统中,用于调节各种物理变量。本实验的目的是通过 Proteus 仿真软件设计并实现一个 PID 电机调速系统,以控制直流电机的转速,使其能够按照设定的目标转速稳定运行。
微控制器:选用 51 系列单片机(如 AT89S51)作为控制核心。
直流电机:用于演示 PID 控制效果。
编码器:用于测量电机的实际转速。
LCD 显示屏:用于显示目标转速和实际转速。
按键:用于增减目标转速。
PWM(脉宽调制)模块:用于控制电机的转速。
PID 控制器通过比较目标值和实际值的差异(误差),通过比例、积分和微分三个环节计算出控制量,用于调整系统输出,使误差趋于零。
比例(P):与当前误差成正比。
积分(I):与误差的累计值成正比。
微分(D):与误差的变化率成正比。
系统主要由单片机、电机、编码器、LCD 显示屏和控制按键组成。电机的转速通过编码器反馈到单片机,单片机通过 PID 算法计算出合适的 PWM 信号,控制电机的转速。
电路连接如下:
电机与 PWM 控制模块相连,PWM 信号控制电机的转速。
编码器连接到单片机的外部中断口,用于测量电机转速。
LCD 显示屏连接到单片机的 I/O 口,用于显示目标和实际转速。
增加和减少目标转速的按键连接到单片机的 I/O 口。
程序主要包括初始化、主循环和中断处理三部分。
cvoid SystemInit()
{
TMOD=0X21; // Timer 0 和 Timer 1 初始化
TH0=THC0;
TL0=TLC0;
TH1=0xC0;
TL1=0XC0;
ET1=1;
ET0=1;
TR0=1;
TR1=1;
EX0=1; // 中断 0 用来测量转速
IT0=1;
EA=1;
e =0;
e1=0;
e2=0;
}
主循环不断检查按键状态,更新目标转速,并调用 LCD 显示目标和实际转速。
cvoid main()
{
SystemInit();
init();
LCD_Write_String(0,0,aa);
zs=1;
while(1)
{
SetSpeed();
if(zs==1)
{
zs=0;
cc[7]=num/1000+'0';
cc[8]=num/100%10+'0';
cc[9]=num/10%10+'0';
cc[10]=num%10+'0';
LCD_Write_String(0,1,cc);
}
}
}
外部中断用于测量电机转速,定时器中断用于产生 PWM 信号和执行 PID 控制算法。
cvoid int0() interrupt 0
{
Inpluse++;
}
void t0() interrupt 1
{
static unsigned int time=0;
TH0=THC0;
TL0=TLC0;
time++; // 转速测量周期
if(time>500)
{
zs=1;
time=0;
num=Inpluse;
Inpluse=0;
PIDControl();
}
PWMOUT();
}
void timer_1() interrupt 3
{
cnt++;
}
PID 算法根据当前误差计算控制输出,调整 PWM 信号的占空比。
cvoid PIDControl()
{
e=SpeedSet-num;
duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));
uk=uk1+duk;
out=(int)uk;
if(out>1000)
{
out=1000;
}
else if(out<0)
{
out=0;
}
uk1=uk;
e2=e1;
e1=e;
PWMTime=out;
}
通过调整目标转速,观察电机实际转速的变化。PID 控制器能够快速响应并稳定在设定的目标转速上,验证了 PID 控制算法的有效性。
本实验通过 Proteus 仿真平台,设计并实现了一个基于 PID 控制的电机调速系统。实验结果表明,PID 控制算法能够有效调节电机转速,使其快速稳定在目标值上,为实际应用提供了参考依据。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!