步进电机
上下一对(俩个)绕组通电,单四拍模式——单相绕组通电四节拍,逆时针转,转到4对齐c,1对齐右上角
步进电机一共有 5 根引线,其中红色的是公共端,连接到 5V 电源,接下来的橙、黄、粉、蓝就对应了 A、B、C、D 相,对应低四位,蓝色位数最高,红色接5V电源
八拍节拍的 IO 控制代码数组:
unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 };
考虑步进电机启动频率,我们控制节拍刷新时间大于 1.8ms,一般由定时器中断控制节拍为2ms
index = index & 0x07; //用&操作实现到 8 归零 ,按位与
00000111&00000111,再加1,就变成了00000000
减速概念:多个齿轮,多级减速,8 秒多才转一圈
步进电机最大的特点是:精确控制转动量
#include <reg52.h>
unsigned char code BeatCode[8] = { //步进电机节拍对应的 IO 控制代码
0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
};
void delay();
void main()
{
unsigned char tmp; //定义一个临时变量
unsigned char index = 0; //定义节拍输出索引
while (1)
{
tmp = P1; //用 tmp 把 P1 口当前值暂存
tmp = tmp & 0xF0; //用&操作清零低 4 位
tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低 4 位
P1 = tmp; //把低 4 位的节拍代码和高 4 位的原值送回 P1
index++; //节拍输出索引递增
index = index & 0x07; //用&操作实现到 8 归零
delay(); //延时 2ms,即 2ms 执行一拍
} }
/* 软件延时函数,延时约 2ms */
void delay()
{
unsigned int i = 200;
while (i--);
}
下面是步进电机转动任意角度代码
#include <reg52.h>
void TurnMotor(unsigned long angle);
void main() {
TurnMotor(360*25); //360 度*25,即 25 圈
while (1);
}
/* 软件延时函数,延时约 2ms */
void delay()
{
unsigned int i = 200;
while (i--);
}
/* 步进电机转动函数,angle-需转过的角度 */
void TurnMotor(unsigned long angle)
{
unsigned char tmp; //临时变量
unsigned char index = 0; //节拍输出索引
unsigned long beats = 0; //所需节拍总数
unsigned char code BeatCode[8] = { //步进电机节拍对应的 IO 控制代码
0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
};
beats = (angle*4096) / 360; //计算需要的节拍总数,4096 拍对应一圈
while (beats--) //判断 beats 不为 0 时执行循环,然后自减 1
{
tmp = P1; //用 tmp 把 P1 口当前值暂存
tmp = tmp & 0xF0; //用&操作清零低 4 位
tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低 4 位
P1 = tmp; //把低 4 位的节拍代码和高 4 位的原值送回 P1
index++; //节拍输出索引递增
index = index & 0x07; //用&操作实现到 8 归零
delay(); //延时 2ms,即 2ms 执行一拍
}
P1 = P1 | 0x0F; //关闭电机所有的相
}