Title
关于本站
留言
地图
联系我
十年博客
首页
前端
Css
jQuery
Vue
React
Uni-app
后端
Java
PHP
Python
Wpf
.Net
硬件
树莓派
PCB制板
ROS机器人
机械臂
51单片机
3D打印机
设计
PS
C4D
素描
丙烯画
学科
英语
物理
电工学
数学
分享
软件
常用
游戏
Arduino使用步进电机驱动器控制56步进电机
2023-04-23
63
0
电子集成模块使用教程
专栏收录该内容
查看全部
7 篇文章
**接线图**  **代码** ``` //#include "pwm.h" /*用arduino的单片机接DM542驱动器来控制57步进电机。采用共阴极接法,即ENA不接,PUL-与DIR-串接单片机GND,PUL+接单片机9口给脉冲,DIR+接8口给高低电平(高电平正转,低电平反转), * 驱动器输出端A+接红,A-接绿,B+接黄,B-接蓝,供电直流24v。 * 定义引脚8作为方向控制,定义引脚9作为PUL端(PWM引脚),程序定义方向,stepper_direction = true,步进电机正转;stepper_direction = false反转。 * 通过串口输入控制指令,lighton 二极管通电发光,lightoff 二极管断电熄灭,left/right控制前进/后退方向,直接输入数字运行,输入stop/0表示停止运行, 输入 255 电机快速转动,输入 256 电机慢速转动。 输入pick进行一次往复来回运行。 */ //信号灯输出口 const int LED_MSG_PIN = 13; //定义了板上的控制端,8作为方向 const int DIRECTION_PIN = 8; //定义了PWM引脚,需要将这个脚接入PUL端 const int SPEED_PUL_PIN = 9; //定义串口接受数据的全局变量 String comdata = ""; //步进电机的转动方向 boolean stepper_direction = false; //默认方向向右,DIR = LOW,电机反转 //步进电机速度,wait ms(间隔时间越小,速度越快) int stepperSpeed = 0; //来回走动运行的次数 int i_run_times = 50; //脉冲次数 long int pulse_cnt = 0; boolean is_control_stepper = false; void setup() { // put your setup code here, to run once: /* https://playground.arduino.cc/Main/TimerPWMCheatsheet/ TCCR0B = TCCR0B & 0b11111000 | <setting>; //Pins 9 and 10: Setting Divisor Frequency 0x01 1 31250 0x02 8 3906.25 0x03 64 488.28125 DEFAULT 0x04 256 122.0703125 0x05 1024 30.517578125*/ //TCCR1B = (TCCR1B & 0b11111000) | 0x03; Serial.begin(9600); //设置 pinMode(LED_MSG_PIN, OUTPUT); pinMode(DIRECTION_PIN, OUTPUT); pinMode(SPEED_PUL_PIN, OUTPUT); } void loop() { // put your main code here, to run repeatedly: char val; while (Serial.available() > 0) { //comdata += char(Serial.read()); val = char(Serial.read()); if ((val != '\r') && (val != '\n')) { comdata += val; } delay(2); } if (comdata.length() > 0) { Serial.println(comdata + " rcv ok"); //Serial.println(comdata); if (comdata == "lighton") { digitalWrite(LED_MSG_PIN, HIGH); delay(300); } else if (comdata == "lightoff") { digitalWrite(LED_MSG_PIN, LOW); delay(300); } else if (comdata == "left") { stepper_direction = true; //步进电机正转 digitalWrite(DIRECTION_PIN, HIGH); Serial.println("go forward."); delay(300); } else if (comdata == "right") { stepper_direction = false; //步进电机反转 digitalWrite(DIRECTION_PIN, LOW); Serial.println("go backward."); delay(300); } else if (comdata == "stop") { digitalWrite(LED_MSG_PIN, LOW); //控制步进电机 analogWrite(SPEED_PUL_PIN, 0); delay(300); } else if (comdata == "pick") { //int i = 0; //开始向前 digitalWrite(DIRECTION_PIN, HIGH); analogWrite(SPEED_PUL_PIN, 1); digitalWrite(LED_MSG_PIN, HIGH); for (int i = 0; i < i_run_times; i++) { if(Serial.read() == "0"){ //如何在往复运动中控制急停 i = i_run_times; } delay(100); } analogWrite(SPEED_PUL_PIN, 0); //开始向后 digitalWrite(DIRECTION_PIN, LOW); analogWrite(SPEED_PUL_PIN, 1); for (int i = 0; i < i_run_times; i++) { delay(100); } analogWrite(SPEED_PUL_PIN, 0); digitalWrite(LED_MSG_PIN, LOW); } else { //开始读取输入的数字 boolean is_number = true; //逐个字符读入检查是否数字 for (int i = 0; i < comdata.length(); i++) { int inChar = comdata[i]; if (!(isDigit(inChar))) //isDigit()主要用于检查其参数是否为十进制数字字符 { is_number = false; } } //判断输入是否为纯数字 if (!is_number) //不是纯数字输入 { Serial.println(comdata +" 未知指令"); } else if(is_number) //纯数字输入(速度值) { stepperSpeed = comdata.toInt(); //步进电机越小速度越快 //开始控制电机 is_control_stepper = true; if(stepperSpeed > 0 && stepperSpeed < 255) //速度大于0 { analogWrite(SPEED_PUL_PIN, stepperSpeed); digitalWrite(LED_MSG_PIN, HIGH); Serial.println("stepper Speed: " + comdata + "."); } else if(stepperSpeed == 0) //速度等于0 { analogWrite(SPEED_PUL_PIN, stepperSpeed); digitalWrite(LED_MSG_PIN, LOW); Serial.println("stepper STOP!"); } else if(stepperSpeed == 255) { digitalWrite(LED_MSG_PIN, HIGH); for(int i = 0; i < 3000; i++) { digitalWrite(SPEED_PUL_PIN,0); delayMicroseconds(100); digitalWrite(SPEED_PUL_PIN,1); delayMicroseconds(100); } Serial.println("Intermittent Move Stop"); digitalWrite(LED_MSG_PIN, LOW); } else if(stepperSpeed == 256) { digitalWrite(LED_MSG_PIN, HIGH); for(int i = 0; i < 5000; i++) { digitalWrite(SPEED_PUL_PIN,0); delayMicroseconds(2000); digitalWrite(SPEED_PUL_PIN,1); delayMicroseconds(2000); } Serial.println("Intermittent Move Stop"); digitalWrite(LED_MSG_PIN, LOW); } } } } //是否控制步进电机 if (is_control_stepper) { //控制步进电机 analogWrite(SPEED_PUL_PIN, stepperSpeed); } comdata = ""; } ``` **测试** 串口波特率:9600 ``` 1 rcv ok stepper Speed: 1. 50 rcv ok stepper Speed: 50. 255 rcv ok Intermittent Move Stop right rcv ok go backward. left rcv ok go forward. 0 rcv ok stepper STOP! ```
网站会不定期更新计算机技术方面知识,感兴趣的可以收藏,如需转载请附上原文出处链接和本声明。
本文连接:
目录
电子集成模块使用教程
查看更多>>
TFT触摸彩色SPI串口显示屏-ILI9488
70
Arduino使用超声波模块
59
Arduino使用WS2812全彩LED
70
Arduino使用16路舵机模块
66
DY-SV17F语音模块
61
Arduino使用温湿度传感器
64
Arduino使用步进电机驱动器控制56步进电机
64
Title