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

Показания Энкодеров... протокол SSL

Добавлено: 01 мар 2017, 09:01
Skorp
Прошу разрешить вопрос....
было куплено (для пробы) несколько энкодеров
подключил пока 2 из них
1. ЛИЗ-ДА136А 10-05-RS-3-2
2. ЛИР-ДА158А 10-05-RS-3-2
3. ЛИР-ДА119А 10-05-RS-3-2 ---намного реже но тоже есть
подключаю к ардуино с самописным протоколом SSL. подключал через преобразователь RS-422 и по упрощенной схеме, показания одни и теже!!!!!!


[SPOILER="BIN | DEC | градус"]

Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1 | 1 | 0.35
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1100 | 12 | 4.22
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 1111 | 15 | 5.27
Reading: 0 | 0 | 0.00
Reading: 1111 | 15 | 5.27


Reading: 1100100110 | 806 | 283.36
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100101100 | 812 | 285.47
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100100000 | 800 | 281.25
Reading: 1100101100 | 812 | 285.47
Reading: 1100100000 | 800 | 281.25

Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 10001111 | 143 | 50.27
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111000 | 248 | 87.19
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30
Reading: 11111110 | 254 | 89.30


Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 1111100 | 124 | 43.59
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 1111100 | 124 | 43.59
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 1111100 | 124 | 43.59
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73
Reading: 111110001 | 497 | 174.73


Reading: 110010 | 50 | 17.58
Reading: 110010 | 50 | 17.58
Reading: 110010 | 50 | 17.58
Reading: 100000 | 32 | 11.25
Reading: 110010 | 50 | 17.58
Reading: 110010 | 50 | 17.58
Reading: 110010 | 50 | 17.58
Reading: 100000 | 32 | 11.25
Reading: 110010 | 50 | 17.58
Reading: 110010 | 50 | 17.58


[/SPOILER]

показания при том когда энкодер лежит и его не кто не трогает, показания прыгают

ЭТО НОРМАНО????

схемы, ошибок в коде.... не нужно, китайские энкодеры работают (которые также были приобретены для теста) работают без таких провалов, причем они 12 битные.

Re: Показания Энкодеров... протокол SSL

Добавлено: 01 мар 2017, 11:47
Денис Кашин
Здравствуйте,
Конечно, таких скачков быть не должно. Максимум показания будут меняться на 1 бит, если энкодер не трогать.
Возможно, у вас проблемы с тайм-аутом SSI. Расстояние между соседними импульсами Clock не должно превышать 11 мкс. Между окончанием запроса и началом следующего необходимо выждать не менее 35 мкс.
Если у вас возникает ситуация, что датчик определяет тайм-аут, он начнёт передачу позиции заново.

Конечно, проще всего подключить осциллограф или логический анализатор (например, saleae) и показать нам графики.

Re: Показания Энкодеров... протокол SSL

Добавлено: 03 мар 2017, 10:10
Skorp
тайм-аут между запросами делал 100 и более мкс... с этим все хорошо
пробовал считывать по 2 раза (с так называемой проверкой) 1(старт)+10 (данные) +10 (данные1) сигнал CLOCK... данные 1 не всегда =данным. задержка с сигнале CLOCK менее 11 мкс... пример кода

for (int i = 0; i < bit_count; i++) { //Генерирует bit_count импульсов на CLK энкодера
data <<= 1;
digitalWrite(CLOCK_PIN, LOW);
//delayMicroseconds(3);
digitalWrite(CLOCK_PIN, HIGH);
//delayMicroseconds(3);
data |= digitalRead(DATA_PIN);
}

осциллограф есть, сигналы с каких линий вам прислать?

Re: Показания Энкодеров... протокол SSL

Добавлено: 03 мар 2017, 12:07
Денис Кашин
Здравствуйте,
нам нужны сигналы с линий Clock и Data, можно ещё дополнительно видео записать с осциллограммами в момент скачка показаний.

Re: Показания Энкодеров... протокол SSL

Добавлено: 06 мар 2017, 09:26
Skorp
вот фото и видео https://yadi.sk/d/H8jQID9Q3F767t
считывание 2 раза подряд (с проверкой)

