0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的直流电机控制系统设计

王子变青蛙_35400519 来源:王子变青蛙_35400519 作者:王子变青蛙_35400 2022-06-30 16:01 次阅读

一、前言

二、模块介绍及原理说明

三、硬件连接

四、程序说明

五、效果演示

六、代码链接

一、前言

直流电机控制系统,通过按键对直流电机进行控制;可以调节直流电机的速度等级,旋转方向,并将其显示在LCD1602液晶显示屏上;简单的直流电机控制可以应用在遥控车上,还可安装在自制小风扇等多种小型电器上,但此设计中直流电机控制不是很准确,在一些精密直流电机控制上使用效果较差。

二、模块介绍及原理说明

单片机最小系统:

pYYBAGK9V16AYE5CAABLgft5QfU993.png

单片机最小系统完成系统运行的最基本电路,单片机最小系统可配合其他模块或自行搭建电路完成各种实验功能,单片机最小系统接口设计灵活,电路简洁,可完成基本的驱动任务。单片机最小系统包括晶振电路、复位电路。复位电路我使用按键复位,方便系统的重启。

LCD1602显示屏:

pYYBAGK9V3CABA9MAAAkCA37-4s357.png

LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。

字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD。一般的LCD1602字符型液晶显示器能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。

pYYBAGK9V4CAGoAwAABakL-wn6w295.png

电机驱动:

poYBAGK9V42AeeVAAABLv_UUSsI239.png

NPN三极管Q7、Q9控制电机正转,当Q7、Q9导通后,OUT控制Q1、Q3三极管导通与关闭的时间来调节直流电机的速度。同理NPN三极管Q5、Q8控制电机正转,当Q5、Q8导通后,OUT控制Q2、Q4三极管导通与关闭的时间来调节直流电机的速度。

三、硬件连接

pYYBAGK9V5qAHSrJAACQa4imacg170.png

仿真连接

P1^0~P1^3为按键控制端口。P1^0控制电机正转;P1^1控制电机反转;P1^2加速;P1^3减速。

P0^7~P0^7为显示屏数据传输端口。P0^7~P0^7与显示屏D0~D7连接。

P2^2、P2^3、P2^4为显示屏控制端口。P2^2、P2^3、P2^4分别于RS、RW、E相连。

P2^0、P2^1电机正反转控制。

P2^5电机PWM控制。

四、程序说明

poYBAGK9V6OAKz2XAAEEXyIzXgo112.png

主程序,用以调用不同的函数。控制速度的加减,电机的正反转,调用LCD1602显示函数。

void main (void)
{  
int S=0;
char displaytemp[16];//定义显示区域临时存储数组               
PWM_ON=0;
LCD_Init();         //初始化液晶屏
Init_Timer0();    //初始化定时器0
LCD_Write_String(2,1,"V:");	   //正转

while (1)         //主循环
  {

   if(key3==0)//第三个按键,速度等级增加
      {
	  DelayMs(10);    //消抖
	  if(key3==0)
	    {
	       if(PWM_ON=12)S=12;
	    }
		while(!key3);
	  }	
   else if(key4==0)//第四个按键,速度等级减小
          {
	         DelayMs(10);
	         if(key4==0)
	           {
	             if(PWM_ON>0)
	                PWM_ON--;
					S--;
					if(S<=0)S=0;
	           }
	   	     while(!key4);
	      }
	if(key1==0)//第一个按键,正转
      {
	  DelayMs(10);
	  if(key1==0)
	    {
	       m=1;n=0;
		   LCD_Write_String(0,0,"T");	   //正转显示T
	    }
		while(!key1);
	  }	
   else if(key2==0)//第二个按键,反转
          {
	         DelayMs(10);
	         if(key2==0)
	           {
	             m=0;n=1;
				 LCD_Write_String(0,0,"N");	   //反转显示N
	           }
	   	     while(!key2);
	      }	  	
	sprintf(displaytemp,"%3d",S);
    LCD_Write_String(4,1,displaytemp);	//显示速度等级,一共分为十二个等级
  }
})>

定时器函数,用来控制PWM值占空比的输出。

void Timer0_isr(void) interrupt 1 
{
 static unsigned char count;
 TH0=(65536-2000)/256;        //重新赋值 2ms
 TL0=(65536-2000)%256;
 
if (count==PWM_ON) 
   {
   DCOUT = 0;        //如果定时等于on的时间,
             //说明作用时间结束,输出低电平
   }
  count++;
if(count == CYCLE)    //反之低电平时间结束后返回高电平
   {
   count=0;
    if(PWM_ON!=0)   //如果开启时间是0 保持原来状态
      DCOUT = 1;   
   }
}

LCD1602显示函数

/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
 {  
// while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 //while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }
/*------------------------------------------------
                清屏函数
------------------------------------------------*/
//void LCD_Clear(void) 
 //{ 
 //LCD_Write_Com(0x01); 
 //DelayMs(5);
 //}


/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
       
 while (*s) 
 	{     
 LCD_Write_Char(x,y,*s);     
 s++;  x++;   
 	}
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
 if (y == 0) 
 	{     
 	LCD_Write_Com(0x80 + x);     
 	}    
 else 
 	{     
 	LCD_Write_Com(0xC0 + x);     
 	}        
 LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
   

延时函数,用于按键的消抖,以及程序的延时。

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
	 DelayUs2x(245);
 }
}

