ssi интерфейс

aleksyum
Offline
Зарегистрирован: 27.04.2014

Требуется прочитать данные с абсолютного энкодера по интерфейсу SSI.C опросом датчика все понятно: в такте подаем LOW, получаем бит и так до 8 разряда. Вопрос в том, как получить в итоге переменную типа int на выходе с датчика? Что делать с этим байтом?

MoneyJinn
Offline
Зарегистрирован: 04.11.2015
Royek
Offline
Зарегистрирован: 09.10.2016

Добрый день.

По запросу в гугле arduino ssi энкодер, выдает скудную инфорацию. Русскоязычный ресурс только этот.

Тот скетч что описан выше, не заработал на абсолютном энкодере HAE18U5V12A0.5

Немного переделал этот скетч.  Получилось устнавить связь и получить точное положение энкодера.

Прошу сильно не бить )), ибо язык си вообще не знаю, ардуино только неделю назад пришел, "мелкий пакет из Китая". Если кто то найдет ошибки в коде, или знает как существующий код оптимизировать, (типа использовать шим и таймеры для создания управляющего сигнала), то буду благодарен за подсказки. Всем добра. )))

const int CLOCK_PIN = 11; // к пину 11 подключаем CLK
const int DATA_PIN = 10;  //  к пину 10 подключаем DO data
const int BIT_COUNT = 9;  // к пину 9 подключаем CS сигнал окончания посылки
unsigned long sample1;

void setup() {
  //setup our pins
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(BIT_COUNT, OUTPUT);

  //give some default values
  digitalWrite(CLOCK_PIN, HIGH);
 digitalWrite(BIT_COUNT, LOW);
  Serial.begin(19200);
}


void loop() {
  unsigned long reading = readPosition();

  Serial.print("Reading: ");
  Serial.println(reading, DEC);

  delay(1000);
}

//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, 13);
  unsigned long sample2 = shiftIn(DATA_PIN, CLOCK_PIN, 13);

  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<12; i++) { //Генерирует 13 импульсов на CLK энкодера
    data <<= 1;
    digitalWrite(CLOCK_PIN, LOW);
    delayMicroseconds(1);
    digitalWrite(CLOCK_PIN, HIGH);
    delayMicroseconds(1);

    data |= digitalRead(DATA_PIN);
 }
  {
digitalWrite(BIT_COUNT, HIGH); //  CS это сигнал окончания передачи на энкодер
    delayMicroseconds(2);
    digitalWrite(BIT_COUNT, LOW);
    delayMicroseconds(3);
}
  return data;
}

 

MoneyJinn
Offline
Зарегистрирован: 04.11.2015
Royek
Offline
Зарегистрирован: 09.10.2016

Про скорость: - На сайте производителя вроде пишут 3600rpm mechanical sustain load.

Про подключение: - На том же рессурсе приобрел сильфонные муфты.

Этот энкодер "в деле" пока не проверял. Сегодня только добился внятных от него показаний. Плюс еще жду мелкий пакет из Китая модуль RS485 для Аrduino. Потом буду думать как подключить это добро к существующему частотнику и асинхронному двигателю, что бы управлять вектором полноценно с обратной связью, и знать точное положение вала эл.двигателя.

merelink
Offline
Зарегистрирован: 28.12.2016

Спасибо что поделились - очень пригодилось

Royek
Offline
Зарегистрирован: 09.10.2016

merelink пишет:

Спасибо что поделились - очень пригодилось

 

Интересно было бы узнать как пригодилось? Поделитесь пожалуйста, как получилось практически это использовать.

Open_Bridge
Offline
Зарегистрирован: 01.07.2017

Royek пишет:
Про скорость: - На сайте производителя вроде пишут 3600rpm mechanical sustain load.

Ссылка битая и вообще-то энкодеры с датчиком Холла (hall-rotary-encoder-hae18.html) инкрементные, а не абсолютные.  При скорости 3600  rpm какой гарантируется ресурс для этого энкодера, те как скоро "отслужат свое" подшипники ?

Royek
Offline
Зарегистрирован: 09.10.2016

До тестирования в работе так и не дошло. Но при отключении и выключении питания показания сохраняются. Если выключить и провернуть потом включить то показания меняются. Так например сделал примерно метку где 0 и на первый взгляд работает именно как абсолютный датчик. Смотрел на осциллографе сигнал он похож больше на пилу чем на квадратичный, но диапазон всегда разный. То есть сам сигнал 2,5В но перемещается в диапазоне 0 - 5В. В нулевой точке как бы сбрасывается. То есть этот сигнал начинается от 5-до 2,5В постепенно опускается до 2,5 -0В. в нулевой резко на 5В в исходное на 5В. Таким образом достигается абсолютные значения. Ибо в обороте нет одинаковых значений. Думаю если использовать как мастер энкодер на главном валу самое то.

Royek
Offline
Зарегистрирован: 09.10.2016
Royek
Offline
Зарегистрирован: 09.10.2016

Open_Bridge пишет:
у него есть еще SPI

Вы правы.

SPI энкодеры бывают.

Если в заказном коде на 5 позиции будет стоять 14.

Open_Bridge
Offline
Зарегистрирован: 01.07.2017
merelink
Offline
Зарегистрирован: 28.12.2016

Добрый, всем, день.

пригодилось так:

работаю инженером АСУТП и имеется агрегат с набором датчиков передающих положение исполнительных механизмов по ССИ. работает он в весьма жестких условиях и как результат постоянно пропадают на ХМИ какието из датчиков, вот тут то апаратик на базе дуины и пригождается. Питание датчика 3 кроны,  разъемчик и дуина в одном корпусе. Цаплемся к датчику считываем показания - норма, или датчик под замену, если в норме цапляемся к проводу и передаем нужные нам циферки смотрим что показывает ХМИ. при необходимости прозваниваем и чиним или меняем линию.

Но Сейчас я на другом уже участке.

mskmsk
Offline
Зарегистрирован: 05.06.2018

Подскижите, корпус энкодера из какого материала сделан?

Интересует, на каком расстоянии от энкодера есть влияние на показания магнитного компаса?

Royek
Offline
Зарегистрирован: 09.10.2016

Точно не могу сказать.

Похоже на алюминвый сплав.

mskmsk
Offline
Зарегистрирован: 05.06.2018

Спасибо.

А есть возможность проверить как он на обычный магнитный компас влияет?

Конструктивно необходимо разместить примерно в 10см. Неодимовый магнит 6мм в диаметре дает сильные наводки, хотелось бы знать как тут будет...