синий CLOCK
желтый DATA (заваленные фронты --- не откалиброванный щуп, просто провода ми присоединил)
на все фото это ошибка считывания... (энкодер лежит на столе, его не кто не трогает), когда считывается без ошибки показания осциллографа одинаковы (не выкладывал)

код для считывания показания

void loop() {
unsigned long reading = readPosition();
f = float(reading) / 1024.0 * 360.0;
delay(10);
Serial.print("Reading: ");
Serial.print(reading, BIN);
Serial.print( " | ");
Serial.print(reading, DEC);
Serial.print( " | ");
Serial.println(f, 2);
delay(500);
}

//read the current angular position
int readPosition() {
// Read the same position data twice to check for errors
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 10);
unsigned long sample2 = shiftIn(DATA_PIN, CLOCK_PIN, 10);

delayMicroseconds(13); // Clock mus be high for 20 microseconds before a new sample can be taken

if (sample1 != sample2) {
Serial.print("Samples dont match: sample1=");
Serial.print(sample1);
Serial.print(", sample2=");
Serial.println(sample2);
}

return sample1;
}

//read in a byte of data from the digital input of the board.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) {
unsigned long data = 0;

for (int i = 0; i < bit_count; i++) { //Генерирует bit_count импульсов на CLK энкодера
data <<= 1;

digitalWrite(CLOCK_PIN, LOW);
//delayMicroseconds(3);
digitalWrite(CLOCK_PIN, HIGH);
//delayMicroseconds(3);

data |= digitalRead(DATA_PIN);
}
return data;
}

Где я накосячил? и как с этим бороться

Re: Показания Энкодеров... протокол SSL

Добавлено: 06 мар 2017, 14:55
Денис Кашин
1. На осциллографе линия DATA находится в инверсном состоянии. Еслт нет запроса, линия данных должна быть в "1".
2. Очень низкая частота опроса: линия Clock с периодом 10-20 мкс, с рекомендованным значением менее 12 мкс. При двойном чтении ждать не нужно, а у вас задержка 50 мкс. По этому датчик не повторяет позицию, а возвращает новую.
3. В первый раз надо считывать на 1 импульс больше (11 бит), так как датчик выдаёт первым битом "1"; при повторном чтении считываются 10 бит. То есть надо подать 21 импульс Clock, с периодом менее 12 мкс.

Re: Показания Энкодеров... протокол SSL

Добавлено: 07 мар 2017, 00:08
Skorp
1. Ок. Поменяю. Но это не особа отразится на результатах. Данные будут просто не в инверсном виде... Исправлю.
2. Задержка в 50 мс, не искусственная задержка а вот такая скорость. Вызова 2 раз подряд функций считывания. Насчёт 10-20 мс ппеределаю считывание, не стандартными средствами ардуино, а напрямую чтение с порта.
3. Про это я знаю.... 1 раз было правильно, в этот не тот провод сунул в дата... Испралюсь. Надеюсь поможет. Завтра отпишусь. Спасибо

Re: Показания Энкодеров... протокол SSL

Добавлено: 07 мар 2017, 13:54
Skorp
удалось разогнать ардуину на 16 Мгц до дерганьем ногой в 334 КГц прямым чтением/записью в порт
//################
//Энкодер поворота
#define DAT (PINB & (1<<PB4)) // Data PB4
#define CLK_On PORTB = 1<<PB6 // Clock PB6
#define CLK_Off PORTB = 0<<PB6


#define CLOCK_PIN PB6 // PB4 // к пину 12 подключаем CLK
#define DATA_PIN PB4 // PB4 // к пину 10 подключаем DO data
//################


//read in a byte of data from the digital input of the board.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) {
unsigned long data = 0;

CLK_Off;
delayMicroseconds(2);
CLK_On;
delayMicroseconds(2);

for (int i = 0; i < bit_count; i++) { //Генерирует bit_count импульсов на CLK энкодера
data <<= 1;
CLK_Off;
delayMicroseconds(2);
CLK_On;
delayMicroseconds(2);

if (!DAT) {data |= !DAT ;}
}
return data;
}

работает..... мож к0му пригодиться