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)