Arduino UNO利用电位器模拟输量输入控制步进电机调速

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino UNO利用电位器模拟输量输入控制步进电机调速相关的知识,希望对你有一定的参考价值。

Arduino UNO利用电位器模拟输量输入控制步进电机调速

新增电位器模拟量输入调节步进电机转速,起保停,正反转依旧采用前面文章所使用的外部按键触发中断方法来实现,

步进电机和驱动器相关的资料
https://pan.baidu.com/s/1udb4MyEOXk4CTO7TKRHj6w 
提取码: fuea 
  • 步进电机
    在这里插入图片描述

  • TB6600驱动器
    *

  • **接线说明:**重点内容!!!!为什么一写步进电机就老生常谈这个接线问题问题,因为实在太重要了,关系到后面的工作能否继续开展。

  • 在这里插入图片描述

  • 程序代码:

/**
  *************************************************************************************************
外部按键中断精准控制步进电机起保停,正反转,加减速
Arduino UNO + TB6600
  *  步进电机基础例程
  *  利用模拟输出口调速
  * A0引脚接电位器,GND-A0-3.3V
 
  */
#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;//初始速度
static unsigned int value;

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_down(){
//  
//  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("Speed to a minimum!"); break;
//      
//   }
//}

//void speed_up(){
//
//   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("Reach maximum speed!"); 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() {
   Motor_run();
}

void Motor_run(){
    value = analogRead(A0);
  if(value > 50){
  speeds = map(value, 0, 1023, 400, 900);}
      digitalWrite(STEP_PIN, HIGH);
     delayMicroseconds(speeds);
    digitalWrite(STEP_PIN, LOW); 
     delayMicroseconds(speeds);
     Serial.println("Now Speed:"+String(speeds));
  }
关于附带的头文件:PinChangeInt.h代码,与《外部按键中断精准控制步进电机起保停,正反转(Arduino+TB6600驱动器)》里面的相同,这里就不占用文章篇幅,贴出来了,直接去那拷贝过来即可。

以上是关于Arduino UNO利用电位器模拟输量输入控制步进电机调速的主要内容,如果未能解决你的问题,请参考以下文章

LabVIEW控制Arduino采集电位器电压(基础篇—4)

LabVIEW控制Arduino采集电位器电压(基础篇—4)

LabVIEW控制Arduino采集电位器电压(基础篇—4)

Arduino UNO通过电容的直接检测实现简易触摸开关

arduino入门-用arduino uno制作基于蓝牙的数据监控系统

Arduino UNO模拟输入端口(A0-A5)改成数字IO输出使用