几种步进电机控制

该博客详细介绍了步进电机的多种控制方法,包括简单控制、恒速控制、简单的加速、恒定加速度以及恒定加速度带中断等,配合视频教程和电机特性文档,为读者提供了全面的学习资源。
摘要由CSDN通过智能技术生成

具体的讲解见:

https://www.youtube.com/watch?v=fHAO7SW-SZI&t=1308s

文中的电机特性文档见:

链接:https://pan.baidu.com/s/1WdZ-yWIUyPWmhbD_X1_6FQ 
提取码:lc99 
复制这段内容后打开百度网盘手机App,操作更方便哦

 

1 简单控制

#define DIR_PIN          2
#define STEP_PIN         3
#define ENABLE_PIN       4

void setup() {
  pinMode(DIR_PIN,    OUTPUT);
  pinMode(STEP_PIN,   OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  digitalWrite(ENABLE_PIN, LOW);
}

void loop() {
  digitalWrite(STEP_PIN, HIGH);
  digitalWrite(STEP_PIN, LOW);
  delay(1);
}

2 恒速控制

#define DIR_PIN          2
#define STEP_PIN         3
#define ENABLE_PIN       4

void setup() {
  pinMode(STEP_PIN,   OUTPUT);
  pinMode(DIR_PIN,    OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
}

void simpleMove(int steps) {
  int interval = 100;
  for (int i = 0; i < steps; i++) {
    digitalWrite(STEP_PIN, HIGH);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(interval);
  }
}

void loop() {
  digitalWrite(DIR_PIN, LOW);
  simpleMove(800);
  digitalWrite(DIR_PIN, HIGH);
  simpleMove(800);

  while (true);
}

3 简单的加速

#define DIR_PIN          2
#define STEP_PIN         3
#define ENABLE_PIN       4

void setup() {
  pinMode(STEP_PIN,   OUTPUT);
  pinMode(DIR_PIN,    OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
}

void simpleAccel(int steps) {

  int lowSpeed = 2000;
  int highSpeed = 100;
  int change = 2;

  int rampUpStop = (lowSpeed - highSpeed) / change;
  if ( rampUpStop > steps / 2 )
    rampUpStop = steps / 2;
  int rampDownStart = steps - rampUpStop;

  int d = lowSpeed;

  for (int i = 0; i < steps; i++) {
    digitalWrite(STEP_PIN, HIGH);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(d);

    if ( i < rampUpStop )
      d -= change;
    else if ( i > rampDownStart )
      d += change;
  }
}

void loop() {
  digitalWrite(DIR_PIN, LOW);
  simpleAccel(2400);
  digitalWrite(DIR_PIN, HIGH);
  simpleAccel(2400);

  while (true);

}

4 恒定加速度


#define DIR_PIN          2
#define STEP_PIN         3
#define ENABLE_PIN       4

void setup() {
  pinMode(STEP_PIN,   OUTPUT);
  pinMode(DIR_PIN,    OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
}

#define STEPS 400

void constantAccel() {
  int delays[STEPS];
  float angle = 1;
  float accel = 0.01;
  float c0 = 2000 * sqrt( 2 * angle / accel ) * 0.67703;
  float lastDelay = 0;
  int highSpeed = 100;
  for (int i = 0; i < STEPS; i++) {
    float d = c0;
    if ( i > 0 )
      d = lastDelay - (2 * lastDelay) / (4 * i + 1);
    if ( d < highSpeed )
      d = highSpeed;
    delays[i] = d;
    lastDelay = d;
  }

  // use delays from the array, forward
  for (int i = 0; i < STEPS; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds( delays[i] );
    digitalWrite(STEP_PIN, LOW);
  }

  // use delays from the array, backward
  for (int i = 0; i < STEPS; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds( delays[STEPS-i-1] );
    digitalWrite(STEP_PIN, LOW);
  }
}

void loop() {

  digitalWrite(DIR_PIN, LOW);
  constantAccel();
  digitalWrite(DIR_PIN, HIGH);
  constantAccel();

  while (true);
}

5 恒定加速度带中断

#define DIR_PIN          2
#define STEP_PIN         3
#define ENABLE_PIN       4

#define STEP_HIGH        PORTD |=  0b00001000;
#define STEP_LOW         PORTD &= ~0b00001000;

#define TIMER1_INTERRUPTS_ON    TIMSK1 |=  (1 << OCIE1A);
#define TIMER1_INTERRUPTS_OFF   TIMSK1 &= ~(1 << OCIE1A);

unsigned int c0;

void setup() {
  pinMode(STEP_PIN,   OUTPUT);
  pinMode(DIR_PIN,    OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);

  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 1000;                             
  TCCR1B |= (1 << WGM12);
  TCCR1B |= ((1 << CS11) | (1 << CS10));
  interrupts();

  c0 = 1600; // was 2000 * sqrt( 2 * angle / accel )
}

volatile int dir = 0;
volatile unsigned int maxSpeed = 10;
volatile unsigned long n = 0;
volatile float d;
volatile unsigned long stepCount = 0;
volatile unsigned long rampUpStepCount = 0;
volatile unsigned long totalSteps = 0;
volatile int stepPosition = 0;

volatile bool movementDone = false;

ISR(TIMER1_COMPA_vect)
{
  if ( stepCount < totalSteps ) {
    STEP_HIGH
    STEP_LOW
    stepCount++;
    stepPosition += dir;
  }
  else {
    movementDone = true;
    TIMER1_INTERRUPTS_OFF
  }

  if ( rampUpStepCount == 0 ) { // ramp up phase
    n++;
    d = d - (2 * d) / (4 * n + 1);
    if ( d <= maxSpeed ) { // reached max speed
      d = maxSpeed;
      rampUpStepCount = stepCount;
    }
    if ( stepCount >= totalSteps / 2 ) { // reached halfway point
      rampUpStepCount = stepCount;
    }
  }
  else if ( stepCount >= totalSteps - rampUpStepCount ) { // ramp down phase
    n--;
    d = (d * (4 * n + 1)) / (4 * n + 1 - 2);
  }

  OCR1A = d;
}

void moveNSteps(long steps) {

  digitalWrite(DIR_PIN, steps < 0 ? HIGH : LOW);
  dir = steps > 0 ? 1 : -1;
  totalSteps = abs(steps);
  d = c0;
  OCR1A = d;
  stepCount = 0;
  n = 0;
  rampUpStepCount = 0;
  movementDone = false;

  TIMER1_INTERRUPTS_ON
}

void moveToPosition(long p, bool wait = true) {
  moveNSteps(p - stepPosition);
  while ( wait && ! movementDone );
}

void loop() {

  moveToPosition(  1600 );
  moveToPosition( -1600 );
  moveToPosition( 0 );

  moveToPosition( 200 );
  moveToPosition( 400 );
  mo
卓立汉光步进电机控制器SC300的控制程序 sc300help_ch.chm为控制器附带应用软件之帮助,内含通讯协议与OCX控件调用说明。 Sc300编程控件文件夹内为进行二次开发所需要的文件及说明。 Sample为在Visual Basic中使用OCX控件进行开发的示例程序。 LabView为在LabView中使用OCX控件进行开发的示例程序。 Sample_VC在VC中使用OCX控件进行开发的示例程序 SC300系列位移台控制箱使用说明书.pdf为控制箱说明书,包括控制器使用及通讯协议,注意事项等。 setup2.2.2SC300_20121108为标准控制软件。安装完毕后如果在WIN7或WIN8系统下运行程序,需要点击右键选择兼容模式再运行。 控件调用和安装方法: 1、如果电脑已经安装配套的控制软件,可以打开示例直接运行,直接调用OCX控件中函数。 2、如果电脑没有安装配套的控制软件,就需要将OCX文件夹中的.lic和.ocx文件放在指定的路径下。 32位操作系统放在C:\WINDOWS\system32,64位操作系统放在C:\WINDOWS\SysWOW64。 同时需要注册一下,在开始运行里输入regsvr32 C:\WINDOWS\system32\ZOLIXSC300.ocx(32位), regsvr32 C:\WINDOWS\SysWOW64\ZOLIXSC300.ocx(64位),点击确定提示成功后即可调用。 如果出现提示dllregisterserver调用失败,可在程序 - 附件 - 命令提示符,在”命令提示符“上点击鼠标右键,选择”以管理员身份运行“命令, 这个时候将打开Dos命令窗口,然后按正常写法输入上述语句,就能够注册成功了。 如果已成功注册但调用不了,可尝试反注册一下:regsvr32 /u C:\WINDOWS\system32\ZOLIXSC300.ocx(32位),regsvr32 /u C:\WINDOWS\SysWOW64\ZOLIXSC300.ocx(64位)。 然后重新注册即可。 3、如果需要重新建立新的工程,按照上述1或2完成之后, VC环境下: Project-Add to Project-Components and Controls Gallery-Registered ActiveX Controls-ZolixSC300.lnk 此路径下插入即可,此时出现OCX图标,拖入即可调用。 labview环境下: 工具-导入-ActiveX控件至选板-ZolixSC300 Control 点击确定即出现图标,拖入即可调用。 4、在64位操作系统下注册控件,如果出现“对dllregisterserver的调用失败,错误代码为0x80040200”,可以以管理员身份运行:所有程序-附件-命令提示符,再输入注册指令即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值