Перемещение и остановка шагового двигателя без использования задержки
Я использую шаговый двигатель с внешним концевым выключателем (поэтому, когда питание включено, двигатель будет знать, с чего начать) с приводом двигателя L6470. То, что я хочу сделать здесь, это
- когда питание включено → поверните часы (CW) до тех пор, пока он не достигнет внешнего концевого выключателя
- После включения концевого выключателя → Поверните против часовой стрелки (CCW) на 550 миль секунд
- Отдых 100 мил секунд
- Поверните часы Мудрый (CW) в течение 200 mil секунд
- Отдых 100 мил секунд
- Включите Anti-Clock Wise (CCW) на 200 mil секунд
- ....цикл от 3 до 6
Мой текущий код использует "счетчик". Это происходит потому, что я не могу использовать "задержку" в этом коде, так как она прерывает код активации концевого выключателя.
Я только написал простые коды и не знаю, как сделать его отдых без использования "задержки". Пожалуйста, помогите....
#include <Arduino.h>
#include <SPI.h>
long max_speed = 7000;
long int dd = 200;
int dt = 10;
int t_interval = 10;
int t_hold = 170;
int steps;
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10
#define PIN_L6470_SS PIN_SPI_SS
void L6470_write(unsigned char data);
void L6470_init(void);
void L6470_run(long speed);
long speed = 1000;
long int n_dir = 0 ;
long offTime;
int c_step = max_speed / dd;
const int limit_sw = 7;
bool switchState = false;
int counter = 0;
int milsec = 0;
bool speedSwitch = false;
void setup()
{
pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(PIN_L6470_SS, OUTPUT);
pinMode(limit_sw, INPUT_PULLUP );
digitalWrite(PIN_L6470_SS, HIGH);
SPI.begin();
Serial.begin(9600);
L6470_init();
Serial.println("Start...");
void loop()
{
int value = digitalRead(limit_sw);
if(value == 0){
counter ++;
if(counter > 50){
switchState = true;
counter = 50;
}
}
if (switchState == true){
milsec++;
Serial.println(milsec);
if(milsec > 550){
speedSwitch = !speedSwitch;
milsec = 0;
}
int speed;
if(speedSwitch == true){
//Serial.println("speedSwitch : true");
speed = 200;
}
else{
//Serial.println("speedSwitch : false");
speed = -200;
}
}
else{
L6470_run( 100 );
}
}
void L6470_write(unsigned char data)
{
digitalWrite(PIN_L6470_SS, LOW);
SPI.transfer(data);
digitalWrite(PIN_L6470_SS, HIGH);
}
void L6470_init()
{
L6470_write(0x07);
L6470_write(0x00);
L6470_write(0x90);
L6470_write(0x09);
L6470_write(0xFF);
L6470_write(0x0A);
//L6470_write(0xFF);
L6470_write(0x64);
L6470_write(0x0B);
L6470_write(0xFF);
L6470_write(0x0C);
L6470_write(0xFF);
L6470_write(0x13);
L6470_write(0x0F);
L6470_write(0x14);
L6470_write(0x7F);
}
void L6470_run(long speed)
{
unsigned short dir;
unsigned long spd;
unsigned char spd_h;
unsigned char spd_m;
unsigned char spd_l;
//spd = speed;
if (speed < 0)
{
dir = 0x50;
spd = -1 * speed;
}
else
{
dir = 0x51;
spd = speed;
}
spd_h = (unsigned char)((0x0F0000 & spd) >> 16);
spd_m = (unsigned char)((0x00FF00 & spd) >> 8);
spd_l = (unsigned char)(0x00FF & spd);
L6470_write(dir);
L6470_write(spd_h);
L6470_write(spd_m);
L6470_write(spd_l);
Serial.print( " current spd = ");
Serial.println( spd );
}
@Claire, 👍1
0
Смотрите также:
- Шаговый двигатель не работает с платой A4988
- Шаговый двигатель работает медленно при чтении с датчика MPU 6050
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?
- Неодновременное управление несколькими шаговыми двигателями
- Двигатель не вращается плавно (даже на высокой скорости)
- Как правильно использовать микрошаговый драйвер с шаговым двигателем более низкого напряжения
- arduino 28BYJ-48 stepper только жужжит, не вращается