Страница 1 из 1

Помогите синхронизировать VISA

Добавлено: 05 ноя 2017, 20:19
Alcamo
Здравствуйте.
У меня есть ардуино Мега . Я к нему подключил энкодер и пытаюсь получить с него сигнал в Labview для построения системы управления. В ардуино я залил код для энкодера:

Код: Выделить всё

/* Rotary encoder with attachInterrupt

Counts pulses from an incremental encoder and put the result in variable counter. 
Taking also into account the direction and counts down when the rotor rotates in 
the other direction.

This code is used attachInterrupt 0 and 1 which are pins 2 and 3 moust Arduino.
For more information about attachInterrupt see:
http://arduino.cc/en/Reference/AttachInterrupt
 
created 2014
by Ben-Tommy Eriksen

https://github.com/BenTommyE/BenRotaryEncoder
 
*/

// Encoder connect to digitalpin 2 and 3 on the Arduino.

int counter = 0;  //This variable will increase or decrease depending on the rotation of encoder

void setup() {
  Serial.begin (9600);
 
  pinMode(2, INPUT);           // set pin to input
  pinMode(3, INPUT);           // set pin to input
  
  digitalWrite(2, HIGH);       // turn on pullup resistors
  digitalWrite(3, HIGH);       // turn on pullup resistors
 
 
  //Setting up interrupt
  //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, RISING);
  
  //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, RISING);
}

void loop() {
  // Send the value of counter
  Serial.println (counter);

}

void ai0() {
  // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
  // Check pin 3 to determine the direction
  if(digitalRead(3)==LOW) {
    counter++;
  }else{
    counter--;
  }
}

void ai1() {
  // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
  // Check with pin 2 to determine the direction
  if(digitalRead(2)==LOW) {
    counter--;
  }else{
    counter++;
  }
}
Далее при помощи VISA я получаю сигнал в Labview.

Но мне необходимо задавать также программные траектории (например синусоиду), строить регулятор и прочее. Я пытаюсь сделать это в одном loop. Но при попытке сгенерить синусоиду в реальном времени и зачитать VISA ничего не получается. У меня это получается только в раздельных Loop. В одном же Loop я вижу свою синусоиду, но сигнал с энкодера замирает и через какие-то промежутки времени выдает разные значения с большими задержками.

Вопрос: Как мне подружить это дело? синхронизировать эти 2 сигнала, чтобы к ним можно было применять всякую разную математику в дальнейшем.
Прилагаю VI.

Re: Помогите синхронизировать VISA

Добавлено: 05 ноя 2017, 21:03
Alcamo
Когда я нажимаю 'Simulate acquision timing' в блоке симуляции синуса, то синус показывается в реальном времени, а данные с VISA вообще не идут. Но если я переключу в блоке на Run as fast as possible, то данные с VISA идут нормально, а синус очень быстро пролетает. Что мне с этим делать?

Re: Помогите синхронизировать VISA

Добавлено: 08 ноя 2017, 20:59
bartex
Alcamo
Что мне с этим делать?
Попробуйте поменять настройки в блоке симуляции синуса.
Во всяком случае, у меня заработало, правда я вместо энкодера
на 2 и 3 ногу Ардуино вешал кнопки :think:

Re: Помогите синхронизировать VISA

Добавлено: 08 ноя 2017, 21:59
Alex Dem
Alcamo, попробуйте организовать чтение из порта, как в примере.

Re: Помогите синхронизировать VISA

Добавлено: 10 ноя 2017, 00:15
Borjomy_1
Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!

Re: Помогите синхронизировать VISA

Добавлено: 10 ноя 2017, 01:39
Blackman
Borjomy_1 писал(а):Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!
Пусть в порт принято 8 байт SOS\nHELP :help:
1. Проверяем BytesAtPort=8
2. Функция чтения 8-ми байтов возвращает 4 байта SOS\n
3. Проверяем BytesAtPort=4
4. Функция чтения 4-х байт возвращает 4 байта HELP
5. Проверяем BytesAtPort=0
6. Функция чтения 0 байт возвращает 0 байтов - пустая строка и т.д.
И где здесь "криминал"? :wink:

Re: Помогите синхронизировать VISA

Добавлено: 10 ноя 2017, 07:03
Vitekkz88
"Всё зависит от задачи и требований!" - универсальное заклинание на случай важных переговоров :crazy:

Re: Помогите синхронизировать VISA

Добавлено: 10 ноя 2017, 07:42
dadreamer
Я в новых проектах перестал использовать Bytes At Port. Но иногда возникают другие "грабли" - если таймаут операций чтения-записи делать меньше 300 мс, начинают теряться символы в пакетах. Хотя на 9600 должно всё стабильно доходить. Такое даже с дублирующей сессией. А с Bytes At Port такого почему-то не происходит.

Кстати, ТС решил уже свою проблему - перешёл на LIFA. В личке написал.

Re: Помогите синхронизировать VISA

Добавлено: 11 ноя 2017, 00:22
bartex
Сейчас ради любопытства сравнил частоты обмена данными (LoopRate) для LINX и VISA при работе с Ардуино UNO (с генератором синусоиды внутри цикла - чтобы из темы не выпасть)

LINX при опросе 2 каналов - примерно 165 Гц
VISA при совместной работе со скетчем из начала темы - примерно 320 Гц
Эх, было бы у LINX хотя бы 1000 Гц, цены бы ей не было :)

Re: Помогите синхронизировать VISA

Добавлено: 11 ноя 2017, 13:50
Borjomy_1
В драйвере порта установите размер фифо буфера на прием равный 1, а не 16, как по умолчанию. Это уменьшает задержки обмена.

Re: Помогите синхронизировать VISA

Добавлено: 11 ноя 2017, 13:54
Borjomy_1
Blackman писал(а):
Borjomy_1 писал(а):Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!
Пусть в порт принято 8 байт SOS\nHELP :help:
1. Проверяем BytesAtPort=8
2. Функция чтения 8-ми байтов возвращает 4 байта SOS\n
3. Проверяем BytesAtPort=4
4. Функция чтения 4-х байт возвращает 4 байта HELP
5. Проверяем BytesAtPort=0
6. Функция чтения 0 байт возвращает 0 байтов - пустая строка и т.д.
И где здесь "криминал"? :wink:
Криминал в том, что нет никакой гарантии, что в момент опроса bytes at Port придет вся посылка.
Не надо путать теплое с мягким. Если протокол с терминальным символом, то никакого bytes at Port. Если протокол допускает и без терминального, то программисту надо отрывать руки. Хрень на придумывают, а потом героически борятся.