使用89C51控制四相六线步进电机,
步进电机采用四相六线,步距角1.8度,半步工作0.9度八拍运行。
接口如下:
P15---启动信号输入
P14---停止信号输入
P13---接光电传感器
P20---输出控制步进电机的A相
P21---输出控制步进电机的B相
P22---输出控制步进电机的C相
P23---输出控制步进电机的D相
如下是我给步进电机八拍运行正向通电顺序:
P23(D相)、P22(C相)、P21(B相)、P20(A相)
第一步: 0 0 0 1
第二步: 0 0 1 1
第三步: 0 0 1 0
第四步: 0 1 1 0
第五步: 0 1 0 0
第六步: 1 1 0 0
第七步: 1 0 0 0
第八步: 1 0 0 1
使用光电传感器的输出作为脉冲信号,光电接收管的后面加一个三极管做信号放大。
光电传感器前有个齿盘,齿空的间隔距离是相等的,要求齿盘每移动一格,
光电传感器输出一个脉冲,步进电机移动一个角度0.9度。齿盘转动的速度不固定,
可能快也可能慢。步进电机没有转动之前,齿盘一直是转动的,
只有按下启动按钮步进电机才开始转动。
*/
//作成:吴天
//QQ.269829973
//完成时间2010.05.11
//上海.奉贤
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit START = P1^5
sbit STOP = P1^4
sbit COM = P1^3
//电机接在低4位,接在其他位可修改数组。
uchar code lab[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}
void Mdelay(uchar x)
{uchar j,k
for(j=xj>0j--)
{
for(k=124k>0k--)
{}
}
}
//步进程序,调用一次程序,移动一步,
//参数:方向,1为正转,0为反转。
void motormove(uchar dir)
{
static step=0
P2&=0xf0
if(dir)
{
if(step<=7)
{ P2|=lab[step++]}
else
{step=0P2|=lab[step]}
}
else
{
if(step==0)
{P2|=lab[step]step=7}
if(step>0)
{P2|=lab[step--]}
}
}
void main()
{
bit RUN=0
while(1)
{
if(RUN==0)
{
if(!START) //读启动
{Mdelay(1)
if(!START)
{RUN=1}
}
}
else
{
if(!COM)//读传感器,低电平移动步进电机
{motormove(1)}
if(!STOP) //读停止
{
Mdelay(1)
if(!STOP)
{RUN=0}
}
}
}
}
看下图,就是步进电机的时序及接线图。
2相4拍(按图解释):
第一拍(第一次的脉冲信号):1~3组成的线圈黄线加+电压,兰线加-电压;2~4组成的线圈橙色加+,蓝色加-电压。结果是:电机移动了一个步进角的;
第2,3,4拍类推,结果是:电机向一方向给移动了一个步进角的;如此重复1,2,3,4电机就不停的转。如果反过来执行4,3,2,1,那电机就会反转,第一拍和第二拍(每拍之间的)时间长短就决定了电机的频率从而影响到转速
#include <stdio.h>#include <fcntl.h>#include <string.h>#include <sys/ioctl.h>#define STEPMOTOR_IOCTRL_PHASE 0x13 staticintstep_fd = -1
char *STEP_DEV="/dev/exio/0raw"//定义一个指针指向步进电机的驱动 程序
/********* A, AB, B, BC, C CD, D, DA ***/
char stepdata[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}//各 个相位对应的值
void Delay(int t) //延时函数 { int i
for(t>0t--)
for(i=0i<400i++)}
/***************************************************** ***********/
int main(intargc, char **argv) {
int i = 0
if((step_fd=open(STEP_DEV, O_WRONLY))<0){ printf("Error opening /dev/exio/0raw device\n")return 1} /*
打开设备的驱动程序,由于LINUX把所有的设备都模拟成文件。 step_fd=open(STEP_DEV,0_WRONLY)实际调用的函数为:
staticint s3c2410_exio_open(structinode *inode, struct file *filp) //驱动程序中的设备打开程序 */
for () {
for (i=0i<sizeof(stepdata)/sizeof(stepdata[0])i++) { ioctl(step_fd, STEPMOTOR_IOCTRL_PHASE, stepdata[i])}
/*程序进入一个死循环,这样可以使电机在没有人为停止的状况下,一直的 转动下去。
*第二层for语句循环一次即电机转动一周。函数ioctl()对应函 数*s3c2410_exio_ioctl()
*而这个函数最终将调用函数do_stepmotor_run((char)arg)使步进电 机转动起来。 */
printf("Delay(100)\n")Delay(100)}
close(step_fd)//程序结束时关闭设备 printf("Step motor start running!\n")return 0}本文来自百度文库,你可以搜搜,其中答案更详细的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)