外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)相关的知识,希望对你有一定的参考价值。

外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)
《外部按键中断精准控制步进电机起保停,正反转(Arduino+TB6600驱动器)》基础上新增2个加减速按键,来调节步进电机速度。
步进电机和驱动器相关的资料
https://pan.baidu.com/s/1udb4MyEOXk4CTO7TKRHj6w 
提取码: fuea 
  • 步进电机
    在这里插入图片描述
  • TB6600驱动器
    *
  • **接线说明:**重点内容!!!!为什么一写步进电机就老生常谈这个接线问题问题,因为实在太重要了,关系到后面的工作能否继续开展。

//控制步进电机,必须要有3条线接到Arduino uno控制板上,不管是共阴还是共阳接法。
//三条线分别是:PUL,DIR,ENA,为什么不标符号,共阳接法就是PUL+.DIR+,ENA+
//共阴接法就是PUL-,DIR-,ENA-,
//共阳接法就是将PUL+ DIR+ ENA+串联一起,再接到Arduino的控制引脚上8脚,PUl- DIR-分别接到Arduino板的控制引脚上,还剩下的ENA-,可以接到5V,或者悬空不接,接到GND引脚上,经实验也无影响。
//共阴接法就是与之相反,最后的ENA+,可以悬空,也可以接GND,但是不能接到5V上,否则不转,有影响。
//共阳极接线注意一点,ENA+接到Arduino板子上的5V连接不能串太大的电阻,可以串几Ω的电阻,或者不串联电阻,直接接接入,但是不能串1K的的电阻,否则电机不转!!!
//在其他控制器中使用,例如PLC是24V控制的,就注意,必须串联2K的电阻,进行限流分压
//本次实验电机驱动采用共阴极接线方式
//下面是控制引脚接入Arduino说明:
1. PUL-, DIR-, EN- 连接一起,再接到Arduino UNO 的8引脚上面,也叫使能端,必须要接的线!!!
2. PUL+ 连接到 Arduino UNO的9引脚,控制步进转动的
3. DIR+ 连接到 Arduino UNO的 10引脚,控制步进转动方向的
4. EN+ 连接到 Arduino UNO的GND上,也可以悬空不接!
5. BUTTON按钮3个,停止按钮接5引脚,按键必须是带自锁的按键,就是压下去不会立马弹起来的,需要再按一下,就弹起来的,这种自锁按钮正转和反转分别接到67引脚,串联一个限流电阻1K到接到GND。
6. 特别注意一点,这期带来的步进电机控制,将使能引脚EN接到了实际的控制引脚,与之前写的几篇步进电机控制的文章不同,原来是默认是接到(共阴和共阳接法)GND或者5V,直接使能了电机。
  • 程序源码:
/**
  *************************************************************************************************
外部按键中断精准控制步进电机起保停,正反转,加减速
Arduino UNO + TB6600
  * @note    ´      步进电机基础例程
  *************************************************************************************************
  */
#include "PinChangeInt.h"

const unsigned int EN_PIN = 8;    //使能引脚
const unsigned int DIR_PIN = 10;   //方向引脚
const unsigned int STEP_PIN = 9;  //脉冲引脚
const unsigned int speedup_PIN = 11;  //速度引脚
const unsigned int speeddown_PIN = 12;  //速度引脚

const unsigned int for_PIN = 7;//正转
const unsigned int ror_PIN = 6;//反转
const unsigned int stop_pin = 5;//停止
static unsigned int speeds= 500;//初始速度

void Motorstop(){
        Serial.println("停转"); 
      digitalWrite(EN_PIN, HIGH);   
      digitalWrite(DIR_PIN, HIGH);    
}
void for_key(){
      digitalWrite(EN_PIN, LOW);   
      digitalWrite(DIR_PIN, LOW);    
      Serial.println("正转");
    }
void ror_key(){
      digitalWrite(EN_PIN, LOW);   
      digitalWrite(DIR_PIN, HIGH);    
      Serial.println("反转");  
}
void speed_up(){
  
  switch(speeds)
    {   
      case 400:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 450:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 500:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 550:  speeds +=50;delay(200); Serial.println("speed up:+50 速度:" + String(speeds));break;
      case 600:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 650:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 700:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" +String(speeds)); break;
      case 750:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      case 800:  speeds +=50;delay(200);Serial.println("speed up:+50 速度:" + String(speeds)); break;
      default:  Serial.println("Reach maximum speed!"); break;
      }
}

void speed_down(){

   switch(speeds)
    {  
      case 450:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds)); break;
      case 500:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds));break;
      case 550:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds)); break;
      case 600:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds)); break;
      case 650:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds));break;
      case 700:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds));break;
      case 750:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds)); break;
      case 800:  speeds -=50;delay(200);Serial.println("speed up:-50 速度:"+String(speeds)); break;
      default:  Serial.println("Speed to a minimum!"); break;

    }
}
void setup() {
  sei();
  Serial.begin(115200);
  pinMode( EN_PIN,  OUTPUT ); 
  pinMode( DIR_PIN,  OUTPUT );
  pinMode( STEP_PIN,  OUTPUT );
  pinMode(speedup_PIN,INPUT_PULLUP);
  pinMode(speeddown_PIN,INPUT_PULLUP); 
  
  digitalWrite(EN_PIN, HIGH);    //使能步进电机
  digitalWrite(DIR_PIN, LOW);   //方向初始化
  digitalWrite(STEP_PIN, LOW);

  pinMode(for_PIN,INPUT_PULLUP);
  pinMode(ror_PIN,INPUT_PULLUP);
  pinMode(stop_pin,INPUT_PULLUP);

  attachPinChangeInterrupt(stop_pin , Motorstop, FALLING);
  attachPinChangeInterrupt( for_PIN , for_key, FALLING );
  attachPinChangeInterrupt( ror_PIN , ror_key, FALLING );
  attachPinChangeInterrupt( speedup_PIN , speed_up, FALLING );
  attachPinChangeInterrupt( speeddown_PIN , speed_down, FALLING );

//  LOW 当引脚为低电平时,触发中断
//CHANGE 当引脚电平发生改变时,触发中断
//RISING 当引脚由低电平变为高电平时,触发中断
//FALLING 当引脚由高电平变为低电平时,触发中断.
  Serial.println("Starting......");
}

void loop() {
    digitalWrite(STEP_PIN, HIGH);
     delayMicroseconds(speeds );
//    delayMicroseconds(10);
    digitalWrite(STEP_PIN, LOW); 
     delayMicroseconds(speeds);
//    delay(1);
}
关于附带的头文件:PinChangeInt.h代码,与《外部按键中断精准控制步进电机起保停,正反转(Arduino+TB6600驱动器)》里面的相同,这里就不占用文章篇幅,贴出来了,直接去那拷贝过来即可。

以上是关于外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)的主要内容,如果未能解决你的问题,请参考以下文章

Proteus仿真Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制

Proteus仿真Arduino+uln2003驱动步进电机+单按键启保停正反转控制

51单片机+L293D控制直流电机起保停正反转

Proteus仿真Arduino UNO+ uln2003驱动步进电机+按键启保停控制

VSM Studio uln2003驱动步进电机+单按键启保停正反转四拍控制

VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制