单片机步进电机控制DA转换.docx
《单片机步进电机控制DA转换.docx》由会员分享,可在线阅读,更多相关《单片机步进电机控制DA转换.docx(19页珍藏版)》请在冰点文库上搜索。
单片机步进电机控制DA转换
指导教师评定成绩:
审定成绩:
重庆邮电大学
综合设计报告
设计题目:
D/A转换器设计(实现三角波、正弦波)
单位(二级学院):
学生姓名:
专业:
班级:
学号:
指导教师:
设计时间:
年12月
重庆邮电大学制
基于单片机的步进电机控制系统
【摘要】:
步进电机是一种用于开环控制的驱动元件。
本文阐述了步进电机的基本工作原理,提出了基于单片机控制和集成电路驱动的步进电机控制实现方法以及软硬件设计方法。
本设计采用基于AT89s51单片机为核心,包括系统硬件设计和系统软件设计,来实现对步进电机的控制。
系统为一自动控制系统,通过按键向单片机输送控制信号,控制步进电机的转速和正反转。
采用AT89s51单片机指令系统进行编程来实现软件部分。
硬件部分采用L297与L298驱动芯片混合来实现对二相步进电机的驱动。
【关键词】:
AT89S51二相步进电机L297L298
1、步进电机的工作原理
步进电动机又称电脉冲马达,是伺服电动机的一种。
步进电动机可按照输入的脉冲指令一步步地旋转,即可将输入的数字信号转换成相应的角位移。
一次它实质上也是一种数模转换装置。
由于步进电动机成本较低,易于采用计算机控制,因而被广泛应用于开环控制的伺服系统中。
下面以三相步进电机为例讨论步进电机的工作原理。
图一、三相步进电机
三相反应式步进电动机的工作原理如图所示,其中步进电动机的定子上有6个齿,其上分别缠有WA、WB、WC三相绕组,构成三对磁极,转子上则均匀分布着4个齿。
步进电动机采用直流电源供电。
当WA、WB、WC三相绕组轮流通电时,通过电磁力吸引步进电动机转子一步一步地旋转。
假设在初始状态时,A相通电,其他两相断电,在磁力作用下,转子的1、3两齿与磁极A对齐。
然后切断A相电源,同时接通B相,则由于电磁力作用,转子将逆时针转过30度,使靠近磁极B的2、4两齿与B对齐。
接着再切断B相电源,接通C相,转子又逆时针回转30度,使靠近磁极C的1、3两齿与C对齐。
如果按上述通断电顺序(即A→B→C→A……)连续向各相绕组供电,则步进电动机将按逆时针方向连续旋转。
每通断电一次,步进电动机转过30度,称为一个步距角。
如果改变各绕组的通断电顺序,如A→C→B→A→……,步进电动机将按顺时针方向旋转。
如果改变绕组的通断电频率,则可改变步进电机的转速。
2、L297的工作原理介绍
L297是意大利SGS半导体公司生产的步进电机专用控制器,它能产生4相控制信号,可用于计算机控制的两相双极和四相单相步进电机,能够用单四拍、双四拍、四相八拍方式控制步进电机。
芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的电机绕组中的电流。
该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。
L297的芯片引脚特别紧凑,采用双列直插20脚塑封封装,其引脚见图1,内部方框见图2。
(1)在图2所示的L297的内部方框图中。
变换器是一个重要组成部分。
变换器由一个三倍计算器加某些组合逻辑电路组成,产生一个基本的八格雷码(顺序如图3所示)。
由变换器产生4个输出信号送给后面的输出逻辑部分,输出逻辑提供禁止和斩波器功能所需的相序。
为了获得电动机良好的速度和转矩特性,相序信号是通过2个PWM斩波器控制电动波器包含有一个比较器、一个触发器和一个外部检测电阻,如图4所示,晶片内部的通用振荡器提供斩波频率脉冲。
每个斩波器的触发器由振荡器的脉冲调节,当负载电流提高时检测电阻上的电压相对提高,当电压达到Uref时(Uref是根据峰值负载电流而定的),将触发器重置,切断输出,直至第二个振荡脉冲到来、此线路的输出(即触发器Q输出)是一恒定速率的PWM信号,L297的CONTROL端的输入决定斩波器对相位线A,B,C,D或抑制线INH1和INH2起作用。
CONTROL为高电平时,对A,B,C,D有抑制作用;为低电平时,则对抑制线INH1和INH2有抑制作用,从而可对电动机和转矩进行控制。
图二、L297引脚图
图三、L297内部方框电路图
图四、L297变换器换出的八步雷格码(顺时针旋转)
(2)L297各引脚功能说明
1脚(SYNG)——斩波器输出端。
如多个297同步控制,所有的SYNC端都要连在一起,共用一套振荡元件。
如果使用外部时钟源,则时钟信号接到此引脚上。
2脚(GND)——接地端。
3脚(HOME)——集电极开路输出端。
当L297在初始状态(ABCD=0101)时,此端有指示。
当此引脚有效时,晶体管开路。
4脚(A)——A相驱动信号。
5脚(INH1)——控制A相和B相的驱动极。
当此引脚为低电平时,A相、B相驱动控制被禁止;当线圈级断电时,双极性桥用这个信号使负载电源快速衰减。
若CONTROL端输入是低电平时,用斩波器调节负载电流。
6脚(B)——B相驱动信号。
7脚(C)——C相驱动信号。
8脚(INH2)——控制C相和D相的驱动级。
作用同INH1相同。
9脚(D)——D相驱动信号。
10脚(ENABLE)——L297的使能输入端。
当它为低电平时,INH1,INH2,A,B,C,D都为低电平。
当系统被复位时用来阻止电机驱动。
11脚(CONTROL)——斩波器功能控制端。
低电平时使INH1和INH2起作用,高电平时使A,B,C,D起作用。
12脚(Vcc)——+5V电源输入端。
13脚(SENS2)——C相、D相绕组电流检测电压反馈输入端。
14脚(SENS1)——A相、B相绕组电流检测电压反馈输入端。
15脚(Vref)——斩波器基准电压输入端。
加到此引脚的电压决定绕组电流的峰值。
16脚(OSC)——斩波器频率输入端。
一个RC网络接至此引角以决定斩波器频率,在多个L297同步工作时其中一个接到RC网络,其余的此引角接地,各个器件的脚I(SYNC)应连接到一起这样可杂波的引入问题如图5所示。
17脚(CW/CCW)—方向控制端。
步进电机实际旋转方向由绕组的连接方法决定。
当改变此引脚的电平状态时,步进电机反向旋转。
18脚(CLOCK)——步进时钟输入端。
该引脚输入负脉冲时步进电机向前步进一个增量,该步进是在信号的上升沿产生。
19脚(HALF/FULL)——半步、全步方式选择端。
此引脚输入高电平时为半步方式(四相八拍),低电平时为全步方式。
如选择全步方式时变换器在奇数状态,会得到单相工作方式(单四拍)。
20脚(RESET)——复位输入端。
此引脚输入负脉冲时,变换器恢复初始状态(ABCD=0101)。
3、L298N芯片介绍
L298N为SGS-THOMSONMicroelectronics所出产的双全桥步进电机专用驱动芯片(DualFull-BridgeDriver),内部包含4信道逻辑驱动电路,是一种二相
和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge的高电压、大电流双全桥式驱动器,接收标准
TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号,
但在本驱动电路中用L297来提供时序信号,节省了单片机IO端口的使用。
L298N之接脚如图9所示,Pin1和Pin15可与电流侦测用电阻连接来控制负载的电路;OUTl、OUT2和OUT3、OUT4之间分别接2个步进电机;input1~input4输入控制电位来控制电机的正反转;Enable则控制电机停转。
图五、L298引脚图
4、步进电机控制系统的设计
图六、步进电机控制系统
5、步进电机控制系统的具体设计
(1)步进电机控制系统的硬件设计
A.单片机最小系统的设计
单片机最小系统的组成包括AT89S51单片机、控制键盘、单片机复位电路和液晶显示。
键盘部分是有四个按键组成的控制键盘,分别控制的正转、反转、加速、减速功能。
液晶的组要功能是显示步进电机的转速与状态。
原理图如下:
图七、单片机最小系统
B.步进电机驱动部分的设计
步进电机的驱动部分包括L297与L298N驱动芯片共同组成的驱动模块对步进电机进行控制,步进电机驱动控制模块主要是通过单片机对L297的控制使得输出端A、B、C、D输出步进控制信号来对L298输入进行控制,使得L298的输出端的两相交替导通达到对步进电机的控制。
图中的二极管主要作用是续流作用,防止电机突然停止产生电流对控制模块产生破坏,烧坏芯片。
图八、步进电机驱动控制模块
具体驱动步骤:
a.通过A、B、
控制OUT1与OUT2使得A相导通。
b.通过C、D、
控制OUT3与OUT4使得B相导通。
c.A相与B相交替导通控制步进电机的转动。
(2)步进电机控制系统的软件设计
总流程图采用模块化结构,在RAM建立各控制量的映射,方便各功能模块的编程和修改。
分功能模块结构,可实现无扰动重入。
软件模块按功能划分,是以子程序的形式设计的,程序分别对各个功能进行调用,各个模块功能清晰明了。
本次设计采用单极性直流电源供电,只要对步进电机的各相绕组按合适
的时序通电,就能使步进电机步进转动。
按键子程序中包括按键扫描、按键去抖动、按键的键后处理。
按键扫描采用单个按键的扫描,分别对不同功能的按键扫描并存放不同的按键标志。
按键去抖动采用延时去抖法。
根据按键扫描后的按键标志位结果来处理相应的子程序。
键后处理采用键前沿,把键前沿后存放成触型按键,把前次扫描到的存放成控制型按键。
显示模块采用LCD的液晶显示。
设计总结
本设计以单片机AT89C52为控制核心,由单片机最小系统控制模块,液晶屏显示模块、步进电机驱动电路等部分组成。
其中步进电机驱动模块采用L297与L298芯片,实现对步进电机的控制。
利用软件编程,通过键盘控制和液晶显示实现了本设计的基本要求。
设计结果通过仿真很好的实现了对步进电机的控制,包括对步进电机的正反转与加减速,LCD实现了对步进电机速度的显示。
在进行硬件设计的时候采用手工还接制作电路板,要求工艺基本达到,但由于手工工艺的本身限制以及焊接水平的有限,使得电路板可能存在一些小问题,但不影响系统的功能实现。
附件
步进电机控制软件设计程序
#include"AT89X51.h"
intdelay();
voidinti_lcd();
voidshow_lcd(int);
voidcmd_wr();
voidShowState();
voidclock(unsignedintDelay;
voidDoSpeed();//计算速度
//正转值
#defineRIGHT_RUN1
//反转值
#defineLEFT_RUN0
sbitRS=0xA0;
sbitRW=0xA1;
sbitE=0xA2;
CharSpeedChar[]="SPEED(n/min):
";
charStateChar[]="RUNSTATE:
";
charSTATE_CW[]="CW";
charSTATE_CCW[]="CCW";
charSPEED[3]="050";
unsignedintRunSpeed=50;//速度
unsignedcharRunState=RIGHT_RUN;//运行状态
main()
{/*定时器设置*/
TMOD=0x66;//定时器0,1都为计数方式;方式2;
EA=1;//开中断
TH0=0xff;//定时器0初值FFH;
TL0=0xff;
ET0=1;
TR0=1;
TH1=0xff;//定时器1初值FFH;
TL1=0xff;
ET1=1;
TR1=1;
IT0=1;//脉冲方式
EX0=1;//开外部中断0:
加速
IT1=1;//脉冲方式
EX1=1;//开外部中断1:
减速
inti_lcd();
DoSpeed();
ShowState();
while
(1)
{clock(RunSpeed);
P0_1=P0_1^0x01;}}
//定时器0中断程序:
正转
voidt_0(void)interrupt1
{RunState=RIGHT_RUN;
P0_0=1;
P1=0x01;
cmd_wr();
ShowState();}
//定时器1中断:
反转
voidt_1(void)interrupt3
{RunState=LEFT_RUN;
P0_0=0;
P1=0x01;
cmd_wr();
ShowState();
}
//中断0:
加速程序
voidSpeedUp()interrupt0
{
if(RunSpeed>=12)
RunSpeed=RunSpeed-2;
DoSpeed();
P1=0x01;
cmd_wr();
ShowState();
}
//中断1:
减速程序
voidSpeedDowm()interrupt2
{if(RunSpeed<=100)RunSpeed=RunSpeed+2;
DoSpeed();
P1=0x01;
cmd_wr();
ShowState();}
intdelay()//判断LCD是否忙
{inta;
start:
RS=0;
RW=1;
E=0;
for(a=0;a<2;a++);
E=1;
P1=0xff;
if(P1_7==0)
return0;
else
gotostart;}
voidinti_lcd()//设置LCD方式
{
P1=0x38;
cmd_wr();
delay();
P1=0x01;//清除
cmd_wr();
delay();
P1=0x0f;
cmd_wr();
delay();
P1=0x06;
cmd_wr();
delay();
P1=0x0c;
cmd_wr();
delay();
}
voidcmd_wr()//写控制字
{
RS=0;
RW=0;
E=0;
E=1;
}
voidshow_lcd(inti)//LCD显示子程序
{
P1=i;
RS=1;
RW=0;
E=0;
E=1;
}
voidShowState()//显示状态与速度
{
inti=0;
while(SpeedChar[i]!
='\0')
{
delay();
show_lcd(SpeedChar[i]);
i++;
}
delay();
P1=0x80|0x0d;
cmd_wr();
i=0;
while(SPEED[i]!
='\0')
{
delay();
show_lcd(SPEED[i]);
i++;
}
delay();
P1=0xC0;
cmd_wr();
i=0;
while(StateChar[i]!
='\0')
{
delay();
show_lcd(StateChar[i]);
i++;
}
delay();
P1=0xC0|0x0A;
cmd_wr();
i=0;
if(RunState==RIGHT_RUN)
while(STATE_CW[i]!
='\0')
{
delay();
show_lcd(STATE_CW[i]);
i++;
}
else
while(STATE_CCW[i]!
='\0')
{
delay();
show_lcd(STATE_CCW[i]);
i++;
}
}
voidclock(unsignedintDelay)//1ms延时程序
{unsignedinti;
for(;Delay>0;Delay--)
for(i=0;i<124;i++);
}
voidDoSpeed()
{
SPEED[0]=(1000*6/RunSpeed/100)+48;SPEED[1]=1000*6/RunSpeed%100/10+48;SPEED[2]=1000*6/RunSpeed%10+48;
}
LCD1602的显示流程图