基于红外遥控步进电机的设计.docx
- 文档编号:23489202
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:27
- 大小:220.51KB
基于红外遥控步进电机的设计.docx
《基于红外遥控步进电机的设计.docx》由会员分享,可在线阅读,更多相关《基于红外遥控步进电机的设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于红外遥控步进电机的设计
基于红外遥控步进电机的设计
班级:
B140415
摘要:
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,它广泛用于打印机、电动玩具等消费类产品以及数控机床、工业机器人、医疗器械等机电产品中,其在各个国民经济领域都有应用。
研究步进电机的控制系统,对提高控制精度和响应速度、节约能源等都具有重要意义。
步进电机是一种能将电脉冲信号转换成角位移或线位移的机电元件,步进电机控制系统主要由步进控制器,功率放大器及步进电机等组成。
采用单片机控制,用软件代替上述步进控制器,使得线路简单,成本低,可靠性大大增加。
软件编程可灵活产生不同类型步进电机励磁序列来控制各种步进电机的运行方式。
介绍了一种基于AT89C51单片机的红外遥控步进电机的设计,系统分为红外遥控编解码、LCD显示和驱动步进电机三个模块,设计的系统能通过遥控器来控制步进电机,并且步进电机的状态能通过LCD液晶模块实时显示出来,使人们直观的看出步进电机的运行状态。
本报告对该系统的工作原理、硬件电路和软件进行了详细介绍。
关键词:
红外遥控、LCD显示、步进电机、单片机
一、引言
本系统是基于单片机控制的综合系统,单片机通过对红外信号的解码来实现步进电机的变速及LCD实时显示步进电机的转速。
它综合了电子技术和单片机软硬件技术,本设计采用AT89c51单片机为核心包含红外接收电路、LCD显示电路和步进电机驱动电路。
通过红外遥控器发射不同的码值来控制步进电机的正转反转、加速减速以及启动停止并通过LCD显示出步进电机的状态。
二、系统功能分析
根据系统要求设计各个模块。
本设计中控制芯片采用AT89c51单片机,各个功能通过不同模块来得以实现,主要有:
红外接收模块、步进电机驱动和LCD显示模块。
系统基本架构原理如图1所示
图一基本架构原理图
各个模块具体实现方式如下:
1.红外发射模块:
本设计采用的是通过遥控器发射不同的码值,红外接收电路将接收到得信号送给单片机的外部中断0,单片机接收到信号后通过解码程序对接收到得信号进行处理,使得这些信号成为相应的码值。
经过处理后这些信号就可以去控制步进电机的正转反转、加速减速以及启动停止并在LCD上显示出来。
遥控发射器采用士兰半导体的TC9012编码芯片进行红外遥控发射电路的搭建。
TC9012是一块用于红外遥控系统中的专用发射集成电路,采用CMOS工艺制造。
它可外接32个按键,其中有三组双重按键。
工作电压在2。
其编码方式采用一帧码中含有一个引导码,16位的用户码和8位的键数据码。
键数据码的反码也同时被传送,数据反码的传送可以大大减小系统的误码率。
引导码由一个9ms的载波波形和4.5ms的关断时间构成,编码采用脉冲位置调制方式(PPM)。
利用脉冲之间的时间间隔来区分“0”和“1”。
具体的遥控发射应用电路图如图2-1.图2-2所示
图2-1TC9012结构框图
图2-2发射器结构原理图
2.红外接收模块:
本系统采用的接收模块其核心是与TC9012相对应的1308红外接收头。
1308是一颗集接收电路、调制解调电路、低通滤波、放大电路和控制电路为一体的集成接收头,一共有三个引脚输出其中一个是电源一个是接地另一个则是输出,这样就大大方便了我们的使用。
1308部结构如图3所示
图3
由于1308部集成了强大的信号处理功能,所以在本系统中使用这个1308的接收头的时候我们只需要在外部加上一个滤波电路就可以了,这个RC滤波电路是为了滤除电源端的干扰信号。
具体应用电路图如图4所示
图4
3.液晶显示模块
在本系统中我们采用1602字符型液晶显示模块来显示步进电机的转速、起停以及正反转等步进电机的状态。
字符型液晶显示模块是专门用于显示字母、数字、符号等的点阵型液晶显示模块。
分4位和8位数据传输方式。
提供5*7点阵+光标和5*10点阵+光标的显示模式。
可以显示两行每行8个字符。
提供部自动上电复位电路,+5V工作电压。
一共有16个引脚,其中一对电源引脚、一对LED背光电源引脚、LCD驱动电压引脚、一个模式选择引脚、一个读写操作引脚、一个使能引脚以及7个数据引脚。
其中LCD驱动电压V0可通过滑动变阻器进行调节,一般V0为零伏。
具体应用电路图如图5所示
图5
4.步进电机驱动模块
本系统采用额定电压为5VDC,相数为4相的步进电机,驱动方式为4相8拍。
一共有5跟线连接,其中红色的为电源线。
采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
由于单片机P口输出的电流比较弱不能驱动步进电机,所以要加一个ULN2003芯片来放大电流使之能驱动步进电机工作。
ULN2003是高耐压、大电流达林顿列,由七个硅NPN达林顿管组成。
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路。
ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。
步进电机驱动电路如图6所示
图6
三、硬件电路设计本系统采用的核心器件是AT89C51单片机,有4个P口,其中P1P2P3部含有上拉电阻,P0口部不含上拉电阻。
在本系统中用P0口来控制LCD液晶显示模块,p1口来控制步进电机的驱动,外部中断0(P3.2)来接3收红外控制信号。
AT89C51单片机引脚图如图7所示
图7
单片机复位电路的设计。
当AT89C51单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
89C51单片机提供了上电复位和按键复位两种方式,本系统中采用按键复位电路。
具体复位电路如图8所示,其中C4是104瓷电容,C3是22uf/25V的电解电容,R1的阻值为10K欧。
单片机时钟电路的设计。
89C51提供了外部时钟电路和部时钟电路两种方式,本系统采用11.0592MHz晶振的外部时钟电路方式,在晶振两端接2个30pf的瓷电容。
这两个电容成为晶振的负载电容,它会影响晶振的谐振频率和输出幅度。
具体晶振电路如图9所示
图8
图9
四、系统软件设计本系统的软件设计分LCD显示子程序、红外解码判断子程序、步进电机控制程序和主程序组成。
整个系统采用C语言进行编写。
1.主程序
主程序包括系统的初始化、LCD子程序的调用以及定时器中断函数和步进电机控制函数组成。
系统初始化包括对LCD显示模块数据位、命令位,红外解码标志位以及步进电机停止转动的等级的定义与初始化,定时器中断函数主要设定定时器中断间隔和步进电机转动的等级,步进电机控制函数由步进电机索引函数和对索引值的加减函数组成。
系统的主程序流程图如图10所示
图10
2.LCD子程序
LCD子程序主要实现的功能是显示步进电机的状态。
LCD第一行显示静态的“B140415080923”,这个是我组三同学的学号,第二行动态的显示静态的“RANK:
”和不同速度步进电机转动的等级以及正反转的标志,正反转的标志为正转为“+”,反转为“-”。
系统LCD显示子程序流程图如图11所示
图11
3.红外解码判断子程序
红外解码判断子程序包括对码值的判断程序和外部中断0程序,红外接收电路将接收到的信号送到外部中断0,然后红外解码程序对收到的信号进行解码,若解码失败则重新进行解码,若解码成功则判断器码值,然后调用步进电机控制和LCD显示程序实现步进电机的运转和显示。
从而实现红外遥控对步进电机的控制及显示。
系统红外解码判断子程序流程图如图12所示
图12
五:
总结
该红外遥控步进电机的制作让我学会了怎样去设计一个系统,对一个系统的基本架构有了一定的认识,在通过对红外编解码电路的设计也让我对红外遥控的基本知识有了新的认识,知道了红外发码的原理掌握了红外解码程序的编写,对LCD现实模块的使用也让我对LCD有了新的认识,交接了要调节LCD的驱动电压使其达到0V左右才能让字符显示出来,通过对步进电机驱动电路的设计也让我认识到要在步进电机的P口加上拉电阻才能驱动步进电机。
总之,这次实训让我收获了很多也为我以后的工作奠定了一定的基础。
源代码:
#include
#include
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
sbitIR=P3^2;//红外接口标志
unsignedcharTempData[8];//存储显示值的全局变量
charcodeTab[16]="0123456789ABCDEF",zf[2]="-+";
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok,f;
unsignedcharIRcord[4];
unsignedcharirdata[33];
sbitA1=P1^0;//定义步进电机连接端口
sbitB1=P1^1;
sbitC1=P1^2;
sbitD1=P1^3;
#defineCoil_AB1{A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#defineCoil_BC1{A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#defineCoil_CD1{A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#defineCoil_DA1{A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#defineCoil_A1{A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#defineCoil_B1{A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#defineCoil_C1{A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#defineCoil_D1{A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#defineCoil_OFF{A1=0;B1=0;C1=0;D1=0;}//全部断电
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineCHECK_BUSY
#defineDataPortP0
unsignedcharSpeed=1;
bitStartFlag,zfFlag;
sbitRS=P2^4;//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
voidDelayUs2x(unsignedchart);
voidDelayMs(unsignedchart);
voidIr_work(void);
voidIrcordpro(void);
voidTIM0init(void);
voidInit_Timer1(void);
voidEX0init(void);
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
#ifdefCHECK_BUSY
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
#else
return0;
#endif
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_(unsignedchar)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort=;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_(0x80+x);//表示第一行
}
else
{
LCD_Write_(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
/*voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_(0x80+x);
}
else
{
LCD_Write_(0xC0+x);
}
LCD_Write_Data(Data);
}*/
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_(0x38);
DelayMs(5);
LCD_Write_(0x38);
DelayMs(5);
LCD_Write_(0x38);
LCD_Write_(0x08);/*显示关闭*/
LCD_Write_(0x01);/*显示清屏*/
LCD_Write_(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_(0x0C);/*显示开及光标设置*/
}
/*voidspeed1(void)
{
if(Speed<14)
Speed++;
TempData[0]=zf[f];
TempData[1]=Tab[Speed/10];
TempData[2]=Tab[Speed%10];
}
voidspeed2(void)
{
if(Speed>1)
Speed--;
TempData[0]=zf[f];
TempData[1]=Tab[Speed/10];
TempData[2]=Tab[Speed%10];
}*/
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsignedinti=512;//旋转一周时间
EX0init();//初始化外部中断
TIM0init();
Init_Timer1();
LCD_Init();//初始化液晶
DelayMs(20);//延时有助于稳定
LCD_Clear();//清屏
LCD_Write_String(0,0,"B140415080923");
LCD_Write_String(0,1,"RANK:
");
Coil_OFF;
while
(1)//主循环
{
if(irok)//如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok)//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
}
}
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值256微秒
ET0=1;//开中断
TR0=1;
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer1(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH1=0x00;//给定初值
//TL1=0x00;
EA=1;//总中断打开
ET1=1;//定时器中断打开
TR1=1;//定时器开关打开
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
voidEX0init(void)
{
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;//使能外部中断
EA=1;//开总中断
}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
voidtim0_isr(void)interrupt1
{
irtime++;//用于计数2个下降沿之间的时间
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
voidTimer1_isr(void)interrupt3
{
staticunsignedchartimes,i;
TH1=(65536-500)/256;//重新赋值1ms
TL1=(65536-500)%256;
if(StartFlag)
{if(zfFlag==0)
{
if(times==(20-Speed))
{
times=0;
switch(i)
{
case0:
Coil_A1;i++;break;
case1:
Coil_B1;i++;break;
case2:
Coil_C1;i++;break;
case3:
Coil_D1;i++;break;
case4:
i=0;break;
default:
break;
}
}
times++;
}
else
{
if(times==(20-Speed))
{
times=0;
switch(i)
{
case0:
Coil_D1;i++;break;
case1:
Coil_C1;i++;break;
case2:
Coil_B1;i++;break;
case3:
Coil_A1;i++;break;
case4:
i=0;break;
default:
break;
}
}
times++;
}
}
//调用数码管扫描
}
/*------------------------------------------------
外部中断0中断处理
作用:
接收信号,并存储到数组中
------------------------------------------------*/
voidEX0_ISR(void)interrupt0//外部中断0服务函数
{
staticunsignedchari;//接收红外信号处理
staticbitstartflag;//是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)//存储33位2个字节的用户码,1个字节数据码,一个字节数据码反码,一位同步位
{
irok=1;//处理完毕标志为1
i=0;
}
}
else
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 红外 遥控 步进 电机 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)