一、系统概述
基于STC89C52RC单片机(11.0592MHz晶振),通过TB6600步进电机驱动器控制42/57步进电机,实现位置控制(指定步数)与速度控制(脉冲频率可调)。核心功能包括:
-
脉冲生成:通过定时器中断产生精确脉冲(频率1Hz~10kHz,误差<1%);
-
方向控制:IO口输出高低电平控制电机正反转;
-
使能控制:低电平使能驱动器,高电平关闭输出;
-
细分支持:兼容TB6600的2/4/8/16细分设置(通过拨码开关硬件配置)。
应用场景:3D打印机、CNC雕刻机、小型机械臂等需要精准步进控制的设备。
二、硬件设计
2.1 核心组件选型
| 模块 | 型号/参数 | 功能说明 |
|---|---|---|
| 主控 | STC89C52RC(8位,11.0592MHz) | 脉冲生成、方向/使能控制、步数计数 |
| 驱动模块 | TB6600(支持3A/40V,细分2/4/8/16) | 放大单片机脉冲信号,驱动电机绕组 |
| 步进电机 | 42BYGH40(1.8°/步,4相,额定电流1.5A) | 执行机构(4相8拍或2相4拍,依细分而定) |
| 电源 | 24V/3A DC(电机供电)+ 5V/1A(MCU供电) | 分离供电避免干扰(TB6600需独立24V电源) |
2.2 硬件连接
| 模块 | 51单片机引脚(STC89C52RC) | TB6600引脚 | 说明 |
|---|---|---|---|
| 脉冲PUL | P1.0(定时器0输出) | PUL+ | 脉冲信号(上升沿有效) |
| 方向DIR | P1.1 | DIR+ | 方向信号(高=正转,低=反转) |
| 使能EN | P1.2 | ENA+ | 使能信号(低=使能,高=关闭) |
| 电源 | 5V/GND | VCC/GND | 单片机与TB6600逻辑供电 |
| 电机电源 | 24V/3A电源 | VCC/GND | 驱动模块与电机供电 |
三、软件设计(Keil C51)
3.1 开发环境
-
IDE:Keil μVision5(C51编译器)
-
晶振:11.0592MHz(确保定时器初值计算精确)
-
控制逻辑:定时器0中断生成脉冲,主函数处理步数/方向/使能
3.2 核心原理
-
脉冲生成 :通过定时器0中断 实现,设置定时初值控制脉冲频率(频率f=12×T定时f=\frac{1}{2×T定时}f=2×T定时1,T定时为中断周期);
-
方向控制:P1.1输出高/低电平,控制电机正转/反转;
-
使能控制:P1.2输出低电平使能驱动器,高电平关闭输出(电机自由转动);
-
步数计数:每发送一个脉冲,步数计数器±1,达到目标步数后停止。
3.3 核心代码实现
3.3.1 头文件与引脚定义
c
#include <reg52.h>
#include <intrins.h>
// ==================== 引脚定义 ====================
sbit PUL = P1^0; // 脉冲输出(接TB6600 PUL+)
sbit DIR = P1^1; // 方向控制(接TB6600 DIR+)
sbit EN = P1^2; // 使能控制(接TB6600 ENA+,低有效)
// ==================== 全局变量 ====================
unsigned int pulse_count = 0; // 已发送脉冲数
unsigned int target_steps = 0; // 目标步数(正=正转,负=反转)
unsigned int pulse_freq = 1000; // 脉冲频率(Hz,默认1kHz)
unsigned char motor_dir = 1; // 方向:1=正转,0=反转
bit motor_enable = 1; // 使能:1=使能,0=关闭
3.3.2 延时函数(微秒/毫秒级,11.0592MHz)
c
// 微秒延时(误差±1us,1机器周期≈1.085us)
void DelayUs(unsigned int us) {
while (us--) {
_nop_(); _nop_(); _nop_(); _nop_(); // 4个_nop_≈3.6us
}
}
// 毫秒延时
void DelayMs(unsigned int ms) {
unsigned int i, j;
for (i=0; i<ms; i++)
for (j=0; j<110; j++); // 110次循环≈1ms
}
3.3.3 定时器0初始化(脉冲生成核心)
功能:配置定时器0为模式1(16位定时),根据脉冲频率计算初值,启动中断。
c
// 定时器0初始化(生成脉冲频率=freq Hz)
void Timer0_Init(unsigned int freq) {
TMOD |= 0x01; // 模式1(16位定时)
TH0 = (65536 - (11059200/12)/freq/2) / 256; // 初值高8位(半周期)
TL0 = (65536 - (11059200/12)/freq/2) % 256; // 初值低8位
ET0 = 1; // 允许定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
}
3.3.4 定时器0中断服务函数(脉冲翻转)
功能:每中断一次翻转PUL引脚,生成一个脉冲的上升沿/下降沿。
c
// 定时器0中断(脉冲生成)
void Timer0_ISR() interrupt 1 {
TH0 = (65536 - (11059200/12)/pulse_freq/2) / 256; // 重装初值
TL0 = (65536 - (11059200/12)/pulse_freq/2) % 256;
PUL = ~PUL; // 翻转脉冲引脚(生成方波)
if (motor_enable) { // 使能有效时计数
pulse_count++;
// 达到目标步数,停止发送脉冲
if ((motor_dir && pulse_count >= target_steps) ||
(!motor_dir && pulse_count >= -target_steps)) {
TR0 = 0; // 停止定时器0
pulse_count = 0;
}
}
}
3.3.5 电机控制函数
c
// 设置电机方向(1=正转,0=反转)
void Set_Motor_Dir(unsigned char dir) {
motor_dir = dir;
DIR = dir; // 输出方向信号
}
// 设置电机使能(1=使能,0=关闭)
void Set_Motor_Enable(bit enable) {
motor_enable = enable;
EN = !enable; // TB6600使能低有效
}
// 控制电机转动(步数+速度)
void Motor_Run(int steps, unsigned int speed) {
target_steps = (steps < 0) ? -steps : steps; // 步数绝对值
Set_Motor_Dir(steps > 0); // 正转/反转
pulse_freq = speed; // 设置速度(Hz)
pulse_count = 0; // 清零计数
Timer0_Init(pulse_freq); // 启动定时器0
}
3.3.6 主函数(测试逻辑)
c
void main() {
Set_Motor_Enable(1); // 使能电机
while (1) {
// 测试1:正转1000步,速度2kHz
Motor_Run(1000, 2000);
DelayMs(1000); // 暂停1秒
// 测试2:反转500步,速度1.5kHz
Motor_Run(-500, 1500);
DelayMs(1000);
// 测试3:停止(关闭使能)
Set_Motor_Enable(0);
DelayMs(1000);
Set_Motor_Enable(1);
}
}
参考代码 基于51控制TB6600驱动步进电机程序 www.youwenfan.com/contentcst/181943.html
四、测试与验证
-
硬件连接:按2.2节连接51单片机、TB6600、电机,确保24V电源与5V电源共地。
-
功能测试:
-
上电后电机使能,执行主函数测试逻辑,观察正转1000步、反转500步是否正常;
-
用示波器测量PUL引脚,验证脉冲频率是否为设定值(如2kHz时周期0.5ms)。
-
-
细分测试:通过TB6600拨码开关设置16细分,电机转1圈需3200步(200步/圈×16),测试步数准确性。
五、总结
基于51单片机实现了TB6600驱动步进电机的基础控制,核心是定时器中断生成脉冲与IO口控制方向/使能。通过模块化函数(初始化、方向、使能、运行),可快速集成到多轴控制系统中。