arduino uno 驱动4个57步进电机转速不同?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11673|回复: 9

[未解决] arduino uno 驱动4个57步进电机转速不同?

[复制链接]
发表于 2018-3-26 14:07 | 显示全部楼层 |阅读模式
想弄一个能精确控制前后左右行动的小型车底盘。用了共阳的接法,然后测试转动,发现每个步进电机的转速不一样。5和6两个io接的电机明显速度比3和9两个io口接的电机快。这是什么原因造成的?
我的测试代码如下

void setup(){
  pinMode(3,OUTPUT);      
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(9,OUTPUT);
  analogWrite(3, HIGH);     
  analogWrite(5, HIGH);
  analogWrite(6, HIGH);
  analogWrite(9, HIGH);

}
void loop(){  

}



57步进电机的驱动器

57步进电机的驱动器

这个是调节细分数和电流

这个是调节细分数和电流
发表于 2018-4-26 22:18 | 显示全部楼层
你好,是这样的,步进电机实质上是脉冲控制,PWM也可以看成连续的脉冲, analogWrite(3, HIGH);     analogWrite(5, HIGH);  analogWrite(6, HIGH); analogWrite(9, HIGH);analogWrite()函数产生PMM是没错,但是PWM引脚3、9、10、11引脚的PWM频率是默认490HZ,而5、6的PWM的频率是980HZ。步进电机的角度由脉冲数控制,频率决定速度。所以你的5、6口的步进电机应该是3、9口步进电机速度两倍左右。哈哈
发表于 2018-3-27 15:25 | 显示全部楼层
闹什么啊?这个是步进机驱动器,没见这么玩的:
这个驱动器需要这样使用:
EN如果不用可以不接,当然接都没问题,需要根据规格书上的使能电平控制驱动器是否输出;
如果接的话,按你的共阳接法,
首先:ENA +   DIR+ PUL+ 都接+5V电源,给光耦合器件供电,电机电源接VCC,GND,ARDUINO主板的地GND与电机电源GND接到一起;
其次,你的程序这样电机应该不会动,即使动,也是爬行状态,没有力,而且发热厉害; PUL要给脉冲信号才能动,DIR和EN可以给电平信号; 接法是: PUL- 接一个IO,使用脉冲控制,DIR-接一个IO,用高低电平改变转向,如果只是测试电机,可以接+5V或者GND都可以,这样电机不换向;EN-接负电平时候,驱动器工作,如果EN+ 和EN-都不接,驱动器一般默认工作,下面的帖子是我以前回复别人的一个贴,你看一下,或许有帮助。
https://www.arduino.cn/forum.php ... mp;page=1#pid301596
发表于 2018-3-26 18:20 | 显示全部楼层
上完整程序
 楼主| 发表于 2018-3-27 12:59 | 显示全部楼层

void setup(){
  pinMode(3,OUTPUT);      
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(9,OUTPUT);
  analogWrite(3, HIGH);     
  analogWrite(5, HIGH);
  analogWrite(6, HIGH);
  analogWrite(9, HIGH);

}
void loop(){  

}
这个就是呀,一只给高电平,让它不停的转,各电机转速不同
发表于 2018-3-27 15:09 | 显示全部楼层
闹着玩呢哥,你这是pwm,鬼知道哪两个通道的pwm频率是不是一样
 楼主| 发表于 2018-3-27 20:19 | 显示全部楼层
sun910231 发表于 2018-3-27 15:25
闹什么啊?这个是步进机驱动器,没见这么玩的:
这个驱动器需要这样使用:
EN如果不用可以不接,当然接都没 ...

谢谢您,刚入手,不知道怎么输入脉冲,还以为是用pwm来控制,结果转速不同,看了您的答案,按照高低电平切换稳定了。
 楼主| 发表于 2018-3-27 20:21 | 显示全部楼层
雨季不再来 发表于 2018-3-27 15:09
闹着玩呢哥,你这是pwm,鬼知道哪两个通道的pwm频率是不是一样

嗯嗯,刚入手,还以为用pwm来控制,错了。现在弄懂了,谢谢您
发表于 2018-4-27 09:18 | 显示全部楼层
又学到一点东西
发表于 2021-12-24 09:23 | 显示全部楼层
顶,我也用的这个驱动器驱动步进电机,驱动器的电源是20V锂电池,锂电池负极没有和arduino end相连接,但是也正常转了,但是我想控制两个步进电机同时按不同的速度转动,不知道要怎么实现,
循环里的X电机和Y电机分别设置了脉冲,但是2个电机只会按照速度慢的脉冲同速走,不会差别转动
//小车每次按键持续行走,如需换向需要按9中断才能换向,不能连续:行走-换向-行走
//手机蓝牙 HC-06遥控2轮小车, NEMA28步进电机配工业步进驱动器DM430
//步进电机由18V锂电池单独供电,驱动器共阳极接法
//需下载Accelstepper库,DIR+PUL+接控制板5V,PUL-接49引脚 DIR-接58引脚
//利用HC-06蓝牙模块控制,HC-06 RX引脚需使用分压电路确保信号电压为3.3V
//需先将此程序上传到UNO后,再将HC-06连接在UNO开发板上,需断电连接
//1前进,2后退,3左转,4右转,9停止

//#include <AccelStepper.h> //好像不需要**
const int xdirPin = 5;     // 左前轮电机方向引脚
const int xstepPin = 4;    // 左前轮电机步进速度引脚
const int ydirPin = 8;     // 右前轮电机方向引脚
const int ystepPin = 9;    // 右前轮电机步进速度引脚
char seria1Data; //建立字符型变量:seria1Data

//AccelStepper stepper1(1,xstepPin,xdirPin); //创建左前轮电机对象,好像不需要**
//AccelStepper stepper2(1,ystepPin,ydirPin); //创建右前轮电机对象,好像不需要**

void setup(){
  Serial.begin(9600); //启动串口通信,波特率:9600
  pinMode(xstepPin,OUTPUT);     // 左前轮速度引脚为输出模式
  pinMode(xdirPin,OUTPUT);      // 左前轮方向引脚为输出模式
  pinMode(ystepPin,OUTPUT);     // 右前轮速度引脚为输出模式
  pinMode(ydirPin,OUTPUT);      // 右前轮方向引脚为输出模式  
}

void loop(){
  //if(Serial.available()>0){ //判断串口有无接收到数据 ,好像不需要**
  seria1Data= Serial.read();//如有,则通过Serial.read函数读入字符变量中

  if(seria1Data == '1' ){while(1){ //if判断串口是否1,while循环判断是否成立
    if(seria1Data=='9'){break;}else{ //while循环内判断是否接收9,如是则break跳出
     digitalWrite(xdirPin,LOW);      //如不是则往下循环,输出脉冲,控制轮子转动
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(1200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(1200);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200); //延迟2毫秒
     seria1Data= Serial.read(); }} //while循环内设置接收串口,如9则配合跳出循环
  }else if(seria1Data == '2' ){while(1){  //以下相同,按串口信息控制方向
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);  //左前轮正转
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(200);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);  //右前轮正转
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200);
     seria1Data= Serial.read();      }}//延迟2毫秒   
  }else if(seria1Data == '3' ){while(1){
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(400); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(400);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(400); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(400);
     seria1Data= Serial.read();      }}//延迟2毫秒  
  }else if(seria1Data == '4' ){while(1){
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,LOW);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(400); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(400);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(400); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(400);
     seria1Data= Serial.read();      }}//延迟2毫秒  
  }}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 19:05 , Processed in 0.113973 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表