这里我们以TB6600步进电机驱动器为例,进行介绍。其他型号的驱动器也大同小异。如图是我们使用的步进电机驱动器
一输入输出端说明
1信号输入端
PUL+:脉冲信号输入正。
PUL-:脉冲信号输入负。
DIR+:电机正、反转控制正。
DIR-:电机正、反转控制负。
EN+:电机脱机控制正。
EN-:电机脱机控制负。
2电机线连接段
A+:连接电机绕组A+相。
A-:连接电机绕组A-相。
B+:连接电机绕组B+相。
B-:连接电机绕组B-相。
3电源电压连接
VCC:电源正端“+”
GND:电源负端“-” (需要注意的是电机驱动器上DC电源还是AC,DC只能接入直流电源,而AC的话既交流又可以直流电源)
4输入端接线说明
输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+ ,DIR-③脱机信号EN+,EN-。
输入信号接口有两种接法,用户可根据 需要采用共阳极接法或共阴极接法。
共阳极接法:分别将PUL+,DIR+,EN+连接到控制系统的电源上, 如果此电源是+5V 则可直接接入,
如果此电源大于+5V,则须外部另加限流 电阻R,保证给驱动器内部光藕提供8—15mA 的驱动电流。
脉冲输入信号通 过CP-接入,方向信号通过DIR-接入,使能信号通过EN-接入。如下图:
共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端; 脉冲输入信号通过PUL+接入,方向信号通过DIR+接入,
使能信号通过EN+接 入。若需限流电阻,限流电阻R 的接法取值与共阳极接法相同。如下图:
这里需要注意的是:在一般情况下EN端可不接,EN有效时电机转子处于自由状态(脱机状态),这时 可以手
动转动电机转轴,做适合您的调节。手动调节完成后,再将 EN 设为 无效状态,以继续自动控制 。
二、系统接线方法
驱动器与控制器、电机、电源的接线,以共阳接法为例,如下图所示:
三、拨码开关的设定细分以及电流
1细分数设定
细分数是以驱动板上的拨码开关选择设定的,用户可根据驱动器外盒上 的细分选择表的数据设定(最好在断电情况下设定)。细分后步进
电机步距 角按下列方法计算:步距角=电机固有步距角/细分数。如:一台固有步距角 为18°的步进电机在4细分下步距角为18°/4=045°
驱动板上拨码开关1、2、3、分别对应S1、S2、S3 (这里需要注意的是并不是设置细分数越大越好,400细分的意思就是:400个脉冲电机转动1圈)
2电流大小设定
驱动板上拨码开关4、5、6分别对应S4、S5、S6
(这里需要注意的是并不是设置电流越大越好,根据电机的功率取合适值即可)
四、脱机信号(EN)
打开脱机功能后,电机转子处于自由不锁定状态,可以轻松转动,此时 输入脉冲信号不响应,
关闭此信号后电机接受脉冲信号正常运转。
注:一般在实际应用中可不接。
五、常见的问题解答
1、问:初次使用该步进驱动器,如何能尽快上手?
答:正确接好电源和电机后,只接脉冲信号PUL(先将频率设置为1K以内),细分设置为16,方向和脱机悬空,
此时加电后电机默认正转。运行无误后再 依次测试加速(提高频率)、方向、细分和脱机等功能。
2、问:控制信号高于5V,一定要加串联电阻吗?
答:是的,否则有可能烧毁驱动器控制接口的电路。
3、问:接线后电源指示灯亮,但电机不转,是什么原因?
答:如果接线正确,但仍然不转,说明控制部分驱动能力不够,这种情况多出现在
用单片机的io口直接控制方式。请确保控制接口有5mA的驱动能力
4、问:如何判断步进电机四条线的定义?
答:将电机的任意两条线接在一起,此时用手拧电机转子有阻力,则这两条线是同一相,
可接在驱动器A+、A-;另外两条线短接仍然有阻力,则将 这两条线接在B+和B-
5、问:电机的正反转情况与应实际达到的相反?
答:只需要把电机其中一相的两根线互换接入即可
六、自己本人在实践中遇到的问题以及解决
只是根据实验尝试而得,并不一定正确
1电机旋转电流吱吱声音过大 PWM频率过低 改变方法提高频率或者减少细分数
2驱动器自动断电时 设置电流过大,应该降低设置电流
3电流设置会影响转速
4电机过烫,设置的电流过大,应该降低设置电流
5ENA-和ENA+不接,这是脱机信号控制
6PWM输出都采用开漏输出,需要外接上拉5V,不然没有PWM输出
7当选择电机转速较慢时,应该选择更多的细分数
假设您使用无线串口控制小车,那么你需要设计一个串口指令协议,一般来说,通信协议的数据帧包括3部分,一是指令头,又叫做帧同步字;二是指令内容,也叫帧内容;三是校验码。
同步字是为了便于程序分析连续传输的数据中,帧与帧之间的间隔,帧内容包含了所有经过16进制编码的各种控制指令和数据,校验码通常采用累加和与异或算法,为了计算本数据帧是否正确。(工业环境中,所有数据传输系统都存在一定的误码干扰,校验字能有效判别数据传输是否正确,进而通过错误处理机制,有效避免错误动作)。
刚好前段时间写了个小车的控制程序,使用的是双路H桥来驱动电机的,不过不是控制履带式的,稍微改动了下。
(注意,本程序仅适用于履带式小车,即左右电机正反转实现前后及转向,程序支持前后左右混控)
//
// 遥控帧协议和结构
// FB|80|51|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR
// 00|01|02|03|04|05|06|07|08|09|10|11|12|13
// 14 byte
//FB 80 51 遥控帧同步字 00-02
//AA 前后控制量 128为中立位 03
//FF 恒定为0xFF 04
//BB 左右控制量 128为中立位 05
//FF 恒定为0xFF 06
//BY 备用控制指令 本程序为空 07-12
//CR 校验码,从00至12字节逐字节位异或 13
//
// 遥测帧协议结构
// FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR
// 00|01|02|03|04|05|06|07|08|09|10|11|12|13
// 14 byte
// 重复遥控指令,除帧头外,其定义与遥控指令相同
#define BR 9600 //定义串口波特率
//遥控指令接收处理相关定义
#define TCDL 14 //定义遥控数据帧长度字节数
#define BUFF_LONG 30 //定义串口接收缓存的长度
byte BUFF[BUFF_LONG]; //定义串口数据接收存储缓存
int BUFF_IDX = 0; //定义串口数据接收存储缓存的指针
//遥测指令发送处理相关定义
#define TMFQ 80 //定义遥测数据帧发送间隔为80ms
#define TMDL 14 //定义遥测数据帧长度字节数
byte TM_Data[TMDL]; //定义遥测数据缓存
int TM_Index = 0; //定义遥测数据指针
unsigned long Time = 0; //定义遥测发送计时器为0
//定义左、右电机与Arduino的驱动信号接口
//注意,这里用了4个PWM输出,部分Arduino板可能不支持,请查看手册
int Moto_Right_A = 3;
int Moto_Right_B = 5;
int Moto_Left_A = 6;
int Moto_Left_B = 9;
//数据接收指示灯相关定义
boolean IS_Blink = false; //定义是否闪烁LED灯的变量
int LED = 13; //定义LED灯接口为13
//指令变量定义
byte RunPWM = 128; //定义前进、后退控制PWM指令变量
byte TurnPWM = 128; //定义左转、右转控制PWM指令变量
void setup()
{
pinMode(Moto_Right_A, OUTPUT); //定义输出
pinMode(Moto_Right_B, OUTPUT); //定义输出
pinMode(Moto_Left_A, OUTPUT); //定义输出
pinMode(Moto_Left_B, OUTPUT); //定义输出
pinMode(LED, OUTPUT); //定义LED管脚为数字输出
Port_Init(); //初始化串口
Blink_LED(false); //关闭指示灯
}
void loop()
{
byte c;
if (Serialavailable() > 0) //如果接收到串口数据
{
c = Serialread(); //读一个字节
Buff_AddChar(c); //塞进缓存进行存储、校验和解码
}
TM_Freq(); //尝试按要求逐字节发送遥测数据
Driver_CAR(RunPWM, TurnPWM); //驱动左右电机正反转,实现运动控制
}
//驱动左右电机调速运行,实现左右正反转组合,实现控制
//前后、左右混控
void Driver_CAR(byte Run, byte Turn)
{
byte Run_L, Run_R; //定义左右前进混合值
byte PWM_R_A, PWM_R_B, PWM_L_A, PWM_L_B; // 定义4个信号的独立PWM
Run_L = Run - (128 - Turn); //将转向PWM混合到左路
Run_R = Run - (Turn - 128); //将转向PWM混合到右路
PWM_L_A = (255 / 128) Run_L - 255; //左路混合值结算为左路A信号PWM
PWM_L_B = (-1 255 / 128) Run_L + 255; //左路混合值结算为左路B信号PWM
PWM_R_A = (255 / 128) Run_R - 255; //右路混合值结算为右路A信号PWM
PWM_R_B = (-1 255 / 128) Run_R + 255; //右路混合值结算为右路B信号PWM
analogWrite(Moto_Right_A, PWM_R_A); //输出右路A信号
analogWrite(Moto_Right_B, PWM_R_B); //输出右路B信号
analogWrite(Moto_Left_A, PWM_L_A); //输出左路A信号
analogWrite(Moto_Left_B, PWM_L_B); //输出左路B信号
}
//
//子程序 Port_Init()
//功能:初始化串口通信
void Port_Init()
{
BUFF_IDX = 0; //初始化串口缓存指针为0
TM_Data[0] = 0xFB; //初始化遥测数据帧头
TM_Data[1] = 0x80; //初始化遥测数据帧头
TM_Data[2] = 0x61; //初始化遥测数据帧头
Serialbegin(BR); //定义波特率并启动串口
}
//
// 子程序 Buff_AddChar(byte b)
// 功能:串口接收字节加入缓存
// 1、加入字节到缓存;
// 2、检测到帧头则尝试检测遥控帧;
// 3、管理缓存指针
void Buff_AddChar(byte b)
{
BUFF[BUFF_IDX] = b; // 缓存[缓存指针] = 接收字节
if (BUFF_IDX >= 2)
{
if (BUFF[BUFF_IDX] == 0x51 && BUFF[BUFF_IDX - 1] == 0x80 && BUFF[BUFF_IDX - 2] == 0xFB) // 检测遥控帧头
{
if (BUFF_IDX == (TCDL - 1))
{
Buff_DCHK(); // 检测校验码
}
BUFF_IDX = 0; // 缓存指针归零
return;
}
}
BUFF_IDX++;
if (BUFF_IDX > (BUFF_LONG - 1)) // 缓存指针越界
{
BUFF_IDX = 0; // 缓存指针归零
}
}
//
//子程序 Buff_DCHK()
//功能:校验遥控帧校验字是否正确
void Buff_DCHK()
{
byte DCHK = 0x00;
// 0xFB XOR 0x80 XOR 0x51
DCHK = BUFF[0];
DCHK = DCHK ^ BUFF[1];
DCHK = DCHK ^ BUFF[2];
int i;
for (i = 0; i < (TCDL - 4); i++)
{
DCHK = DCHK ^ BUFF[i];
}
if (DCHK == BUFF[TCDL - 4])
{
//校验字正确
Blink_LED(true); //闪烁LED
Get_CMD(); //解码指令
}
}
//
// 子程序 Get_CMD()
// 功能:解码遥控指令
void Get_CMD()
{
RunPWM = BUFF[0];
TurnPWM = BUFF[2];
//后面可以自己添加关于BY指令的解码处理
}
//
//子程序 TM_Freq()
//功能:遥测数据发送帧率控制
void TM_Freq()
{
unsigned long t;
if (TM_Index < TMDL) //如果一帧数据还没有发完
{
Serialwrite(TM_Data[TM_Index]); //继续发数据
TM_Index++; //指针累加
}
else //如果发完
{
if (Time == 0) //检测计时器是否为0
{
Time = millis(); //是则赋予计时器初始值
}
else //不是
{
t = millis();
if (t - Time >= TMFQ) //检测计时器是否到达帧率控制的时间
{
Time = t;
TM_Make_Data(); //到达发送时间,则组一帧遥测数据,并开始发送
}
}
}
}
//
// 子程序 TM_Make_Data()
// 功能:发送遥测数据
void TM_Make_Data()
{
// 遥测帧协议结构
//FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR
//00|01|02|03|04|05|06|07|08|09|10|11|12|13
byte CHK = 0xFB; //赋值帧头
CHK = CHK ^ 0x80; //赋值帧头
CHK = CHK ^ 0x61; //赋值帧头
TM_Data[3] = RunPWM; //回写前后指令
TM_Data[4] = 0xFF;
CHK = CHK ^ TM_Data[3]; //计算校验码
CHK = CHK ^ TM_Data[4]; //计算校验码
TM_Data[5] = TurnPWM; //回写转向指令
TM_Data[6] = 0xFF;
CHK = CHK ^ TM_Data[5]; //计算校验码
CHK = CHK ^ TM_Data[6]; //计算校验码
CHK = CHK ^ TM_Data[7]; //计算校验码
CHK = CHK ^ TM_Data[8]; //计算校验码
CHK = CHK ^ TM_Data[9]; //计算校验码
CHK = CHK ^ TM_Data[10]; //计算校验码
CHK = CHK ^ TM_Data[11]; //计算校验码
CHK = CHK ^ TM_Data[12]; //计算校验码
TM_Data[13] = CHK; //计算校验码
TM_Index = 0; //清除遥测发送指针位置
}
//
//子程序 Blink_LED()
//功能:闪烁内置LED灯
void Blink_LED(boolean Blink)
{
if (Blink == false)
{
IS_Blink = false;
}
else
{
IS_Blink = !IS_Blink;
}
digitalWrite(LED, IS_Blink);
}
以上就是关于步进电机,arduino新手,程序怎样设定总步数,这样的配件如何正反转停止,求程序,用按钮控制全部的内容,包括:步进电机,arduino新手,程序怎样设定总步数,这样的配件如何正反转停止,求程序,用按钮控制、哪位大神能帮我写一个arduino 控制两个直流电机正反转,加减速和拐弯的程序啊arduino程序,非常感谢。、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)