资料编号:123 下面是相关功能视频演示:
123-基于51单片机的PID直流电机调速Proteus仿真(源码+仿真+全套资料)
功能讲解:
采用51单片机PWM输出驱动电机转动,通过PID调节实时速度,通过按键设置电机转速,实现速度加减,实现正反转,数码管显示设置速度,显示当前速度,全套资料齐全:
下面是仿真展示:

下面是该资料的部分程序展示:
sbit AddSpeed=P1^0;//加速按键置位
sbit SubSpeed=P1^1;//减速按键置位
sbit Turn=P1^2;//正转按键置位
sbit Stop=P1^3;//停止按键置位
sbit IN1=P3^6;
sbit IN2=P3^7;//控制电机正反转和停止状态
sbit PWM_FC=P1^7;//输出PWM口
bit ENA=1;
float pid_p=0.003,pid_i=0.003,pid_d=0.002; //PID三个参数 初值
unsigned int lastError=0;
long int sumError=0;//sum偏差和
int out=0; //PWM高电平时间控制标志位
int SpeedSet=0;//速度初值
uint cnt=0; //PWM的周期标志位
uint Inpluse=0,num=0;//脉冲计数
int pid_val_mid=0;//脉冲宽度
//void PIDControl();//PID控制子函数
void SystemInit();//定时器和中断初始化子函数
void delay(uchar x); //延时子函数
void PWMOUT(); //PWM输出子函数
void SetSpeed(); //按键进行速度和转向控制子函数
void SegRefre(); //显示刷新子函数
/**************主函数************/
void main() //定时器和中断初始化
{
SystemInit();
while(1)
{
SetSpeed(); //按键设定速度
SegRefre(); //数码管显示刷新
if(SpeedSet==0)
{
ENA=0;
}
}
}void PWMOUT() //输出PWM脉冲子函数,进行PWM高低电平时间的判别
{
if(cnt
PWM_FC=1;
}
else
{
PWM_FC=0;
}
if(cnt>=100)
cnt=0; //100次定时器T1中断触发时间为一个PWM周期为1ms,故所取PWM频率为1k
}

下面是该资料的分享下载链接: