ESP32+micropython+TB6600控制器+42步进电机

TB6600控制器的拨码开关设置

SW1- OFF

SW2-ON

SW3-OFF

SW4-ON

SW5-ON

SW6-OFF

步进电机需要考虑带负载加速过程。以下程序是空载时正常运行的代码,反复调整 脉冲宽度。继续探索,仅供参考,非专业

复制代码
import machine
import time
# TB6600 两相混合式步进电机驱动器说明书
#要点: 脉冲宽度不小于1.2us
#      方向信号先于脉冲信号不少于5us


# 方向控制
STEP_MOTOR_DIR = machine.Pin(2, machine.Pin.OUT)
# 脉冲信号,即PWM波,频率和脉冲数可设置
STEP_MOTOR_PUL = machine.Pin(1, machine.Pin.OUT)

# 步进电机 转动一个步进角
def ONE_STEP_FUN():
    STEP_MOTOR_PUL.value(1)
    time.sleep_us(100)
    STEP_MOTOR_PUL.value(0)
    time.sleep_us(100)    
    return

# 步进电机 变更方向
def DIR_STEP_FUN( unclockwise=1):
    time.sleep_us(10) #方向信号先于脉冲信号不少于5us
    STEP_MOTOR_DIR.value(unclockwise)
    time.sleep_us(10) #方向信号先于脉冲信号不少于5us  
    return
    
time.sleep(1)
while True:
    print("unclockwise=1")
    DIR_STEP_FUN(1)
    for i in range(4000):
        ONE_STEP_FUN()
    time.sleep(1)
    print("unclockwise=0")
    DIR_STEP_FUN(0)
    for i in range(4000):
        ONE_STEP_FUN()
    time.sleep(1)
复制代码

 进一步增加程序功能,考虑加速-匀速-减速过程,按照脉冲控制距离

复制代码
import machine
import time
# TB6600 两相混合式步进电机驱动器说明书
#要点: 脉冲宽度不小于1.2us
#      方向信号先于脉冲信号不少于5us


# 方向控制
STEP_MOTOR_DIR = machine.Pin(2, machine.Pin.OUT)
# 脉冲信号,即PWM波,频率和脉冲数可设置
STEP_MOTOR_PUL = machine.Pin(1, machine.Pin.OUT)

# 步进电机 转动一个步进角
def ONE_STEP_FUN(half_period_us):
    STEP_MOTOR_PUL.value(1)
    time.sleep_us(half_period_us)
    STEP_MOTOR_PUL.value(0)
    time.sleep_us(half_period_us)    
    return

# 步进电机 变更方向
def DIR_STEP_FUN( unclockwise=1):
    time.sleep_us(10) #方向信号先于脉冲信号不少于5us
    STEP_MOTOR_DIR.value(unclockwise)
    time.sleep_us(10) #方向信号先于脉冲信号不少于5us
    return


# 按照加速-匀速-减速过程控制步进电机,参数:步数、脉冲控制
def STEP_ROTATE_FUN(freq,steps):
    half_period_us_target = 1000000/freq # 1000 000 us/1000Hz
    steps_now = 0
    half_period_us = 200 # us
    speed_up_steps =0 # 记录加速的步数
    for i in range(steps):
        ONE_STEP_FUN(half_period_us)
        
        if(half_period_us > half_period_us_target) and(i*2<=steps) and(half_period_us !=10):
            half_period_us = half_period_us-10 # 加速过程
            speed_up_steps =speed_up_steps+1   # 记录加速的步数
            if half_period_us< 10:
                half_period_us =10
        
        if(steps-i<= speed_up_steps)and(i*2>steps) :
             half_period_us = half_period_us+10 # 减速过程
            
    return


time.sleep(1)
while True:
    print("unclockwise=1")
    DIR_STEP_FUN(1)
#     for i in range(4000):
#         ONE_STEP_FUN()
    STEP_ROTATE_FUN(8000,8000)
    time.sleep(1)
    print("unclockwise=0")
    DIR_STEP_FUN(0)
#     for i in range(4000):
#         ONE_STEP_FUN()
    STEP_ROTATE_FUN(8000,8000)
    time.sleep(1)
复制代码

 

arduino 代码-2025年3月增补

复制代码
// 定义电机的步数(800 个脉冲为一圈)
const int stepsPerRevolution = 800;  // TB6600 设置800,就是800脉冲一圈360度
// TB6600 设置电流,根据电机铭牌设置
 
// 定义控制引脚
const int pulPin = 1;  // 共阴极接法
const int dirPin = 2;  // 共阴极接法  
 
int stepsFor180Degree = (180 * stepsPerRevolution) / 360;  // 计算转动 180 度所需的步数
bool isRotating = true;  // 标志位,用于控制是否继续转动
 
void setup() {
  // 将引脚设置为输出模式
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
 
  // 设置转动方向
  digitalWrite(dirPin, HIGH); 
}
 
void loop() {
  if (isRotating) {
    digitalWrite(pulPin, HIGH);
    delayMicroseconds(100);   // 100us
    digitalWrite(pulPin, LOW);
    delayMicroseconds(100);   // 100us
 
    if (--stepsFor180Degree == 0) {
      isRotating = false;  // 达到 180 度后停止转动
    }
  }
}
复制代码

 

posted @ 2024-12-31 06:44  辛河  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示