Показано с 1 по 5 из 5
  1. #1
    Продвинутый
    Регистрация
    20.12.2011
    Сообщений
    336
    Вес репутации
    227

    По умолчанию Подключение 12ти разрядного энкодера SSI к ардуино

    Проштудировал
    http://www.megasensor.com/ugol-povor...-protokola-SSI
    http://absolutsensor.ru/catalog/222/259/260/867

    Описание протокола обмена SSI-интерфейса
    В режиме ожидания, т.е. когда энкодер не опрашивается, сигнал на проводе "Clock+" (относительно "Clock+") положительный (High). С первым спадом сигнала с High на Low данные в датчике "замораживаются", т.е. энкодер подготавливается к передаче. С последующим фронтом сигнала (с Low на High) начинается передача данных, причем старшим битом (разрядом) вперед. Для надежного приема информации (учитывая емкостные задержки в линии связи) желательно, чтобы мастер (процессор) считывал бит с последующим спадом сигнала с High на Low. Таким образом, последовательность действий мастера следующая (на примере приема первых двух бит информации):

    1. на провод "Clock+" подать уровень Low.
    2. задержка // для обеспечения необходимой частоты такта (100kHz-1mHz).
    3. на провод "Clock+" подать уровень High.
    3. задержка //
    4. на провод "Clock+" подать уровень Low.
    5. опросить провод Data (Low или High?), записать первый бит информации.
    6. задержка //
    7. на провод "Clock+" подать уровень High.
    8. задержка //
    9. на провод "Clock+" подать уровень Low.
    10. опросить провод Data (Low или High?), записать второй бит информации.
    и т.д. начиная с пункта 6.

    Для опроса сенсора мастеру необходимо генерировать тактов на один больше чем разрешение датчика, т.е. для случая разрешения энкодера 24 бита надо подать 24+1 = 25 тактов.
    Тактовая частота может составлять 100кгц - 1мгц. Время между тактовыми посылками должна составлять более 15мкс. После последнего переданного бита датчик передает Low-сигнал в течении около 15мкс, что для мастера может означать конец передачи данных. Таким образом, следующая тактовая посылка от мастера должна прийти по истечении этого (15мкс) времени. Если такт придет раньше, то датчик начнет повторять передачу данных с самого начала, т.е. старые, не актуализированные данные. Таким образом, можно использовать этот режим (передавая, например, 24+1 тактов вместо 12+1) для контроля достоверности переданных данных, сравнивая принятые данные между собой. Лишь по истечении 15мкс данные внутри датчика (в выходных сдвиговых регистрах) актуализируются.
    Для связи мастера с датчиком на большом расстоянии и/или в условиях больших помех необходимо использовать Line Driver, например, типа 65176.
    Перекодировка с Gray-code в Binary может осуществлятся, например, с помощью логических элементов "исключающее или"


    и решил попробовать подключить энкодер MCD-S101B-1212 к ардуино - даташит к нему http://www.rentamatic.ru/ms/posital/...ataContent.pdf.

    Подал питание на энкодер порядка 15В (он работает от 10 до 30В).
    Выходы CLK+ и Data+ подключил к ардуино, остальные выводы не подключал.
    Написал такой скетч для пробы:
    Код:
    void setup() 
    {
    pinMode(6, INPUT); //sdata+
    pinMode(5, OUTPUT); //CLOCK+
     Serial.begin(115200);
    digitalWrite(5,HIGH);
    }
    
    boolean b=0;
    int i=0;
    
    void loop() 
    {
      if (i==0)
      {
          delayMicroseconds(25); 
      digitalWrite(5,LOW);
      delayMicroseconds(25);
      digitalWrite(5,HIGH);
      delayMicroseconds(25);  
       digitalWrite(5,LOW);
      
      }
      
      while (i<=12)
      {
        delayMicroseconds(25); 
        b=digitalRead(6);
        Serial.print(b);  
        digitalWrite(5,HIGH);
      delayMicroseconds(25);
         digitalWrite(5,LOW);
      i++;
      }
      
      if (i>12){Serial.println();i=0;}
    
    }
    Через серийный монитор выводится информация в виде разрядов, как ни кручу энкодер выводится только:
    111111111111

    т.е. 12 разрядов по 1.

    Если отключить питание от датчика выводятся нули.

    Что я сделал не верно?
    Последний раз редактировалось kadushkin; 11.03.2016 в 21:38.

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Подключение 12ти разрядного энкодера SSI к ардуино

    Сколько времени уйдет на следующий цикл?
    while (i<=12)
    { delayMicroseconds(25); b=digitalRead(6); Serial.print(b); digitalWrite(5,HIGH); delayMicroseconds(25); digitalWrite(5,LOW); i++; }
    Я бы подсчитал время выполнения цикла с помощью micros() и сделал бы delayMicroseconds(25-n) после этого цикла
    Последний раз редактировалось Chip; 12.03.2016 в 14:35.

  3. #3
    Продвинутый
    Регистрация
    20.12.2011
    Сообщений
    336
    Вес репутации
    227

    По умолчанию Re: Подключение 12ти разрядного энкодера SSI к ардуино

    Да, ерунда у меня получилась.
    Весь цикл 1600мкс, стало быть между импульсами 120-130мкс, а частота генерации импульсов нужна минимум 100кГц, что соответствует 10мкс.
    Как быть? Есть возможность генерации импульсов с такой частотой? таймер, ШИМ или что-то еще?

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Подключение 12ти разрядного энкодера SSI к ардуино

    убери Serial.print и все должно получится

  5. #5
    Продвинутый
    Регистрация
    20.12.2011
    Сообщений
    336
    Вес репутации
    227

    По умолчанию Re: Подключение 12ти разрядного энкодера SSI к ардуино

    Подключил светодиоды 8шт. на часть разрядов - все горят.
    При вращении энкодера не гаснет ни один.

    Код:
    boolean b=0;
    int i=0;
    
    void setup() 
    {
    pinMode(20, INPUT); //sdata
    pinMode(5, OUTPUT); //CLOCK
    
    pinMode(22, OUTPUT); 
    pinMode(23, OUTPUT); 
    pinMode(24, OUTPUT); 
    pinMode(25, OUTPUT); 
    pinMode(46, OUTPUT); 
    pinMode(47, OUTPUT); 
    pinMode(48, OUTPUT); 
    pinMode(49, OUTPUT); 
    
    }
    
    
    
    void loop() 
    {
    
    
      if (i==0)
      {
      digitalWrite(5,LOW);
      delayMicroseconds(3);
      digitalWrite(5,HIGH);
    delayMicroseconds(3); 
      }
    
    
    if (i<=13)
    {
    digitalWrite(5,LOW);  
    delayMicroseconds(3); 
    b= digitalRead(20);
    if (i==1){digitalWrite(22,b);}
    if (i==2){digitalWrite(23,b);}
    if (i==3){digitalWrite(24,b);}
    if (i==4){digitalWrite(25,b);}
    if (i==5){digitalWrite(46,b);}
    if (i==6){digitalWrite(47,b);}
    if (i==7){digitalWrite(48,b);}
    if (i==8){digitalWrite(49,b);}
    digitalWrite(5,HIGH);
    delayMicroseconds(3); 
    
    }
      
    
    
    if (i>13)
    {
    i=-1;
    digitalWrite(5,LOW);  
    delayMicroseconds(3); 
      digitalWrite(5,HIGH);
    delayMicroseconds(10);
    
    }
    i++;
    }
    Последний раз редактировалось kadushkin; 13.03.2016 в 22:17.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •