微机原理课程设计报告-步进电机的定时控制(作者:邓南化)
微机原理课程设计报告
——步进电机的定时控制
姓 名: 邓南化
学 号: 20091589
班 级: 06120901
所在学院: 自动化学院
---------------------------...
微机原理课程设计
——步进电机的定时控制
姓 名: 邓南化
学 号: 20091589
班 级: 06120901
所在学院: 自动化学院
--------------------------------------------------------------------------------------
步进电机的定时控制
一、设计要求
用单片机实现秒表计时,把当前时间显示在 LED板上,显示小时、分、秒。
要求使用定时器精确定时。
预约电机工作,当时间为 00:03:00 时,电机开始正向慢速转动;当时间
为 00:03:30时,电机停转;当时间为 00:04:00时,电机开始反向快速转动;
当时间为 00:04:40时,电机停止转动。
二、元器件清单
51单片机最小系统板
ULN2003
步进电机
6针电机插座
LED显示板
三、实现原理
定时功能
采用 51 单片机内部的硬件定时器资源,能过设置定时器的初始值来实现按
要求计数,因单片机定时器计数时间是确定的,从而可实现精确定时。
使用定时器中断,当计数器溢出时触发一次中断,再添加一个计数变量,就
能实现更长时间的定时了。如使用定时器的工作方式 1,
EA=0;//关总中断
TMOD=0x01;//T0 工作于方式 1
TR0=0;//禁止开始计数
ET0=1;//中断允许
TR0=1;//开始计数
EA=1;//开总中断
TH0=(65536-45872)/256;//装初值,11.0592M定时 50ms数为 45872
TL0=(65536-45872)%256;
--------------------------------------------------------------------------------------
通过改变程序中的 45872,可以改变定时器响应一次中断所用的时间。在中
断程序中重新设置初值,使计数变量加 1,就能通过计数变量的大小确定时间了。
//--------------------定时器中断
--------------------------------
void COUNT(void) interrupt 1 using 1
{
TH0=(65536-45872)/256;//装初值,11.0592M定时 50ms数为 45872
TL0=(65536-45872)%256;
TR0=0;
cnt++;
if(cnt==20) {cnt=0;}
TR0=1;
}
每 50ms 进入一次定时器中断,计数变量 cnt 每 20次清零一次,则每次可计
时 1s。
LED灯的显示
这次实现的数码管的驱动芯片为 HCF4094,使用串行通信可实现单片机与
4094的控制,从而驱动数码管正常显示。
步进电机的控制原理
步进电机是一种奖电脉冲转换成相应角位移或线位移的电磁机械装置。它具
有快速启停能力。在电机负荷不超过它能提供的动态转矩时,可以通过输入脉冲
来控制它在一瞬间的启动和停止。步进电机的步距角和转速只和输入的脉冲频率
有关,和环境温度、气压、振动无关,也不受电网电压的波动和负载变化的影响。
因此,步进电机多应用在需要精确定位的场合。
步进电机分类
(1) 永磁式(PM):一般为二相,转矩和体积较小,步距角一般为 7.5 度或
15度;
(2) 反应式(VR):一般为三相,可实现大转矩输出,步距角一般为 1.5度,
但噪声和振动都很大。在欧美等发达国家 20世纪 80年代已经淘汰;
(3) 混合式(HB):指混合了永磁式和反应式的优点。它又分为二相和五相,
--------------------------------------------------------------------------------------
二相步距角一般为 1.8度,而五相步距角一般为 0.72度。这种步进电机的应
用最为广泛。
电机工作原理
步进电机有三线式、五线式和六线式,但其控制方式均相同,都要以脉冲信
号电流来驱动。假设每旋转一圈需要 200个脉冲信号来励磁,可以计算出每个励
磁信号能使步进电机前进 1.8度,其旋转角度与脉冲个数成正比。步进电机的正、
反转由励磁脉冲产生的顺序来控制。每出现一个脉冲信号,步进电机只走一步。
因此,只要依序不断送出脉冲信号,步进电机就能实现连续转动。
四、系统电路图
五、流程图
开始
结束
慢速正转 快速反转
计时
初始化
--------------------------------------------------------------------------------------
六、分工说明
姓名 学号 分值 负责工作
邓南化 20091589 9 系统设计、电路焊接、程序编写、系统调试等
哈泽尔 20099003 3 电路检查
王奎 20099062 3 查找资料
七、
这次的微机原理课程设计,学习到了许多东西。由于组员是两名留学生,所
以自己承担的任务就重了。知道设计要求与元器件后,先理清系统的实现原理,
设计出系统
。网上查找资料后对每个元器件都有了较清晰的了解。根据原理
和器件的 datasheet,用 AltiumDesigner画出系统的电路图。接着焊接好电路,进
行编程调试,最后出来结果。
查资料时,对步进电机的了解花了比较多的时间,因为以前没有使用过,对
混合式的六线步进电机的接线不是太了解,经过查找很多资料后确定了接成两相
式。调试时对步进电机的控制也是难点,主要在脉冲时间上。而 LED 数码管的
显示也是一大难点,因为是通过串行通信来控制显示的。
总之,这次课程设计,又大大地锻炼我的实践能力。以后对各种硬件还要多
加学习与应用,才可以成为一名优秀的硬件工程师。
--------------------------------------------------------------------------------------
附件:
源程序
/*************************************
函数名:
输入:无
输出:步进电机控制信号;LED 灯显示数字
功能:按指定时间控制电机快速与慢速转动,正转与反转
作者:邓南化
**************************************/
#include
unsigned char cnt=0; //定义计数变量
unsigned char dir=1; //电机转动方向标志变量
unsigned char speed=0; //电机转动速度变量
unsigned char num1s=0;
unsigned char num1min=0;
unsigned char num1hour=0;
sbit Led0=P1^0;
char f=1;
//电机控制序列
unsigned char code F_Rotation[4]={0x10,0x20,0x40,0x80};
//不带小数点的数码管编码
unsigned char code talbe[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
0xe0,0xfe,0xf6};
//--------------------延时函数--------------------
void delayms(int count) //delay
{
int i;
while(count)
{
i=110;
while(i>0)
i--;
count--;
}
--------------------------------------------------------------------------------------
}
//--------------------电机控制函数--------------------------------
void Motor(unsigned char speed,unsigned char dir )//speed越大,速度越小
{
unsigned char i=0;
//-------------正转--------------
if(1==dir)
{
for(i=0;i<4;i++)
{
P2=F_Rotation[i];
delayms(speed);
}
}
//--------------反转-----------
if(0==dir)
{
for(i=0;i<4;i++)
{
P2=F_Rotation[3-i];
delayms(speed);
}
}
//-------------正转--------------
if(2==dir)
P2=0x00;
}
//--------------------计时函数--------------------------------
void MyTime(void)
{
if(num1s==60){
num1s=0;
num1min++;
if(num1min==60){
num1min=0;
num1hour++;
if(num1s==24){
num1hour=0;}
}
}
}
--------------------------------------------------------------------------------------
//--------------------串口初始化函数----------------------
void SerialInit(void)
{
SCON=0;
EA=1;//开总中断
ES=1;//开串口中断
TI=0;//取消中断,清零
}
//--------------------定时器初始化函数----------------------
void TimeInit(void)
{
EA=0;//关总中断
TMOD=0x01;//T0 工作于方式 1
TR0=0;//禁止开始计数
ET0=1;//中断允许
TR0=1;//开始计数
EA=1;//开总中断
TH0=(65536-45872)/256;//装初值,11.0592M定时 50ms数为 45872
TL0=(65536-45872)%256;
//初始时间设置
num1s=40;
num1min=2;
num1hour=0;
}
//--------------------LED 发送延时时函数------------
void delayled(void)
{
char i=1;
while(i>0) i--;
}
//--------------------计时函数---------------------------
void TimeLed()
{
SBUF=talbe[num1s%10];
delayled();
SBUF=talbe[num1s/10];
delayled();
SBUF=talbe[num1min%10];
delayled();
SBUF=talbe[num1min/10];
delayled();
--------------------------------------------------------------------------------------
SBUF=talbe[num1hour%10];
delayled();
SBUF=talbe[num1hour/10];
delayled();
}
//--------------------主函数--------------------------------
void main()
{
//-------------初始化部分---------------
TimeInit();
SerialInit();
dir=2;//stop
//-------------循环执行部分---------------
while(1)
{
//1s发一次串行控制,f是为了防止 50ms内发送多次,数码管闪烁.
if(cnt==0&&f==1) TimeLed();
f=0;
Motor(speed,dir);
//电机控制变量赋值
{
if(num1min==3&&num1s<=30) {dir=1;speed=10;}
else
if(num1min==4&&num1s<=40) {dir=0;speed=5;}
else dir=2;
}
}//while
}
//--------------------定时器中断函数--------------------------------
void COUNT(void) interrupt 1 using 1
{
TH0=(65536-45872)/256;//装初值,11.0592M定时 50ms数为 45872
TL0=(65536-45872)%256;
TR0=0;
cnt++;
if(cnt==20)
{
cnt=0;//计数变量清零
num1s++;//一秒变量加 1
--------------------------------------------------------------------------------------
Led0=~Led0;//LED 灯闪灯,用于编程测试用
f=1;
MyTime();
}
TR0=1;
}
//--------------------串口中断函数--------------------------------
void ser0() interrupt 4
{
TI=0;
}
相片
本文档为【微机原理课程设计报告-步进电机的定时控制(作者:邓南化)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。