外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)
步进电机和驱动器相关的资料
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引脚,按键必须是带自锁的按键,就是压下去不会立马弹起来的,需要再按一下,就弹起来的,这种自锁按钮正转和反转分别接到6,7引脚,串联一个限流电阻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(){
while(1){
switch(speeds)
{
case 400: speeds +=50; break;
case 450: speeds +=50; break;
case 500: speeds +=50; break;
case 550: speeds +=50; break;
case 600: speeds +=50; break;
case 650: speeds +=50; break;
case 700: speeds +=50; break;
case 750: speeds +=50; break;
case 800: speeds +=50; break;
}}
Serial.print("速度:\t");
Serial.println(speeds);
}
void speed_down(){
while(1){
switch(speeds)
{
case 450: speeds -=50; break;
case 500: speeds -=50; break;
case 550: speeds -=50; break;
case 600: speeds -=50; break;
case 650: speeds -=50; break;
case 700: speeds -=50; break;
case 750: speeds -=50; break;
case 800: speeds -=50; break;
}}
Serial.print("速度:\t");
Serial.println(speeds);
}
void setup() {
sei();
Serial.begin(115200);
pinMode( EN_PIN, OUTPUT );
pinMode( DIR_PIN, OUTPUT );
pinMode( STEP_PIN, OUTPUT );
pinMode( speedup_PIN, INPUT );
pinMode( speeddown_PIN, INPUT );
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(500);
// delayMicroseconds(10);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(500);
// delay(1);
}