单片机控制的步进电机不转

用的是5v的步进电机,黄色的外芯不转,但是感觉到里面的转子在转动了,可是外面的外芯就是不转。不知道为什么?希望高手可以帮组我。O(∩_∩)O谢谢
附上程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar step_table[]={0x01,0x02,0x04,0x08};
void delay(uint a)
{
while(a--);
}
void main()
{ uchar i;
for(i=0;i<4;i++)
{
P1=step_table[i];
delay(800);
}
}

如果是感觉到里面的转子在转动了,可是外面的外芯就是不转,可能是因为你的延时太短,造成步进电机扭转力小,转不动.可将 delay()延时增大.比如delay(50000).另外你的应该是四项电机,使用a->ab->b->bc->c->cd-d-da比较好,这样不禁分频比增加,步进电机的扭矩也增加了.相应uchar step_table[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-24
步进电机应用广泛,
例如打印机、磁盘驱动器、玩具、汽车雨刷、手机震动、机械夹具、刻录机等各种机械控制场合
一些概念:
拍数N
定子控制绕组每改变一次通电方式,即为一拍
一个磁场通电周期是 A-B-C-D-A
完成一个磁场周期性变化所需脉冲数,
也指电机转过一个齿距角所需脉冲数,用N表示
拍数又等于相数的1倍或2倍,
以四相电机为例,
有4相4拍, A-B-C-D-A...
4相8拍, A-AB-B-BC-C-CD-D-DA-A...

齿距角θz
一个通电循环周期(比如4拍)转子转过一个齿距角
齿距角又等于360除以转子齿数Z, θz=360/Z

步距角θs
步距角,即在没有减速齿轮的情况下,对于一个脉冲信号,转子所转过的机械角度.
也就是说,每一拍转子转过的角度称之为步距角,通常用θs表示
θs=齿距角/拍数
θs=360/(N*Z)
 
步距角的误差不会长期积累,只与输入脉冲信号数相对应,
可以组成结构较为简单而又具有一定精度的开环控制系统,
也可以在要求更高精度时组成闭环系统。

转速X
每分钟电机转了多少转?设脉冲频率f
一个脉冲,转子转过角度为1/(ZN),
X=60*f/(ZN) 拍数与齿数表示法
=(f*θs)/6 步距角表示法
单片机控制舵机代码:

#include "my51.h"

//4相8拍
u8 code tableCCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时针旋转相序表
u8 code tableCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //顺时针旋转相序表

sbit S3=P3^5; //反转 按键
sbit S4=P3^6; //正转 按键
sbit S5=P3^4; //停止 按键

void motorTurn_ccw() //转1圈,逆时针
{
u8 i,j;
for(j=0;j<8;j++) //电机内部的转子旋转一周
{
if(S5==0) //按键没处理抖动
{
break; //如果停止键按下,退出此循环
}
for(i=0;i<8;i++) //旋转45度, 8*5.625°=45°
{
P1=tableCCW[i];
delayms(2); //调节转速
}
}
}

void motorTurn_cw() //转1圈 ,顺时针
{
u8 i,j;
for(j=0;j<8;j++) //8*45°=360°
{
if(S5==0)
{
break; //如果停止键按下,退出此循环
}
for(i=0;i<8;i++) //旋转45度,8*5.625°=45°
{
P1=tableCW[i];
delayms(2); //调节转速
}
}
}

void main()
{
u8 r;
u8 N=64; //减速步进电机,减速比1/64,所以N=64时,步进电机外主轴转一圈
P1=0xff; _nop_();
ledLock= LOCK; //我们的P1口接有8个led灯,先锁定,不要让它们亮 ,节能环保
while(1)
{
if(S3==0) //按键了
{
for(r=0;r<N;r++)
{
motorTurn_ccw(); //电机逆时针转
if(S5==0)
{
break; //俺S5键立马停止
}
}
}
else if(S4==0)
{
for(r=0;r<N;r++)
{
motorTurn_cw(); //电机顺时针转
if(S5==0)
{
break;
}
}
}
else
{
P1=0xf0; //平时也是停止的
}
}
}
第2个回答  2010-07-26
有几种可能
1)延时的时间不够:现在单片机指令在us级的很多,800us的步长,对于很多步进电机来说力矩是不够的
2)步进电机的驱动方式不对:需要搞清楚是几相几拍驱动的,不一定是A-B-C-D的
3)可能只是驱动的步数不够:步进电机动作4步一般用人眼是很难识别出来的,你增加到200步试试看(我用过的步进电机是每动作一步,步进电机仅动作0.9度,人眼很难发觉出来)
第3个回答  2010-07-24
看哈你的,步进电机是,几线,几相的,再找清楚相序,按ABCD 或A A'B B',给脉冲,就转了。如果不知道相序,就一根一根的试喽。
第4个回答  2010-07-26
延时长一点。。。试试。。。for(;;)外面套一层while(1);下面是用中文输入法打的。。。程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar step_table[]={0x01,0x02,0x04,0x08};
void delay(uint a)
{unsigned int i;
i=65536;
while(i--);
while(a--);

}

void main()
{ uchar i;
while(1)
{
for(i=0;i<4;i++)
{
P1=step_table[i];
delay(65536);
}
}
}