注意:步进电机内有一个转子(在电机的内部,看不到),外部还有一个旋转的转子(就是直接能看见的),它俩旋转的角度不是一样的,见内部结构图。内部的转子旋转64周,外部的才旋转1周。这个问题搞了我好久,最终在参考1才知道。
旋转角度的计算公式在参考3中。
感谢以下分享:
2、STM32F103控制28BYJ-48步进电机正转或者反转一定的角度
内部结构
代码
/*******************************************************************************
* 实验名 : 步进电机旋转某个设定角度
* 开发板 : 普中A2开发板,单片机stc89c52
* 使用的IO : 电机用P0口低四位
*******************************************************************************/
#include "reg52.h"
#define STEEP_MOTOR P0 //电机IO
unsigned char code Forward[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序
unsigned char code Backward[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序
void Motor();
void Delay_Ms(unsigned int ms);
void Step_Motor_Forward();
void Step_Motor_Backward();
void Motor_Direction_Angle(int direction, int angle);
void Motor_Stop(void);
void main(void)
{
while(1)
{
Motor_Direction_Angle(1, 90); //正转90度
Delay_Ms(500);
Motor_Direction_Angle(0, 90); //反转90度
Delay_Ms(500);
}
}
void Step_Motor_Forward() //正转
{
unsigned char j;
for ( j = 0; j < 8; j++ ) //磁场循环8脉冲(8拍),步进电机内部转子可以旋转5.625°;也就是说,64个脉冲,就可以旋转1圈。
{
STEEP_MOTOR = Forward[j];
Delay_Ms(1);
}
}
void Step_Motor_Backward() //反转
{
unsigned char j;
for ( j = 0; j < 8; j++ )
{
STEEP_MOTOR = Backward[j];
Delay_Ms(1);
}
}
void Delay_Ms( unsigned int ms )
{
unsigned int k;
while(ms--)
{
for(k=0; k<80; k++)
{ }
}
}
//控制电机正转反转某个角度angle
//direction:1为正转,0为反转
//angle角度,可为0-360具有实际意义
void Motor_Direction_Angle(int direction, int angle)
{
unsigned int j;
if(direction == 1)
{
for(j=0;j<64.0*angle/45.0;j++) //步进电机【输出端】要旋转angle度,所需的脉冲数:angle/(5.625/64*8)
{
Step_Motor_Forward();//正转
}
STEEP_MOTOR = 0xff;//停止
}
else if(direction == 0)
{
for(j=0;j<64.0*angle/45.0;j++)
{
Step_Motor_Backward();//反转
}
STEEP_MOTOR = 0xff;//停止
}
}
疑惑:不知道为什么,外面看得到的转子的起始位置会发生变化,如图:
次序 | 第一次旋转 | 第二次转转 | |
路径 | 1——>2 | ——> | 3——>4 |
如果有其他不足,希望大家指出。