反应式步进电动机采用高导磁材料构成齿状转子和定子,其结构简单,生产成本低,步距角可以做的相当小,一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。
反应式步进电机的转子磁路由软磁材料制成,定子上有多相励磁绕组,利用磁导的变化产生转矩,但动态性能相对较差。
永磁式步进电机转子采用多磁极的圆筒形的永磁铁,在其外侧配置齿状定子。
用转子和定子之间的吸引和排斥力产生转动,它的出力大,动态性能好,但步距角一般比较大。
一般为两相,转矩和体积较小,步进角一般为7.5度或15度。
混合式步进电机是指混合了永磁式和反应式的优点。
它又分为两相和五相:
两相步进角一般为1.8度而五相步进角一般为0.72度。
这种步进电机的应用最为广泛,它是PM和VR的复合产品,其转子采用齿状的稀土永磁材料,定子则为齿状的突起结构。
此类电机综合了反应式和永磁式两者的优点,步距角小,出力大,动态性能好,是性能较好的一类步进电动机,在计算机相关的设备中多用此类电机。
步进电机有步距角<涉及到相数)、静转矩、及电流三大要素组成。
一旦三大要素确定,步进电机的型号便确定下来了。
1、步距角的选择
电机的步距角取决于负载精度的要求,将负载的最小分辨率<当量)换算到电机轴上,每个当量电机应走多少角度<包括减速)。
电机的步距角应等于或小于此角度。
目前市场上步进电机的步距角一般有0.36度/0.72度<五相电机)、0.9度/1.8度<二、四相电机)、1.5度/3度<三相电机)等。
2、静力矩的选择
步进电机的动态力矩一下子很难确定,我们往往先确定电机的静力矩。
静力矩选择的依据是电机工作的负载,而负载可分为惯性负载和摩擦负载二种。
单一的惯性负载和单一的摩擦负载是不存在的。
直接起动时<一般由低速)时二种负载均要考虑,加速起动时主要考虑惯性负载,恒速运行进只要考虑摩擦负载。
一般情况下,静力矩应为摩擦负载的2-3倍内好,静力矩一旦选定,电机的机座及长度便能确定下来<几何尺寸)。
3、电流的选择
静力矩一样的电机,由于电流参数不同,其运行特性差别很大,可依据矩频特性曲线图,判断电机的电流<参考驱动电源、及驱动电压)。
4、力矩与功率换算
步进电机一般在较大范围内调速使用、其功率是变化的,一般只用力矩来衡量,力矩与功率换算如下:
P=Ω•MΩ=2π•n/60P=2πnM/60
其P为功率单位为瓦,Ω为每秒角速度,单位为弧度,n为每分钟转速,M为力矩单位为牛顿•M
P=2πfM/400(半步工作)
其中f为每秒脉冲数<简称PPS)
2.3设计目标
<1)一个正反转开关控制正转和反转;
<2)一个速度开关控制高速和低速<高速和低速只要有明显差别);
<3)一个半圈按钮,按一下时转半圈,一个一圈按钮,按一下时转一圈;
<4)一个连续转动按钮,按一下时连续转动,再按一下时停止转动;
<5)深入理解步进电机工作原理,设计系统方案;
<6)用protel画出系统原理图,要求是一个完整的单片机控制系统,电源为220V交流电
在单片机实验室调试。
第3章设计思路与具体内容
3.1设计思路
本系统主要由供电电源模块、单片机最小系统、按键电路、步进电机驱动电路以及步进电机等几部分组成。
本系统采用两个独立开关三个独立按钮,分别进行高低速、正反转、半圈、一圈以及连动的控制。
驱动电路采用ULN2003A实现步进电机的驱动。
步进电机的供电采用独立12V供电。
3.2总体设计框图及电路原理图
总体设计框图如图3.1所示。
图3.1总体设计框图
3.3单片机最小系统及按键部分
最小系统主要是为了单片机的正常工作。
51单片机是一种低功耗/低电压、高性能的8位单片机,它采用CMOS和高密度非易失性存储器技术,而且其输出引脚和指令系统都与MCS-51兼容;片内的FlashROM允许在系统内改编程序或用常规的非易失性编程器来编程,内部除CPU外,还包括256字节RAM,4K字节的ROM,4个8位并行I/O口,5个中断源,2个中断优先级,2个16位可编程定时计数器。
89S51单片机是一种功能强、灵活性高且价格合理的单片机,且支持在线编程,完全满足本系统设计需要。
单片机最小系统包括单片机和复位电路,振荡电路。
3.4按键电路
采用2个开关3个按键来控制步进电机,即“高低速切换”、“正反转切换”、“半圈”、“一圈”和“连动切换”。
当波动开关或按下其中一个按键时,电源通过上拉电阻和按键到地形成通路,使相应输入管脚接地,即给单片机送入一个低电平,此低电平即为有效电平。
按键电路及单片机最小系统部分如图3.2所示。
图3.1最小系统及按键电路
3.5步进电机驱动电路
步进电机的驱动电路如图3.3所示,驱动芯片采用ULN2003A。
图3.2步进电机的驱动电路
第四章程序设计
4.1程序设计思路
根据单片机外围电路的设计,单片机的P2.0、P2.1、P2.2、P2.3、P3.2为按键输入,P1.0、P1.1、P1.2、P1.3与电机驱动IC相连。
单片机采用扫描按键方式<其中连动切换按键采用外部中断方式),程序根据键值结果进行相应的操作。
步进电机的正反转利用给步进电机送入与原来相反的脉冲即可,步进电机的加减速控制是主要控制步进电机送脉冲的时间。
4.2程序设计
程序中首先进行两个切换开关的检测,确定电机转速及方向,然后进行按键扫描,确定点动和电动方式或者连动,其中连动切换用外部中断0控制。
图4.1程序流程图
第五章总结
通过此次课程设计,使我更加扎实的掌握了有关单片机应用方面的知识,在设计过程中尤其是自己动手编制程序时,遇到了很多困难,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我掌握的知识不再是纸上谈兵,而是学以致用。
同时,这次课程设计让我感受到了我对所学习的内容是多么的不熟练,在设计过程中总是需要翻书,还总是会出现问题,同时这些问题也提醒了我那些地方没学好,加深了对这部分知识的印象。
课程设计不仅仅是一门专业课,使我学到很多专业知识以及提升了专业技能上,同时又是一门提升自我综合能力的课程,给了我莫大的发展空间,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高;更重要的是,在课程设计中,我们学会了很多学习的方法,而这些都将为日后做准备,会使我们终身都受益匪浅。
面对社会的挑战,只有不断的学习、实践,再学习、再实践,才能在最大程度上发掘自己。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
参考文献
[1]丁元杰著.单片微机原理及应用[M].机械工业出版社,2018年1月
[2]李秀霞PROTELdxp2004电路设计与仿真教程[M].北京:
北京航空航天大学出版社,2007年11月
附录
电路原理图
程序代码:
#include
//uchar,uint,宏定义
#defineucharunsignedchar
#defineuintunsignedint
//开关,位定义
sbitDirection=P2^0。
//正反转方向切换
sbitSpeed=P2^1。
//高低速切换
//按键,位定义
sbitHalf=P2^2。
//转半圈
sbitCircle=P2^3。
//转一圈
sbitSwitch=P3^2。
//连续转动/停止切换
//步进电机连接端口,位定义
sbitA1=P1^0。
sbitB1=P1^1。
//B相,因头文件已定义'B',故用B1
sbitC1=P1^2。
sbitD1=P1^3。
//通电方式,宏定义
#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。
}
//全部断电
//全局变量定义
uintv1=10。
//高速转速
uintv2=5。
//低速转速
uinti=512。
//转动一圈
uintj=8。
//转动半圈
bitFlag=1。
//子函数声明
voidDelayUs2x(uchart>。
voidDelayMs(uchart>。
voidInit_Time0(void>。
//voidTime0_isr(void>interrupt1
//voidForward(uinta>。
//正转子函数
//voidReverse(uintb>。
//反转子函数
//uS延时函数,晶振使用12M,大致延时T=(tx2+5>uS
voidDelayUs2x(uchart>
{
while(--t>。
}
//mS延时函数,晶振使用12M,大致延时T=tmS
voidDelayMs(uchart>
{
while(t-->
{
DelayUs2x(245>。
DelayUs2x(245>。
}
}
//正转,a=i或j,b=v
voidForward(uinta,uintb>
{
Coil_OFF
while(a-->
{
Coil_A1
DelayMs(b>。
Coil_B1
DelayMs(b>。
Coil_C1
DelayMs(b>。
Coil_D1
DelayMs(b>。
}
}
//反转,a=i或j,b=v1或v2
voidReverse(uinta,uintb>
{
Coil_OFF
while(a-->
{
Coil_D1
DelayMs(b>。
Coil_C1
DelayMs(b>。
Coil_B1
DelayMs(b>。
Coil_A1
DelayMs(b>。
}
}
//连续转动,正转b=v1或v2
voidCon1(uintb>
{
Coil_OFF
if(!
Flag>
{
Coil_A1
DelayMs(b>。
Coil_B1
DelayMs(b>。
Coil_C1
DelayMs(b>。
Coil_D1
DelayMs(b>。
}
}
//连续转动,反转b=v1或v2
voidCon2(uintb>
{
Coil_OFF
if(!
Flag>
{
Coil_D1
DelayMs(b>。
Coil_C1
DelayMs(b>。
Coil_B1
DelayMs(b>。
Coil_A1
DelayMs(b>。
}
}
voidISR_INT0(void>interrupt0
{
if(!
INT0>
{
DelayMs(10>。
if(!
INT0>
{
while(!
INT0>。
Flag=!
Flag。
}
}
}
//主函数
intmain(void>
{
EA=1。
//开全局中断
EX0=1。
//开外部中断0
IT0=1。
//边沿触发
while(1>
{
Coil_OFF
{
if(Speed&&Direction>
//高速(v1>,正转(Forward>
//开关,故无需消抖环节
{
if(Flag&&!
Half>
//转半圈
{
while(!
Half>。
//等待按键释放
Forward(j,v1>。
//半圈,高速
}
elseif(Flag&&!
Circle>//转一圈
{
while(!
Circle>。
Forward(i,v1>。
}
elseif(!
Flag>//连续转动
{
Con1(v1>。
}
elseif(Flag&&Half&&Circle>
Coil_OFF
else
Coil_OFF
}
elseif(!
Speed&&Direction>
//低速(v2>,正转(Forward>
{
if(Flag&&!
Half>
//转半圈
{
while(!
Half>。
//等待按键释放
Forward(j,v2>。
/
/半圈,高速
}
elseif(Flag&&!
Circle>//转一圈
{
while(!
Circle>。
Forward(i,v2>。
}
elseif(!
Flag>//连续转动
{
Con1(v2>。
}
elseif(Flag&&Half&&Circle>
Coil_OFF
else
Coil_OFF
}
elseif(Speed&&!
Direction>
//高速(v1>,反转(Reverse>
{
if(Flag&&!
Half>//转半圈
{
while(!
Half>。
//等待按键释放
Reverse(j,v1>。
//半圈,高速
}
elseif(Flag&&!
Circle>//转一圈
{
while(!
Circle>。
Reverse(i,v1>。
}
elseif(!
Flag>//连续转动
{
Con2(v1>。
}
elseif(Flag&&Half&&Circle>
Coil_OFF
else
Coil_OFF
}
elseif(!
Speed&&!
Direction>
//低速(v2>,反转(Reverse>
{
if(Flag&&!
Half>//转半圈
{
while(!
Half>。
//等待按键释放
Reverse(j,v2>。
//半圈,高速
}
elseif(Flag&&!
Circle>//转一圈
{
while(!
Circle>。
Reverse(i,v2>。
}
elseif(!
Flag>//连续转动
{
Con1(v2>。
}
elseif(Flag&&Half&&Circle>
Coil_OFF
else
Coil_OFF
}
else
Coil_OFF
}
}
}