【Proteus仿真】【51单片机】直流电机PID调速系统设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者

  • 一、功能简介

    本项目使用Proteus8仿真51单片机控制器,使用L298N电机模块、数码管模块、按键模块、LED指示灯模块等。

    主要功能:
    系统运行后,可通过按键K4启动系统,数码管显示实际速度和目标速度,再次按下K4键停止系统;按键K1加速、按键K2减速,按键K3换向;速度范围为0-150;通过PID将实际速度调节到目标速度。
    最终可实现:
    1、具有加速/减速/正转/反转/启动和停止
    2、数码管显示速度
    3、LED指示电机正转、反转
    4、霍尔传感器实现电机测速
    5、目标速度设定


    二、软件设计

    /*
    作者:嗨小易(QQ:3443792007)
    */
    
    
    
    
    
    //系统参数设定
    void sys_parm_set(void)
    {
    	u8 key=0;
    	
    	key=key_scan(0);
    	//开启/停止
    	if(key==KEY4_PRESS)	
    	{
    		sys_ctrl.run=!sys_ctrl.run;
    		if(sys_ctrl.run)
    		{
    			TR1=1;EX0=1;
    			if(sys_ctrl.dir==0){ZZ_LED=0;FZ_LED=1;}
    			else {ZZ_LED=1;FZ_LED=0;}	
    		}
    		else 
    		{	
    			TR1=0;EX0=0;
    			ZZ_LED=1;FZ_LED=1;	
    		}
    		dc_motor_dir_ctrl(sys_ctrl.dir);
    		dc_motor_sta(sys_ctrl.run);
    	}
    	//当处于运行状态时才能调速、切换方向
    	if(sys_ctrl.run==1)
    	{
    		//加速
    		if(key==KEY1_PRESS)
    		{
    			pid.target_val+=10;
    			if(pid.target_val>150)pid.target_val=150;				
    		}
    		//减速
    		else if(key==KEY2_PRESS)
    		{
    			pid.target_val-=10;
    			if(pid.target_val<10)pid.target_val=0;				
    		}
    		//换向
    		else if(key==KEY3_PRESS)
    		{
    			sys_ctrl.dir=!sys_ctrl.dir;
    			if(sys_ctrl.dir==0){ZZ_LED=0;FZ_LED=1;}
    			else {ZZ_LED=1;FZ_LED=0;}
    			dc_motor_dir_ctrl(sys_ctrl.dir);
    		}	
    	}
    }
    
    //采集数据显示
    void sys_data_show(void)
    {
    	u8 buf[8];
    	u8 tag_val=pid.target_val;
    
    	while(sys_ctrl.run==1)
    	{
    		//测速完成
    		if(sys_ctrl.sta==1)
    		{
    			sys_ctrl.sta=0;
    			sys_ctrl.cnt=0;
    			EX0=1;//打开计数	
    		}
    		//实际速度
    		buf[0]=0;
    		buf[1]=gsmg_code[sys_ctrl.speed/100];
    		buf[2]=gsmg_code[sys_ctrl.speed%100/10];
    		buf[3]=gsmg_code[sys_ctrl.speed%100%10];
    		//目标速度
    		buf[4]=0;
    		buf[5]=gsmg_code[tag_val/100];
    		buf[6]=gsmg_code[tag_val%100/10];
    		buf[7]=gsmg_code[tag_val%100%10];
    		smg_display(buf,1);
    
    		break;				
    	}
    }
    
    //系统功能控制
    void sys_fun_ctrl(void)
    {
    	static u8 i=0;
    
    	while(sys_ctrl.run==1)
    	{
    		i++;
    		if(i%1==0)
    		{
    			//PID调节
    			sys_ctrl.rate=pid_realize(sys_ctrl.speed);
    			if(sys_ctrl.rate>100)sys_ctrl.rate=100;
    			else if(sys_ctrl.rate<0)sys_ctrl.rate=-sys_ctrl.rate;
    			pwm_set_duty_cycle(sys_ctrl.rate);//占空比	
    		}
    
    		break;	
    	}
    } 
    
    
    //应用控制系统
    void appdemo_show(void)
    {
    	ENA=0;
    	SMG_A_DP_PORT=0;
    	sys_parm_init();//系统参数初始化
    	exti0_init();
    	time1_init();
    	pwm_init(0XFF,0XD1,100,0);//初始时,PWM占空比为0
    	dc_motor_dir_ctrl(sys_ctrl.dir);//默认正转
    	pwm_set_duty_cycle(sys_ctrl.rate);//占空比
    
    	pid_parm_init();//PID参数初始化
    
    	while(1)
    	{
    		sys_parm_set();//系统参数设定
    		sys_data_show();//采集数据显示
    		sys_fun_ctrl();//系统功能控制		
    	}
    }
    
    

    三、实验现象




    联系作者

    专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Proteus仿真】【51单片机】直流电机PID调速系统设计

    发表评论