ЛИР-МА237А

Модератор: Денис Кашин

Ответить
Spurius
Сообщения: 3
Зарегистрирован: 08 фев 2017, 09:09

ЛИР-МА237А

Сообщение Spurius »

Здравствуйте, форумчане!
Не получается подключить к абсолютному энкодеру ЛИР-МА237А ArduinoMega2560, чтобы снимать с датчика показания улга, но результатов никаких.
Схема подключения эта - http://www.megasensor.com/ugol-povorota ... erfejs-SSI
Последний скетч:

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

#include <SoftwareSerial.h>
const int CLOCK_PIN = 11; // к пину 11 подключаем CLK
const int DATA_PIN = 10;  //  к пину 10 подключаем DO data
unsigned long sample1;
int Array[12];
int ArrayBin[]={1,2,4,8,16,32,64,128,256,512,1024,2048};

void setup() 
{
  int i = 0;
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  
  Serial.begin(19200);
}
 
void loop() 
{
  unsigned long reading = readPosition();
  Serial.print("Reading: ");
  Serial.println(reading, DEC);

  delay(1000);
}

int readPosition() 
{
  int i,x,data;
  digitalWrite(CLOCK_PIN,HIGH);
  delayMicroseconds(30);
  for (i=0;i<12;++i)
  {
    digitalWrite(CLOCK_PIN,HIGH);
    delayMicroseconds(5);
    digitalWrite(CLOCK_PIN,LOW);
    delayMicroseconds(5);
    Array[i] = shiftIn(DATA_PIN,CLOCK_PIN,MSBFIRST);
  }
  data=0;
  for(i=0;i<12;i++)
  {
    x=Array[i];
    data=data+x;
  }
  return data;
}
Результата никакого, кто нибудь скажите, проблема в коде или в схеме?
Денис Кашин
СКБИС
СКБИС
Сообщения: 460
Зарегистрирован: 13 фев 2008, 14:38
Контактная информация:

Re: ЛИР-МА237А

Сообщение Денис Кашин »

Здравтсвуйте,

С первого взгляда, программа избыточна, создаётся большой массив там, где он не нужен.
непонятна работа функции shiftIn(DATA_PIN,CLOCK_PIN,MSBFIRST); судя по её описанию, она всё сама делает - генерирует сигналы CLOCK и опрашивает DATA. И считывает 8 бит.

На мой взгляд, код для ардуины должен быть такой:

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

int readPosition()
{
  int result;//16 bit

  digitalWrite(CLOCK_PIN,HIGH);//default state
 
 result = shiftIn(DATA_PIN,CLOCK_PIN,MSBFIRST) <<8;//read first 8 bits
 result |= shiftIn(DATA_PIN,CLOCK_PIN,MSBFIRST) ;//add last 8 bits (need 4)
 result = result >>4; //shift 4 bits right, result 12 bits

  digitalWrite(CLOCK_PIN,HIGH);//default state
 delayMicroseconds(50);//time-out ssi

  return result;
}




Вот код на С, который работает и возвращает позицию от 1 до 32 бит. Количество бит задаётся в параметрах функции.
Естественно, функции установки CLK CLK_set(); и CLK_clr(); и чтения бита данных DATA_read() необходимо определить или заменить.

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

static uint32_t get (uint8_t bits)
{
 uint32_t pos=0;
 
 CLK_set();

  for (uint8 bit=bits; bit>0; bit--)
 {
     CLK_clr ();
   
    CLK_set ();
   
    pos=pos<<1;
    pos |= DATA_read();
    
 }
   
   CLK_clr ();
   
   CLK_set ();


   my_delay(350);//50 us

 return pos; 
}
Spurius
Сообщения: 3
Зарегистрирован: 08 фев 2017, 09:09

Re: ЛИР-МА237А

Сообщение Spurius »

Интересное совпадение, меня как раз зовут Андрей Кашин :)
В общем перебробовал кучу скетчей, результат - постоянная единица с выхода энкодера.
В С не очень хорошо разбираюсь, пока только учусь. Где то прочитал, что такая проблема возникает из за неправильного подключения энкодера, в схеме пробовал менять clock/clock_Inv и data/data_Inv местами, думал полярность перепутал.
Если чем то поможет, могу прикрепить фото подключения -
https://pp.vk.me/c638819/v638819061/249 ... Dk4su4.jpg и https://pp.vk.me/c638819/v638819061/249 ... awu0u0.jpg
Прошу не ругаться, что все сделано криво и некрасив, делалось все в спешке. Куда дальше копать пока не знаю, уже начинаю думать "то ли лыжи не едут, то ли я...".
Последний код -

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

const int CLOCK_PIN = 5;
const int DATA_PIN = 6;

void setup() 
{
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  digitalWrite(CLOCK_PIN, HIGH);
  Serial.begin(19200);
}

void loop() 
{  
  int byteR = 0;
  digitalWrite(CLOCK_PIN,HIGH);//default state
  delay(3);
  digitalWrite(CLOCK_PIN,LOW);
  
  for (int i=11;i>=0;i--)
  {
    digitalWrite(CLOCK_PIN, HIGH);
    delayMicroseconds(3);
    if (digitalRead(DATA_PIN)) bitSet(byteR, i);
    digitalWrite(CLOCK_PIN, LOW);
    delayMicroseconds(3);
  }
  
  digitalWrite(CLOCK_PIN,HIGH);//default state
  delay(5);//time-out ssi

  Serial.print("Reading: ");
  Serial.println(byteR,BIN);
  
  delay(100);
}
Денис Кашин
СКБИС
СКБИС
Сообщения: 460
Зарегистрирован: 13 фев 2008, 14:38
Контактная информация:

Re: ЛИР-МА237А

Сообщение Денис Кашин »

Лучше всего ткнуться осциллографом и посмотреть, приходят ли сигналы на датчик и что он выдаёт в ответ.
Spurius
Сообщения: 3
Зарегистрирован: 08 фев 2017, 09:09

Re: ЛИР-МА237А

Сообщение Spurius »

Спасибо за советы, разобрался.
Думаю, тему можно закрывать.
Ответить