单片机原理与接口技术第 15章,C语言程序的设计实例
15.1步进电机控制
15,1,1步进电机的原理及工作方式步进电机也称为脉冲电机。它可以接收来自计算机的数字脉冲,使电机旋转过相应的角度。步进电机可快速启停,
精确定位,是一种高精度执行部件,得到了广泛采用。
第 15章,C语言程序的设计实例步进电机的特点
● 给步进脉冲电机就转,不给步进脉冲电机就不转;
●步进脉冲的频率越高,步进电机转得越快;
●改变各相的通电方式,可以改变电机的运行方式;
●改变通电顺序,可以控制步进电机的正、
反转。
第 15章,C语言程序的设计实例步进电机的原理图第 15章,C语言程序的设计实例
3个电极的步进电机上图是一个拥有 3个电极的步进电机,
由图可知,步进电机的转子是一个永久磁铁,在步进电机的定子上有三个电磁铁,
也称为三个磁极,分别用 A相、相 B和 C相表示,这三相绕组相差 120度角。
第 15章,C语言程序的设计实例步进电机的工作原理第 15章,C语言程序的设计实例三相步进电机的工作方式
单相三拍工作方式。
三相六拍工作方式
双三拍工作方式第 15章,C语言程序的设计实例单相三拍工作方式其电机控制绕组 A,B,C相。
正转通电顺序为 A→B→C→A ;
反转通电顺序为 A→C→B→A 。
第 15章,C语言程序的设计实例通电顺序为 A→B→C→A 的波形图第 15章,C语言程序的设计实例三相六拍工作方式正转的绕组通电顺序为
A→AB→B→BC→C→CA→A ;
反转的绕组通电顺序为
A →AC→C→CB→B→BA→A 。
第 15章,C语言程序的设计实例通电顺序为
A→AB→B→BC→C→CA→A 的波形图
D/A转换器的输入信号主要有两种分别为:
数字信号和基准电压。
D/A转换器的输出信号是模拟量,大部分的输出是电流,也有的输出电压。
第 15章,C语言程序的设计实例双三拍工作方式
正转的绕组通电顺序为
AB→BC→CA→AB ;
反转的绕组通电顺序为
AB→AC→CB→BA 。
第 15章,C语言程序的设计实例通电顺序为 AB→BC→CA→AB
第 15章,C语言程序的设计实例
15,1,2 步进电机与单片机的接口图 15-6是 8051与步进电机的接口电路。
8051的 P1.0~ P1.2三位用来控制步进电机定子的 A,B,C三相控制绕组通电与断电。
第 15章,C语言程序的设计实例步进电机与单片机的接口第 15章,C语言程序的设计实例说明在这个接口电路中,硬件部分完成脉冲的驱动与光电隔离。由单片机软件实现步进脉冲的产生及脉冲在各相绕组的分配和电机的正、反转控制。
第 15章,C语言程序的设计实例
15,1,3 步进电机的单相三拍方式控制单相三拍正转脉冲顺序为
A→B→C→A,
P1口输出的数字控制字为
01H→02H→04H→01H ;
第 15章,C语言程序的设计实例单相三拍反转脉冲顺序为
A→C→B→A,
p1口输出的数字控制字为
01H→04H→02H→01H 。
由控制字字节可以看出,采用字节的移位即可,但要注意复原循环。
单相三拍反转脉冲顺序第 15章,C语言程序的设计实例产生单相三拍时序脉冲产生单相三拍时序脉冲的 Cx51函数如下。函数包含步进电机的转动方向和转动的步数参数。在每次输出时序字节后,通常需延时一段时间,延时时间的长短决定了步进电机的工作频率,即转速的快慢。
延时可采用软件延时,也可以由定时器定时。
第 15章,C语言程序的设计实例应用程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void void ctrl(cf,n)
bit cf ;
uint n;
第 15章,C语言程序的设计实例
{uint i,k;
uchar j=0x01;
if (cf=0)
for(i=0;i<n;i++)
{p1=j;
for (k=0;k=50000;k++);
j=j<<1;
if((j*0x80)= =0)
j=0x01;
}
else
{for (i=0; i<n; i++)
{p1=j;
for (k=0;k=50000;k++);
j=j>>1;
if(j= =0)
j=0x04;
}
}
}
第 15章,C语言程序的设计实例
void main (void)
{if (DR= =1)
ctrk(1,100);
else
ctrl(0,100);
}
第 15章,C语言程序的设计实例
15,1,4 三相六拍方式控制采用三相六拍运行方式,
步进电机正转绕组通电顺序为:
A→AB→B→BC→C→CA→A,
P1口发出的控制字为:
01H→03H→02H→06H→04H→05H→01H
第 15章,C语言程序的设计实例步进电机反转绕组通电顺序步进电机反转绕组通电顺序为:
A→CA→C→CB→B→BA→A,
P1口发出的控制字为:
01H→05H→04H→06H→02'H→03H→01H
第 15章,C语言程序的设计实例产生六拍方式控制脉冲产生六拍方式控制脉冲的 Cx51函数如下。函数包含步进电机的转动方向和转动的步数参数。正转和反转的 6个控制字放在数组中,以 00作结尾字节,便于判断。
第 15章,C语言程序的设计实例应用程序
#include<reg51.h>
#define DL 50
#define DR 0
#define uchar unsigned char
#define uint unsigned int
第 15章,C语言程序的设计实例
uchar idata plus[7]=
{0x01,0x03,0x02,0x06,0x04,0x05,0x00};
uchar idata minu[7]=
{0x01,0x05,0x04,0x06,0x02,0x03,0x00};
uchar k=0;
uchar idata *x;
第 15章,C语言程序的设计实例
void control(cf,n);
bit cf ;
uint n;
{uint i;
if (cf= =0)
x=&plus[0];
else
x=&minu[0];
TMOD =0X01;
TH0=(65536-DL*500)/256;
TL0=(65536-DL*500)%256;
TR0=1;
{for (i=0; i<n; i++)
{while(k= =0);
k=0;
}
}
第 15章,C语言程序的设计实例
void delay(void)interrupt 1 using 1;
{ p1=*x++;
if (*x++)
x=x-6;
TH0=(65536-DL*500)/256;
TL0=(65536-DL*500)%256;
k=1;
}
第 15章,C语言程序的设计实例
void main(void);
{if (DR==0)
control(0,10);
else
control(1,10);
}
第 15章,C语言程序的设计实例
15,1,5步进电机变速控制由于步进电机的转子有一定的惯性以及所带负载的惯性,故步进电机在工作过程中不能立即启动和停止。在启动时应慢慢地逐渐加速到预定速度,在停止前应逐渐减速到停止,否则将产生失步现象。
第 15章,C语言程序的设计实例步进电机的控制问题可总结为以下两点
① 产生工作方式需要的时序脉冲;
②控制步进电机的速度,使它始终遵循加速一匀速一减速的规律工作。
第 15章,C语言程序的设计实例
15.2频率量的测量单片机对频率量有两种测量方法:
测量频率法和测量周期法。
测量频率法是在单位定时时间内,对被测信号脉冲进行计数;测量周期法是在被测信号周期时间内,对某一基准脉冲进行计数。
第 15章,C语言程序的设计实例
15,2,1 测量频率法在测量频率法的最简单的接口电路中,可将频率脉冲直接连接到 8051的 T1端,将 8051
的 T0用做定时器,T1用做计数器。在 T0定时时间里,对频率脉冲进行计数。 T1的计数值便是单位定时时间里的脉冲个数。
第 15章,C语言程序的设计实例测量频率法脉冲波形第 15章,C语言程序的设计实例说明在计数时会出现如图 15-7所示的丢失脉冲的情况。第一个丢失的脉冲是由于开始检测时脉冲宽度已小于机器周期 T;第二个丢失的脉冲是由于脉冲的负跳变在定时之外。定时时间内出现脉冲丢失,将引起测量精度降低。脉冲频率越低,这种误差越大。显然对于较低频率的脉冲测量不适合采用测量频率法。
第 15章,C语言程序的设计实例
15,2,2 带同步控制的频率测量为解决第一个脉冲的丢失,可用门电路实现计数开始与脉冲上升沿的同步控制。
图 15-8是用 8051的 T0作定时器,T1作计数器,对频率 fx小的脉冲用频率测量法的接口电路。
第 15章,C语言程序的设计实例说明控制时,首先 P1.0发一个清零负脉冲,使 U1,
U2两个 D触发器复位,其输出封锁与门 G1和 G2。
接着由 P1.1发一个启动正脉冲,其有效上升沿使
U1= 1,门 G1被开放。被测脉冲上升沿通过 G2
送 T1计数;同时 U2输出的高电平使 ·INT0·= 1,
定时器 0的门控 GATE有效,启动 T0开始定时。
直到定时结束时,从 P1.0发一负脉冲,清零 U2,
封锁 G2,停止 T1计数,完成一次频率采样过程。
第 15章,C语言程序的设计实例说明测量 T/ C定时时间为 500ms,这样长的时间定时,先由 T0定时 100ms,之后软件 5次中断后的时间即为 5× 100 ms= 500
ms。 中断次数的计数值在 msn中 。
第 15章,C语言程序的设计实例频率测量电路第 15章,C语言程序的设计实例应用程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define A 5
sbit P1_0=p1^0;
sbit P1_1=p1^1;
uchar msn=A;
bit idata tf=0;
第 15章,C语言程序的设计实例
unit count (void)
{P1_0=0; P1_0=1;
TMOD=0x59;
TH0=0x3c;
TL0=0xb0;
TH1=0x00;
TL1=0x00;
TR0=1;
TR1=1;
PT0=1;
ET0=1;ET1=1;
EA=1;
P1_0=0; P1_0=1;
While(tf!=1);
P1_0=0;
P1_0=1;
TR0=0;
TR1=0;
Return(TH1*256+TL1);
}
第 15章,C语言程序的设计实例
void timer0(void) interrupt 1 using 1
{ TH0=0x3c; TL0=0xb0;
msn--;
if (msn = =0)
{msn=A;
tf=1;
}
第 15章,C语言程序的设计实例
void timer0(void) interrupt 3 { }
void main (void)
{ float rate;
rate=(10/A)*count();
}
第 15章,C语言程序的设计实例
15.3频率脉冲的测量周期法测量周期法的基本原理是在被测信号周期 T内,对某一基准时间进行计数,
基准时间与计数值的乘积便是周期 T。
如图 15-9所示。周期测量法适用于对较低频率的脉冲进行测量。
第 15章,C语言程序的设计实例周期测量波形第 15章,C语言程序的设计实例说明用 805l的定时器/计数器对频率为 fx的脉冲进行周期测量的接口电路如图 15-10所示。
图中的 D触发器 74LS74实现脉冲频率到周期的转换。其 Q端输出作 8051的 INT0端输人,控制启动 T0开始定时,即对机器周期的内部脉冲进行计数。
第 15章,C语言程序的设计实例图 15-10周期测量电路第 15章,C语言程序的设计实例说明周期测量电路如图 15-10所示。当 INT0
变为低电平时,INT0下降沿产生中断请求。在 INT0的中断服务程序中,关闭 T0,
对计数结果进行处理。 T0的定时计数值便是周期时间的测量值。
第 15章,C语言程序的设计实例说明为保证 T0定时与频率脉冲的上升沿同步,
在用 TR0启动 T0之前,应先用 P1.0将
74LS74清零,脉冲上升沿时 INT0变为高电平,启动定时器 T0。
第 15章,C语言程序的设计实例
15,3,1对周期的测量设 fosc= 6 MHz,机器周期为 2μs,测周期的测量值为计数值乘以 2程序 period,c
如下:
第 15章,C语言程序的设计实例应用程序
#include <reg51.h>
#define uint unsigned int
sbit P1_0=p1^0;
bit rflag=0; /*周期标志 */
第 15章,C语言程序的设计实例
void coutrol (void)
{TMOD=0x09; /*定时器 /计数器 0为方式 1*/
IT0=1;
TH0=0;TL0=0;
P1_0=0;P1_0=1; /*触发器清零 */
TR0=1;EX0=1;
EA=1; /*启动定时器 T0开中断 */
}
第 15章,C语言程序的设计实例
void timer0(void) interrupt 0 using 1
/*INT0中断服务 */
{ EA=0; TR0=0;
Count =TL0+TH0*256; /*取计数器值 */
rflag=1; /*设标志位 */
EA=1;
}
第 15章,C语言程序的设计实例
void main (void)
{ cotrol();
while(rflag= =0); /*等待一个周期 */
period=count*2; /*晶振频率为 6M,2us计数增 1,周期单位为 us*/
}
第 15章结束