L298N+光电对射+最小系统电机控制系统.docx
- 文档编号:11747225
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:17
- 大小:1.44MB
L298N+光电对射+最小系统电机控制系统.docx
《L298N+光电对射+最小系统电机控制系统.docx》由会员分享,可在线阅读,更多相关《L298N+光电对射+最小系统电机控制系统.docx(17页珍藏版)》请在冰点文库上搜索。
L298N+光电对射+最小系统电机控制系统
直流电机调速与控制
摘要:
当今社会,电动机作为最主要的机电能量转换装置,其应用范围已遍及国民经济的各个领域和人们的日常生活。
无论是在工农业生产,交通运输,国防,航空航天,医疗卫生,商务和办公设备中,还是在日常生活的家用电器和消费电子产品(如电冰箱,空调,DVD等)中,都大量使用着各种各样的电动机。
据资料显示,在所有动力资源中,百分之九十以上来自电动机。
同样,我国生产的电能中有百分之六十是用于电动机的。
电动机与人的生活息息相关,密不可分。
电气时代,电动机的调速控制一般采用模拟法、PID控制等,对电动机的简单控制应用比较多。
简单控制是指对电动机进行启动,制动,正反转控制和顺序控制。
这类控制可通过继电器,光耦、可编程控制器和开关元件来实现。
还有一类控制叫复杂控制,是指对电动机的转速,转角,转矩,电压,电流,功率等物理量进行控制。
本电机控制系统基于51内核的单片机设计,采用L298N直流电机驱动器,利用PWM脉宽调制控制电机,并通过光电测速模块测速,LCD1602显示实时速度。
关键字:
直流电机、51内核、PWM脉宽调制、L298N
一,设计题目:
简单的电机控制系统
二,设计功能简述:
手动控制电机正反转,加减速,测速并显示。
三,系统主要功能模块:
(1)L298N模块原理图如下所示:
一个L298N可以驱动两个直流电机或交流电机,通过此模块可以实现电动机的正反转,加减速的调节。
本设计中只用到了一个电机。
物理接口为:
IN1,IN2,通过这两个端口控制正反转。
EN:
模块的使能端,输入PWM,实现加减速。
GND,5V:
模块供电端口。
GND,VIN:
电动机供电端口.
(2)最小系统模块的原理图如下所示:
在本设计中只用到了单片机的最下系统,由于P0端口节LCD1602的数据端口,在实际应用中加了上拉电阻。
(3)光电对射测速模块原理图如下所示:
光电对射测速模块共有三个端口,分别是5V,GND,OUT,
OUT是脉冲输出的端口,另外两个是模块的供电端口,该模块通过1秒内输出的脉冲个数除以系统预设值20(本设计中用到的码盘是20栅格)得到转速。
(4)LCD1602液晶显示屏
LCD1602共16个端口,功能分别如下:
第1脚:
VSS为地电源第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光电源正极第16脚:
背光电源负极
四,设计描述:
本设计在最小系统模块,L298N模块,光电对射测速模块,LCD1602四部分的基础上实现用四个按键手动控制电动机加减速,正反转,端口分别是P3.0,P3.1,P3.3,P3.4,光电测速模块的输出端口为P3.2.L298N的端口分别P3.5为使能输出端口,P1.0,P1.1为控制输出端口。
LCD1602的端口连接如下:
|DB0-----P0.0DB4-----P0.4RW-------P2.3DB1-----P0.1DB5-----P0.5RS-------P2.4DB2-----P0.2DB6-----P0.6E--------P2.2|DB3-----P0.3DB7-----P0.7
五,设计流程图:
六,总结与思考:
去年硬件课程设计时,我做了电机控制系统,今年的电子设计在去年的基础上增加了测速并显示的功能,在硬件方面也进行了改进,自己动手焊接了最小系统的模块,花时间最多的部分就是代码调试,但最终完成了设计,经过本次设计实践,运用了编程和硬件设计方面的知识,同时也认识到了自己在这两方面的不足之处,在以后的学习中一定要找到突破口,针对存在问题加强练习。
附录一
源代码如下
/*实现功能:
电机调速测速
晶振:
12MHZ
编译环境:
Keil
#include
#defineucharunsignedchar
#defineuintunsignedint
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0|DB4-----P0.4|RW-------P2.3|
|DB1-----P0.1|DB5-----P0.5|RS-------P2.4|
|DB2-----P0.2|DB6-----P0.6|E--------P2.2|
|DB3-----P0.3|DB7-----P0.7|
---------------------------------------------------*/
//================================================*/
#defineLCM_DataP0//LCD1602数据接口
#defineBusy0x80//用于检测LCM状态字中的Busy标识
sbitLCM_RW=P2^3;//读写控制输入端,LCD1602的第五脚
sbitLCM_RS=P2^4;//寄存器选择输入端,LCD1602的第四脚
sbitLCM_E=P2^2;//使能信号输入端,LCD1602的第6脚
//=================计数传感模块连接=====================
/*-----------------------------------------------------
|VCC-----VCC|GND-----GND|OUT-------P3.2
---------------------------------------------------*/
sbitOUT=P3^2;
inta,b;
sbitPWM=P3^5;//PWM输出脚
sbitP3_0=P3^0;//正传
sbitP3_1=P3^1;//反转
sbitP3_2=P3^4;//加速
sbitP3_3=P3^3;//减速
sbitP1_0=P1^0;//M1电机控制1端
sbitP1_1=P1^1;//M2电机控制2端
//**************函数声明***************************************
voidWriteDataLCM(ucharWDLCM);//LCD模块写数据
voidWriteCommandLCM(ucharWCLCM,BuysC);//LCD模块写指令
ucharReadStatusLCM(void);//读LCD模块的忙标
voidDisplayOneChar(ucharX,ucharY,ucharASCII);//在第X+1行的第Y+1位置显示一个字符
voidLCMInit(void);//LCD初始
voidDelayMs(uintMs);//1MS基准延时程序
uinttotal,zhuansut;
uchart0_count;
voidzstj(void);//转速调节
#definecanshu=20;//参数,如果电机转一圈,计数器检测到几次,这里的参数就要相应修改
//***********************主程序******************************
main()
{
TMOD=0x01;//定时器T0为定时器工作方式1
TCON=01;//设定外部中断0为边沿触发方式
TH0=0X3C;
TL0=0XB0;//设定定时器TO为50MS
TR0=1;//启动定时器T0
ET0=1;
EA=1;//开启外部中断
LCMInit();//LCD初始
while
(1)
{
total=20;
t0_count=0;
OUT=1;
DisplayOneChar(0,0,'T');//显示:
T
DisplayOneChar(0,1,':
');//显示:
:
DisplayOneChar(0,2,zhuansu/1000+0x30);//显示十位数据
DisplayOneChar(0,3,zhuansu/100%10+0x30);//显示个位数据
DisplayOneChar(0,4,zhuansu/10%10+0x30);//
DisplayOneChar(0,5,zhuansu%10+0x30);//显示百位数据
EX0=1;//允许外部中断0
while
(1)
{
DisplayOneChar(0,0,'T');//显示:
T
DisplayOneChar(0,1,':
');//显示:
:
DisplayOneChar(0,2,zhuansu/1000+0x30);//显示十位数据
DisplayOneChar(0,3,zhuansu/100%10+0x30);//显示个位数据
DisplayOneChar(0,4,zhuansu/10%10+0x30);//
DisplayOneChar(0,5,zhuansu%10+0x30);//显示百位数据
DisplayOneChar(1,0,'C');//显示:
T
DisplayOneChar(1,1,':
');//显示:
:
DisplayOneChar(1,2,total/1000+0x30);//显示十位数据
DisplayOneChar(1,3,total/100%10+0x30);//显示个位数据
DisplayOneChar(1,4,total/10%10+0x30);//
DisplayOneChar(1,5,total%10+0x30);//显示百位数据
}
}
}
//**********外部中0中断入口
voidex0_in()interrupt0
{
total++;
}
//******外部中断3中断入口
voidscjs(void)interrupt3
{
TH1=0Xff;
TL1=0x17;
b++;
}
//***************定时器T0中断
voidt0_int()interrupt1
{
TH0=0X3C;
TL0=0XB0;//重新装载定时T0
t0_count++;
if(t0_count==20)//中断20次为1秒
{
t0_count=0;
zhuansu=total/canshu;
total=0;
}
}
/*======================================================================
LCM初始化
======================================================================*/
voidLCMInit(void)
{
LCM_Data=0;
WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
DelayMs(5);
WriteCommandLCM(0x38,0);
DelayMs(5);
WriteCommandLCM(0x38,0);
DelayMs(5);
WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1);//关闭显示
WriteCommandLCM(0x01,1);//显示清屏
WriteCommandLCM(0x06,1);//显示光标移动设置
WriteCommandLCM(0x0C,1);//显示开及光标设置[;.
DelayMs(100);
}
//==============================LCD1602显示子程序================================================
//写数据函数:
E=高脉冲RS=1RW=0
//======================================================================*/
voidWriteDataLCM(ucharWDLCM)
{
ReadStatusLCM();//检测忙
LCM_Data=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0;//若晶振速度太高可以在这后加小的延时
LCM_E=0;//延时
LCM_E=1;
}
/*====================================================================
写指令函数:
E=高脉冲RS=0RW=0
======================================================================*/
voidWriteCommandLCM(ucharWCLCM,BuysC)//BuysC为0时忽略忙检测
{
if(BuysC)ReadStatusLCM();//根据需要检测忙
LCM_Data=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_E=0;
LCM_E=0;
LCM_E=1;
}
/*====================================================================
正常读写操作之前必须检测LCD控制器状态:
E=1RS=0RW=1;
DB7:
0LCD控制器空闲,1LCD控制器忙。
读状态
======================================================================*/
ucharReadStatusLCM(void)
{
LCM_Data=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_E=0;
LCM_E=0;
LCM_E=1;
while(LCM_Data&Busy);//检测忙信号
return(LCM_Data);
}
/*======================================================================
功能:
在1602指定位置显示一个字符:
第一行位置0~15,第二行16~31
说明:
第X行,第y列注意:
字符串不能长于16个字符
======================================================================*/
voidDisplayOneChar(ucharX,ucharY,ucharASCII)
{
X&=0x1;
Y&=0xF;//限制Y不能大于15,X不能大于1
if(X)Y|=0x40;//当要显示第二行时地址码+0x40;
Y|=0x80;//算出指令码
WriteCommandLCM(Y,0);//这里不检测忙信号,发送地址码
WriteDataLCM(ASCII);
}
/*====================================================================
设定延时时间:
x*1ms
====================================================================*/
voidDelayMs(uintMs)
{
uinti,TempCyc;
for(i=0;i { TempCyc=250; while(TempCyc--); } } /*电机控制程序***********************************************// voidzstj(void) { TMOD=0x00; IE=0X88; TH1=0Xff; TL1=0X17; TR0=1; TR1=1; a=0; b=0; while (1) { PWM=1; while (1) { b=0; while(! b); if(N==X) PWM=0; if(N==100)break; N++; if(P3_0==0)//正转 { P1_0=1; P1_1=0; P1_2=1; P1_3=0; } if(P3_1==0)//反转 { P1_0=0; P1_1=1; P1_2=0; P1_3=1; } if(P3_2==0)//速度加 { X++; } if(P3_3==0)//速度减 { X--; } } N=0; } } 附录二 调试过程 实物图如下: 下载界面如下: 调试界面如下: 、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- L298N 光电 对射 最小 系统 电机 控制系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)