单片机控制步进电机
之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。
所用硬件:步进电机及驱动器、STC89C52单片机、直流电源
1、硬件连接图
- 注意:上图为共阳极接法,实际连接参考总体线路连接。
- 驱动器信号端定义:
PUL+:脉冲信号输入正。( CP+ )
PUL-:脉冲信号输入负。( CP- )
DIR+:电机正、反转控制正。
DIR-:电机正、反转控制负。
EN+:电机脱机控制正。
EN-:电机脱机控制负。
- 电机绕组连接
A+:连接电机绕组A+相。
A-:连接电机绕组A-相。
B+:连接电机绕组B+相。
B-:连接电机绕组B-相。
- 电源连接
VCC:电源正端“+”
GND:电源负端“-”
注意:DC直流范围:9-32V。不可以超过此范围,否则会无法正常工作甚至损坏驱动器.
- 总体线路连接
输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+,DIR-③脱机信号EN+,EN-。输入信号接口有两种接法,可根据 需要采用共阳极接法或共阴极接法。
在这里我采用的是共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端); 脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接 入(不接也可,代码中未接,置空)。按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。
注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路, 以免损坏驱动器。
2、代码
#include<reg51.h>
#define MotorTabNum 5
unsigned char T0_NUM;
sbit K1 = P3^5; // 启动
sbit K2 = P3^4; // 反转
sbit K3 = P3^3; // 加速
sbit K4 = P3^2; // 减速
sbit K5 = P3^1; //正反转
sbit FX = P2^4; // 方向
//sbit MotorEn = P2^5; // 使能
sbit CLK = P2^6; // 脉冲
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char g_MotorSt = 0; //
unsigned char g_MotorDir = 0; //
unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};
signed char g_MotorNum = 0;
void delayms(xms);
void mDelay(unsigned int DelayTime);
void T0_Init();
void KeyScan(void);
void main(void)
{
T0_Init();
// MotorEn = 0; //
FX = 0;
while(1)
{
KeyScan(); //
}
}
void T0_Init()
{
TMOD = 0x01;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
EA = 1;
ET0 = 1;
// TR0 = 1;
}
void T0_time() interrupt 1
{
// TR0 = 0;
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
if(T0_NUM >= MotorTab[g_MotorNum]) //
{
T0_NUM = 0;
CLK=CLK^0x01; //
}
// TR0 = 1;
}
//-----????---------------------
void KeyScan(void)
{
if(K1 == 0)
{
delayms(10);
if(K1 == 0)
{
g_MotorSt = g_MotorSt ^ 0x01;
// MotorEn ^= 1;
TR0 = 1;
FX ^= 0; //反转
}
}
if(K2 == 0)
{
delayms(10); //正转
if(K2 == 0)
{
g_MotorDir = g_MotorDir ^ 0x01;
FX ^= 1; //加速
}
}
if(K3 == 0) //
{
delayms(5); //加速
if(K3 == 0)
{
g_MotorNum++;
if(g_MotorNum > MotorTabNum)
g_MotorNum = MotorTabNum;
}
}
if(K4 == 0) //
{
delayms(5); // 减速
if(K4 == 0)
{
g_MotorNum--;
if(g_MotorNum < 0)
g_MotorNum = 0;
}
}
if(K5 == 0) //
{
delayms(10); // 正反转
if(K5 == 0)
{
g_MotorSt = g_MotorSt ^ 0x01;
g_MotorDir = g_MotorDir ^ 0x01;
MotorEn ^= 1;
TR0 = 1;
while(1)
{
FX ^= 1; //
delayms(90000);
FX ^= 0; //
delayms(90000);
}
}
}
}
void delayms(xms)//延时
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
3、常见问题解答
- 控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
- 接通电源后如果驱动器灯亮,但是无法控制电机旋转,考虑控制部分驱动能力不足或者驱动器所设置的驱动电流不够(我就遇到过这种情况,后来通过调高驱动器限制电流解决的此问题)。如果调高驱动电流步进电机仍无法转动,查看电路板上的按键有没有接对,程序中按键引脚可根据电路板设计的按键引脚连接自行改动。
- 判断步进电机四条线的定义:将任意两条线接在一起,用手旋转电机,如果有阻力,则两条线是同一相。用相同方法测试另外两条线是否是同一相。确定同相的两条线任意接入两相接口,如果旋转方向相反只需换相即可。
- 如需调试或增加功能可联系QQ:1932900294。
相关阅读
刚入行的产品经理,往往一提到任何功能,任何需求,立马啪啪的打开电脑,看我给你把原型画出来了,牛逼吧?做了一阵子产品经理之后,一提到任何
作者简介:申泽邦(Adam Shan),兰州大学在读硕士研究生,主攻无人驾驶,深度学习;原文链接:http://blog.csdn.net/adamshan/article/details/7
简介无人机能够在空中自动飞行,直升机可以悬停在空中,地铁可以精准的停在地铁站预设的位置,火车可以按照预定的速度行驶,平衡车可以保
1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交
智能手机的发展不断带动智能化家居的推进,现在家里不管是电视空调冰箱都要冠以"智能"之名。对于年轻人来说,学习一些智能设备新的用