Скачай с FTP:
NI LabVIEW Interface for Arduino
Управление шаговым двигателем через параллельный порт
-
- junior
- Сообщения: 51
- Зарегистрирован: 18 апр 2012, 13:51
- Версия LabVIEW: 2011
- Контактная информация:
Re: Управление шаговым двигателем через параллельный порт
Добрый день, извиняюсь, был занят другой работой. Дошли руки и до зонда.
Напомню назначение и нюансы работы установки. Старый советский ЗОНД-А5 переделываю под автоматизацию измерений диодов в пластине с помощью платы arduino due и ПК. Диоды бракуются по емкости с помощью измерителя иммитанса е7-20 и по току с помощью ОВНА.
В настоящий момент застрял на обмене данными между ПК и arduino. Проблема в следующем: запускаю программу в labview, а фактически двигатели начинают исполнять команды спустя 9-10 секунд после запуска программы. На чьей стороне проблема понять, к сожалению не могу, прошу помочь разобраться.
Выкладываю часть кода arduino(опущена часть кода ручного управления - там все впорядке) и скрин блок-диаграммы LV:
Работать программа должна так: отправляем запрос ардуине о состоянии датчика касания, принимаем ответ, затем крутим двигатель.
Повторюсь: работа программы устраивает, но лишь после непонятной задержки в течение 9-10 секунд.
Напомню назначение и нюансы работы установки. Старый советский ЗОНД-А5 переделываю под автоматизацию измерений диодов в пластине с помощью платы arduino due и ПК. Диоды бракуются по емкости с помощью измерителя иммитанса е7-20 и по току с помощью ОВНА.
В настоящий момент застрял на обмене данными между ПК и arduino. Проблема в следующем: запускаю программу в labview, а фактически двигатели начинают исполнять команды спустя 9-10 секунд после запуска программы. На чьей стороне проблема понять, к сожалению не могу, прошу помочь разобраться.
Выкладываю часть кода arduino(опущена часть кода ручного управления - там все впорядке) и скрин блок-диаграммы LV:
Код: Выделить всё
#include <string.h>
//ДШИ 1 ГОРИЗОНТАЛЬ////////////////////////
int dirpin1 = 2;
int steppin1 = 3;
int leftPin1 = 52;
int rightPin1 = 50;
int Stop1 = 54;
int Stop2 = 55;
//ДШИ 2 ВЕРТИКАЛЬ////////////////////////
int dirpin2 = 4;
int steppin2 = 5;
int downPin2 = 53;
int upPin2 = 51;
int Stop3 = 56;
int Stop4 = 57;
int speedPin = 48; //pin скорости
int datch = 46; //pin касания
int magn = 49; //pin столика
int rstate, lstate, ustate, dstate = 0;
char direct[2];
char st[5];
char sp[2];
void setup()
{
Serial.begin(9600);
pinMode(dirpin1, OUTPUT);
pinMode(steppin1, OUTPUT);
pinMode(rightPin1, INPUT);
pinMode(leftPin1, INPUT);
pinMode(Stop1, INPUT);
pinMode(Stop2, INPUT);
pinMode(dirpin2, OUTPUT);
pinMode(steppin2, OUTPUT);
pinMode(downPin2, INPUT);
pinMode(upPin2, INPUT);
pinMode(Stop3, INPUT);
pinMode(Stop4, INPUT);
pinMode(speedPin, INPUT);
pinMode(datch, INPUT);
pinMode(magn, OUTPUT);
}
void loop()
{
int i, n, a, b, spPin, rval, lval, rightStop, leftStop, uval, dval, upStop, downStop, S, V, dat;
int k = 0;
char buffer[10];
a = 500; //КОНЕЧНАЯ СКОРОСТЬ
n = 1000; //НАЧАЛЬНАЯ СКОРОСТЬ
b = 10; //ШАГОВАЯ СКОРОСТЬ
rval = digitalRead(rightPin1); //Переменные горизонтального ДШИ1
lval = digitalRead(leftPin1);
rightStop = digitalRead(Stop1);
leftStop = digitalRead(Stop2);
uval = digitalRead(upPin2); //Переменные вертикального ДШИ2
dval = digitalRead(downPin2);
upStop = digitalRead(Stop3);
downStop = digitalRead(Stop4);
spPin = digitalRead(speedPin);
dat = digitalRead(datch);
direct [0] = '\0';
st [0] = '\0';
sp [0] = '\0';
while(Serial.available() > 0) //загоняем прочитанное в буфер
{
buffer[k] = Serial.read();
k++;
delay (2);
}
buffer[k++] = '\0'; //закрываем массив
if(k>0) //если буфер наполнен
{
sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp); //разбераем его на части отделенные запятой
}
S = String(st).toInt();
V = String(sp).toInt();
if ((String)direct == "a")
{
// ДАТЧИК КАСАНИЯ.
if (dat == HIGH) // Контакт.
{
Serial.print(1, DEC);
Serial.print('\0');
}
else // Нет контакта.
{
Serial.print(2, DEC);
Serial.print('\0');
}
}
//Крутим вправо (RIGHT)///////////////////////
if ((String)direct == "r" && rightStop == LOW)
{
digitalWrite(magn, LOW);
for (i=0; i<S; i++)
{
digitalWrite(dirpin1, LOW); // Выбираем направление.
digitalWrite(steppin1, LOW);
digitalWrite(steppin1, HIGH);
delay(V);
}
digitalWrite(magn, HIGH);
}
//Крутим влево (LEFT)/////////////////////////
if ((String)direct == "l" && leftStop == LOW)
{
digitalWrite(magn, LOW);
for (i=0; i<S; i++)
{
digitalWrite(dirpin1, HIGH); // Выбираем направление.
digitalWrite(steppin1, LOW);
digitalWrite(steppin1, HIGH);
delay(V);
}
digitalWrite(magn, HIGH);
}
//Крутим вверх (UP)///////////////////////////
if ((String)direct == "u" && upStop == LOW)
{
for (i=0; i<S; i++)
{
digitalWrite(dirpin2, LOW); // Выбираем направление.
digitalWrite(steppin2, LOW);
digitalWrite(steppin2, HIGH);
delay(V);
}
}
//Крутим вниз (DOWN)//////////////////////////
if ((String)direct == "d" && downStop == LOW)
{
for (i=0; i<S; i++)
{
digitalWrite(dirpin2, HIGH); // Выбираем направление.
digitalWrite(steppin2, LOW);
digitalWrite(steppin2, HIGH);
delay(V);
}
}
}
Работать программа должна так: отправляем запрос ардуине о состоянии датчика касания, принимаем ответ, затем крутим двигатель.
Повторюсь: работа программы устраивает, но лишь после непонятной задержки в течение 9-10 секунд.
С уважением, Александр.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Управление шаговым двигателем через параллельный порт
подобные задержки тоже наблюдал, как правило происходят при запуске программыroccosiffredi писал(а):Повторюсь: работа программы устраивает, но лишь после непонятной задержки в течение 9-10 секунд.
после того как соединение установлено, задержки становятся минимальны
возможно это время установления соединения, синхронизации и передачи данных
--------- посмотрел скетч
я подзабыл немного...
но почему инициализацию переменных не вынести за основной цикл (программа - прошивка)
получается, что каждый цикл начинается с инициализации и назначения всех переменных
это тоже немного съедает ресурсы МК
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- junior
- Сообщения: 51
- Зарегистрирован: 18 апр 2012, 13:51
- Версия LabVIEW: 2011
- Контактная информация:
Re: Управление шаговым двигателем через параллельный порт
Добрый день, проблема ушла после добавления функции VISA Clear в начале цикла.
Все ПО почти готово, интересует один вопрос перед началом механической отладки:
Каким образом при логическом условии начать формирование массива в пустой Case-структуре в новый столбик? При false никаких изменений. Грубо говоря когда столик опускается на нижнюю линию диодов, емкости этих диодов необходимо записывать новым столбиком в таблице.
Выкладываю часть блок-диаграммы с пустой Case-структурой:
Пример необходимой таблицы(после 5 диода столик переходит на новую линию диодов):
1_0,1_____6_0,2
2_0,1_____7_0,3
3_0,2_____8_0,5
4_0,1_____9_0,4
5_0,3_____10_0,2
Все ПО почти готово, интересует один вопрос перед началом механической отладки:
Каким образом при логическом условии начать формирование массива в пустой Case-структуре в новый столбик? При false никаких изменений. Грубо говоря когда столик опускается на нижнюю линию диодов, емкости этих диодов необходимо записывать новым столбиком в таблице.
Выкладываю часть блок-диаграммы с пустой Case-структурой:
Пример необходимой таблицы(после 5 диода столик переходит на новую линию диодов):
1_0,1_____6_0,2
2_0,1_____7_0,3
3_0,2_____8_0,5
4_0,1_____9_0,4
5_0,3_____10_0,2
С уважением, Александр.
-
- junior
- Сообщения: 51
- Зарегистрирован: 18 апр 2012, 13:51
- Версия LabVIEW: 2011
- Контактная информация:
Re: Управление шаговым двигателем через параллельный порт
Уважаемые, добрый день, очень нужна ваша срочная помощь.
Который день уже не могу избавиться от следующей проблемы:
команды b1,100,2 и b2,100,2 включают соответствующие магниты; однако программа начинает работать лишь после первого получения команды в отладочном режиме!!(с включенной лампочкой); как только с лампочкой команда пришла и магнит сработал, лампу можно отключить и программа работает нормально.
В чем может быть дело? Уже замучался переустанавлявать различные версии визы и лабвью. Видимо дело все-таки в коде.
С уважением, Александр.