基于51单片机的TB6600步进电机驱动程序

一、系统概述

基于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 核心原理

  1. 脉冲生成 :通过定时器0中断 实现,设置定时初值控制脉冲频率(频率f=12×T定时f=\frac{1}{2×T定时}f=2×T定时1,T定时为中断周期);

  2. 方向控制:P1.1输出高/低电平,控制电机正转/反转;

  3. 使能控制:P1.2输出低电平使能驱动器,高电平关闭输出(电机自由转动);

  4. 步数计数:每发送一个脉冲,步数计数器±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

四、测试与验证

  1. 硬件连接:按2.2节连接51单片机、TB6600、电机,确保24V电源与5V电源共地。

  2. 功能测试

    • 上电后电机使能,执行主函数测试逻辑,观察正转1000步、反转500步是否正常;

    • 用示波器测量PUL引脚,验证脉冲频率是否为设定值(如2kHz时周期0.5ms)。

  3. 细分测试:通过TB6600拨码开关设置16细分,电机转1圈需3200步(200步/圈×16),测试步数准确性。

五、总结

基于51单片机实现了TB6600驱动步进电机的基础控制,核心是定时器中断生成脉冲与IO口控制方向/使能。通过模块化函数(初始化、方向、使能、运行),可快速集成到多轴控制系统中。

相关推荐
清风6666662 小时前
基于单片机的正弦波与方波峰峰值与频率测量系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
搁浅小泽2 小时前
变频空调检修完整流程(通用版)
单片机·嵌入式硬件·可靠性工程师
笨笨饿11 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
清风66666613 小时前
基于单片机的智能药物盒设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
李永奉13 小时前
杰理芯片SDK-详细讲解AC695N/AC696N芯片SDK中APP模式流程
单片机·嵌入式硬件·物联网·语音识别
笨笨饿13 小时前
30_泰勒级数
c语言·stm32·嵌入式硬件·线性代数·机器学习·自动化·概率论
季鹏EthanJ14 小时前
VCC上电慢导致STM32无法复位
stm32·单片机·嵌入式硬件·上电复位故障·bor
点灯小铭15 小时前
基于单片机的太阳能12V蓄电池光控时控路灯智能控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
LCG元15 小时前
STM32实战:基于STM32F103的智能体重秤(HX711+OLED)
stm32·单片机·嵌入式硬件