Proteus仿真下的51单片机PWM电机调速系统设计

文章目录

  • 一、主要功能
  • 二、硬件资源
  • 三、软件设计
  • 1、主机程序
  • 四、实验现象
  • 联系作者

  • 一、主要功能

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

    系统运行后,数码管显示电机当前运行档位和速度。
    可通过按键K4启动与停止,按键K1加速、按键K2减速,按键K3换向;
    档位可在1-5挡。
    最终可实现:
    按键功能:具有加速、减速、正转、反转、启动和停止;
    显示功能:数码管显示档位、电机转速;
    指示功能:LED指示电机正转、反转;
    测速功能:使用霍尔传感器实现电机测速;
    电机驱动:L298N驱动直流电机;


    二、硬件资源

    1、51单片机核心模块
    2、L298N电机驱动模块
    3、数码管显示模块
    4、按键模块
    5、LED电路


    三、软件设计

    1、主机程序

    /*
    作者:嗨小易(QQ:3443792007)
    */
    
    //功能引脚定义
    sbit ZZ_LED=P2^0;
    sbit FZ_LED=P2^1;
    
    //定义结构体
    _sys_ctrl sys_ctrl;
    
    
    //系统参数设定
    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)
    		{
    			sys_ctrl.gear++;
    			if(sys_ctrl.gear>5)sys_ctrl.gear=1;
    			pwm_set_duty_cycle(sys_ctrl.gear*20);				
    		}
    		//减速
    		else if(key==KEY2_PRESS)
    		{
    			sys_ctrl.gear--;
    			if(sys_ctrl.gear<1)sys_ctrl.gear=5;
    			pwm_set_duty_cycle(sys_ctrl.gear*20);				
    		}
    		//换向
    		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[4];
    
    	while(sys_ctrl.run==1)
    	{
    		//测速完成
    		if(sys_ctrl.sta==1)
    		{
    			sys_ctrl.sta=0;
    			sys_ctrl.cnt=0;
    			EX0=1;//打开计数	
    		}
    		buf[0]=gsmg_code[sys_ctrl.gear%10]|0x80;
    //		buf[1]=gsmg_code[sys_ctrl.speed/100];
    		buf[1]=0;
    		buf[2]=gsmg_code[sys_ctrl.speed%100/10];
    		buf[3]=gsmg_code[sys_ctrl.speed%100%10];
    		smg_display(buf,1);
    
    		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.gear*20);//占空比40%
    
    	while(1)
    	{
    		sys_parm_set();
    		sys_data_show();		
    	}
    }
    
    
    

    四、实验现象

    B站演示视频:https://space.bilibili.com/444388619


    联系作者

    B站演示视频:https://space.bilibili.com/444388619
    专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

    物联沃分享整理
    物联沃-IOTWORD物联网 » Proteus仿真下的51单片机PWM电机调速系统设计

    发表评论