五、效果演示

仿真演示

https://live.csdn.net/v/220628

六、代码链接

欢迎留言评论分享自己的看法,如有错误欢迎指正。关注公众号:“小小创客”回复“直流电机控制系统设计“获得源码及仿真。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5997

    文章

    43947

    浏览量

    620538
  • 控制系统
    +关注

    关注

    41

    文章

    5948

    浏览量

    108578
  • 直流电机
    +关注

    关注

    35

    文章

    1622

    浏览量

    69432
收藏 人收藏

    评论

    相关推荐

    51单片机直流电机控制

    的转速,能够很方便的实现电机的智能控制。其间是通过AT89C52单片机产生脉宽可调的脉冲信号并输入到L298驱动芯片来控制直流电机工作的。该
    发表于 08-06 15:42

    单片机在汽车驾驶模拟器中的应用

    的生成元件,其可靠性无法保证,且模拟误差大。提出基于单片机直流电机控制系统模拟汽车行驶过程中受到的回正力矩。该系统中上位实时计算出汽车受
    发表于 04-24 09:44

    设计方案:基于单片机AT89S52的直流电机PWM调速控制系统

    本资料是基于单片机AT89S52的直流电机PWM调速控制系统的设计方案。 本设计任务: 任务: 单片机控制核心的
    发表于 07-26 22:29

    基于单片机的航模无刷直流电机调速控制系统

    单片机控制核心,分析无感无刷直流电机的位置检测方法,PWM的调速方式,启动控制等。设计了航模无刷直流电机调速
    发表于 01-14 10:23

    基于STM32单片机直流电机控制系统加减速正反转设计方案原理图程序资料下载

    硬件电路的设计3.1系统的功能分析及体系结构设计3.1.1系统功能分析本设计由STM32F103C8T6单片机核心板电路+L298N电机驱动电路+按键电路+电源电路组成。1、通过按键可
    发表于 06-29 08:03

    基于单片机直流电机控制系统

    资料下载地址-1009(百度网盘):点击下载此仿真是基于单片机直流电机控制系统,使用了用L298驱动直流电机,并用按键控制
    发表于 09-03 07:23

    怎样去设计基于51单片机直流电机控制系统

    /********************************************************/#include#define uint unsigned int #define uchar unsigned char/********************************************************/***it k1=P3^4; //启动/停止按键***it k2=P3^5; //减速按键***it k3=..
    发表于 09-03 07:32

    如何实现STM32单片机直流电机控制系统加减速正反转的设计?

    如何实现STM32单片机直流电机控制系统加减速正反转的设计?
    发表于 10-15 09:33

    基于单片机直流电机控制系统在动态送风装置中的应用

    摘 要 介绍一种基于单片机的动态送风控制系统。该控制系统以C8051F330单片机为处理器,配合控制电路,采用脉宽调制技术,根据自然风特性,
    发表于 07-21 22:41 46次下载

    基于TB6612FNG和单片机直流电机控制系统设计

      本设计中使用的TB6612FNG是一款新型驱动器件,能独立双向控制2个直流电机,它具有很高的集成度,同时能提供足够的输出能力,运行性能和能耗方面也具有优势,因此在集成
    发表于 08-26 17:21 1.1w次阅读
    基于TB6612FNG和<b class='flag-5'>单片机</b>的<b class='flag-5'>直流电机</b><b class='flag-5'>控制系统</b>设计

    TB6612FNG简介及其与单片机直流电机控制系统设计

    TB6612FNG简介及其与单片机直流电机控制系统设计
    发表于 02-17 15:24 236次下载

    基于单片机电机控制系统仿真设计-单片机设计

    资料下载地址-1009(百度网盘):点击下载此仿真是基于单片机直流电机控制系统,使用了用L298驱动直流电机,并用按键控制
    发表于 11-12 17:21 7次下载
    基于<b class='flag-5'>单片机电机</b><b class='flag-5'>控制系统</b>仿真设计-<b class='flag-5'>单片机</b>设计

    基于STM32单片机直流电机控制系统加减速正反转设计方案原理图程序

    硬件电路的设计3.1系统的功能分析及体系结构设计3.1.1系统功能分析本设计由STM32F103C8T6单片机核心板电路+L298N电机驱动电路+按键电路+电源电路组成。1、通过按键可
    发表于 12-24 19:22 7次下载
    基于STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>直流电机</b><b class='flag-5'>控制系统</b>加减速正反转设计方案原理图程序

    基于51单片机直流电机控制系统Proteus仿真

    基于51单片机直流电机控制系统Proteus仿真
    发表于 02-07 15:37 173次下载

    基于单片机直流电机控制系统模拟汽车行驶过程中受到的回正力矩

    电子发烧友网站提供《基于单片机直流电机控制系统模拟汽车行驶过程中受到的回正力矩.pdf》资料免费下载
    发表于 10-19 10:08 0次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>直流电机</b><b class='flag-5'>控制系统</b>模拟汽车行驶过程中受到的回正力矩