c51 单片机 四相五线 步进电机 怎么停止?

#include <reg52.h>
sbit WELA=P2^7;//数码管位选锁存器信号
unsigned char code F_Rotation[4]={0x20,0x10,0x08,0x04}; //正转表格,换算成二进制 0010 0000,0001 0000,0000 1000,0000 0100
unsigned char code B_Rotation[4]={0x04,0x08,0x10,0x20}; //反转表格,换算成二进制 0000 0100,0000 1000,0001 0000,0010 0000
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char i;
unsigned int j;
j=512*2; //512转一圈

////////////////////////////////////////////////////////////////
P0=0XFF;//关掉数码管的位选信号。阻止数码管受到P0口信号的影响。
Delay(500);
WELA=1; //WELA=P2^7,开通位选,写进命令
Delay(500);
WELA=0;
////////////////////////////////////////////////////////////////
while(j--)
{
for(i=0;i<4;i++) //4相
{
P0=B_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(400); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
while(1);
}
最后的while(1)如果没有加的话电机就会一直转,加了的话又会陷入死循环,怎么办?

//根据你的相序表来看,你是按全步运行的,也就是每步走1.8度,4步一循环走7.2度,也就是50个循环转一圈。所以你程序里的512转一圈是不对的,512将转10圈多。
//根据你的程序j减到零就会停止,不存在一直转下去的情况。
//要做到随时停止的话,可以加一个按键切换启停就OK了
main()
{
unsigned char i,flag;
unsigned int j;
j=512*2; //512转一圈

////////////////////////////////////////////////////////////////
P0=0XFF;//关掉数码管的位选信号。阻止数码管受到P0口信号的影响。
Delay(500);
WELA=1; //WELA=P2^7,开通位选,写进命令
Delay(500);
WELA=0;
flag=0;
////////////////////////////////////////////////////////////////
while(1)
{
for(i=0;i<4;i++) //4相
{
P0=B_Rotation[i]; //输出对应的相 可以自行换成反转表格
while(1)
{
if(key==0)
{
while(key==0); //等待键抬起
flag=~flag;
}
if(flag)break;
}
Delay(400); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-26
while(1)的时候,步进电机就失去了控制信号,不可能再转了!
while(j--)得执行完了才能执行while(1),j=1024,应该是旋转1024圈才停止的,楼主要有耐心,等1024圈转完之后看看还转不转;怎么样判断程序执行到哪里了 可以用 仿真器,同时建议下 学习步进电机控制原理。追问

用开发板试过512是转一圈,我要实现的是不加while(1)电机也能在转完规定圈数后停止,因为我要做全自动停车场

第2个回答  2012-07-26
每次循环函数完成后返回主函数中,然后在主函数中调用停止函数追问

停止函数?

c51 单片机 四相五线 步进电机 怎么停止?
\/\/根据你的相序表来看,你是按全步运行的,也就是每步走1.8度,4步一循环走7.2度,也就是50个循环转一圈。所以你程序里的512转一圈是不对的,512将转10圈多。\/\/根据你的程序j减到零就会停止,不存在一直转下去的情况。\/\/要做到随时停止的话,可以加一个按键切换启停就OK了 main(){ unsi...

求大神,问下如何中断步进电机工作?
步进电机运行是一个过程,可在电机的驱动函数里面增加一个停止检测,检测到停止条件时,就开始停止,这个是比较合理的停止过程,不会损坏电机,当然,如果对于急停那种,可以直接在else里面将步进电机的PWM停止,这种情况对于高速运行的电机会有损伤的。

如何控制步进电机?我要做一个智能窗帘,想让电机到头就停止,这用51单片...
还有就是固定脉冲数,比如一圈100个脉冲,5圈窗帘放完 那么写程序的时候就可以写500个脉冲,发完后停止 ,个人觉得还是用传感的方法好些 ,用脉冲数的方法的话最好也加上下限传感,起到保护作用,以免窗帘到位后硬拉导致损坏 ,因为步进马达会丢步的,长时间不用零位校正的话偏差会存在的 希望能够...

四相步进电机单片机控制程序
一、S1为单片机复位开关,按下此开关并释放,单片机从ORG 0000H这一句开始执行命令 二、至于步进电机第一步转多少角度,这个应该跟步进电机停止前的状态有关,在编程的时候可以先让步进电机复位一次,下次启动之前先查询下步进电机的位置变量就可以了。在实际应用中可以忽略不计,因为步进电机通常要接减速器...

单片机控制步进电机要求:有加速、减速、停止、正转、反转按钮,电机是四...
我用的是控制一个步进电机的,这个是我以前写的,你的要求在下面的程序做修改就行了;程序如下:include <reg52.h> define uchar unsigned char define uint unsigned int \/\/uchar table[]={0x18,0x30,0x60,0x48,0x48,0x60,0x30,0x18}; \/\/二相励磁 uchar table[]={0x08,0x10,0x20,0x...

四相五线的步进电机与51单片机接线怎么接
公共线接电源正负均可,其它线由三极管或场效应管驱动,三极管的基极或场效应管的栅极接单片机控制,由单片机控制时序即可驱动。用H桥可能不行,桥驱是2,3,5相的驱动。

如何用单片机实现对四个步进电机的速度控制呢
表控可以同时控制4个步进电机,对于你说的速度控制讲解如下:上图是表控的表格设置界面,省去了麻烦的编程,轻松实现步进电机控制。图中,第2行工作模式设置为“脉冲”模式,光标在脉冲模式的第2行时,脉冲频率项及脉冲个数输入项分别显示脉冲个数的单位,数据输入框显示为绿色。脉冲输出单位为:百万、...

如何不使用单片机让四相五线制步进电机转起来
四相五线步进电机,在控制方法和接线方面采用单极性控制方式,可以用2003来驱动,单片机提供环形分配器的作用。

步进电机用单片机控制转动
这个要小到几分之一或几十分之一秒),然后再对CP端口取反;这样,单片机上电后,就会不断地延时,输出脉冲波了。【DIR方向信号】:可以在上述的CP脉冲信号的有限FOR循环结束后,停几秒,再对DIR端口取反; 这样,你的步进电机通电后就会在几秒钟内正转,停转几秒钟后再反转了,如此往复不断。

单片机怎么控制步进电机
由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数;一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。

相似回答