步进电机控制(arduino+TB6600驱动器)

一种利用限位开关实现步进电机的转动和停转的方法

这种方法还是存在一些误差,只是将程序中的循环的步进数目修改成0,即可实现步进电机的上电停转。

//本次实验电机驱动采用共阴极接线方式
//将步进电机的参数写到一个子函数中,并加入限位开关,触动限位开关可实现步进电机停转
//20180519 by xcx
const int ENAPin = 5; //define Enable Pin
const int DIRPin = 6; //define Direction pin
const int PULPin = 7; //define Pulse pin
const int BUTTON = 8; //define Button pin

void setup()
{
  pinMode (ENAPin, OUTPUT);
  pinMode (PULPin, OUTPUT);
  pinMode (DIRPin, OUTPUT);
  pinMode (BUTTON, INPUT);
}

void loop()
{
  if (digitalRead(BUTTON))//如果检测按钮为高电平,步进电机则转,否则不转
  {
    StepperMotor(false, true, 3200);//此时3200由于在这个循环中,只要不修改成0,则修改他的值没什么影响,转速不会改变
  }
  else
  StepperMotor(false, true, 0);//电机停转
}

//步进电机子函数
//函数:StepperMotor    功能:控制步进电机是否脱机、方向、步数
//参数:ENA---脱机状态,true为脱机
//      DIR---方向控制
//      steps---步进的步数,若steps为0,则电机上电电磁锁死,不转
//无返回值
void StepperMotor(boolean ENA, boolean DIR, int steps)
{
  digitalWrite(ENAPin, ENA);
  digitalWrite(DIRPin, DIR);
  for (int i = 0; i < steps; i++) //Forward XXXX steps
  {
    digitalWrite(PULPin, HIGH);
    delayMicroseconds(50);
    digitalWrite(PULPin, LOW);
    delayMicroseconds(50);
  }
}
程序还是没能做到,一触动限位开关电机就停转,而是要把转动循环里面的步数跑完才停转,可以把循环中的步进数目调小一点,也能实现大概的功能。各位大神若有更好更精准的方式,请不吝赐教!
  • 4
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
首先,需要连接好旋转编码器和步进电机驱动器,然后使用Arduino连接电脑,并安装好步进电机控制库和TB6600驱动器库。 接下来,编写代码,首先初始化旋转编码器和步进电机控制器: ``` #include <Stepper.h> #include <TB6600.h> const int stepsPerRevolution = 200; // 步进电机一圈的步数 const int encoderPin1 = 2; // 编码器引脚1 const int encoderPin2 = 3; // 编码器引脚2 const int motorPin1 = 8; // 步进电机引脚1 const int motorPin2 = 9; // 步进电机引脚2 const int motorPin3 = 10; // 步进电机引脚3 const int motorPin4 = 11; // 步进电机引脚4 const int speed = 500; // 步进电机转动速度 Stepper myStepper(stepsPerRevolution, motorPin1, motorPin3, motorPin2, motorPin4); TB6600 tb6600(8, 9, 10); // TB6600驱动器连接的引脚 ``` 然后,在 `setup()` 函数中初始化编码器和驱动器: ``` void setup() { pinMode(encoderPin1, INPUT_PULLUP); pinMode(encoderPin2, INPUT_PULLUP); myStepper.setSpeed(speed); tb6600.begin(); } ``` 接下来,在 `loop()` 函数中读取编码器的旋转方向,并控制步进电机的转动方向: ``` void loop() { int encoderVal1 = digitalRead(encoderPin1); int encoderVal2 = digitalRead(encoderPin2); int encoderDir = (encoderVal1 << 1) | encoderVal2; // 计算旋转方向 if (encoderDir == 0b10) { // 顺时针旋转 myStepper.step(1); } else if (encoderDir == 0b01) { // 逆时针旋转 myStepper.step(-1); } int motorPos = myStepper.currentPosition(); tb6600.rotate(motorPos); // 控制步进电机转动 } ``` 这样,就可以使用旋转编码器控制步进电机驱动器的旋转了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值