Подключение фотоэлектрических инкрементальных энкодеров

Тема в разделе "Arduino & Shields", создана пользователем Saimong, 13 апр 2018.

  1. Saimong

    Saimong Нуб

    Аргументируйте почему и в каких ситуациях может возникнуть что то не предсказуемое, энкодеры могут вращаться в разные стороны и абсолютно не зависят друг от друга, код работает надежно, по крайней мере пока.
     
  2. Saimong

    Saimong Нуб

    И в каких это некоторых ситуациях?)))
     
  3. a1000

    a1000 Гуру

    В Си не возможно обращаться к каждой лапке отдельно. Можно управлять только всем портом сразу. Для текущей задачи как раз подходит идеально. В порту 8 лапок, нам нужно считывать 4 энкодера по 2 выхода в каждом. Как раз помещаются в один порт, к примеру порт В. Командой PINB считываем состояние всех лапок порта одновременно. Ну а дальше как вы и предлагали - сравнение по маске.
    А то, что в Abduino IDE это Wiring.
     
  4. mcureenab

    mcureenab Гуру

    Это не аргумент. )))
    1. На переменных нет модификатора volatile. Поведение не определено.
    2. Обращение к переменным не защищено мутексом. Тут можно просто запретить прерывания на время обращения к счётчикам.
    3. Что будет когда один счётчик переполнится?
     
    Последнее редактирование: 14 апр 2018
    Saimong нравится это.
  5. mcureenab

    mcureenab Гуру

    Теперь по датчику.
    [​IMG]

    Если датчик будет двигаться туда-сюда менее чем на полпериода от положения 1, скетч будет думать что он вращается.
     
    Последнее редактирование: 14 апр 2018
    Saimong нравится это.
  6. Saimong

    Saimong Нуб

    1.По поводу первого пункта не знаю нужно ли это, может вы и правы.2. Прерывания работают стабильно и счетчик на них не влияет, по крайней мере я этого у себя не наблюдаю. 3. Если счетчик переполнится то угол отрицательный станет, но мне не принципиально, так как три энкодера у меня крутятся всего на +- 10 градусов и поэтому переполнение счетчика на них ни как не повлияет, а четвертый энкодер использует нулевую метку для определения числа оборотов и ему тоже не важно, что счетчик переполнится, все равно число оборотов дает верно. Вообщем энкодеры я подключил, как мне нужно, всем спасибо за советы!!! Теперь мне нужно подключить еще два промышленных инклинометра RS 232 и тогда можно будет собирать коробочку, но я так понимаю, чтобы получить данные с инклинометра мне понадобится переходник RS 232 -TTl? И есть ли у кого опыт работы с такими приблудами?? Инклинометр NS-5/P2
     

    Вложения:

  7. mcureenab

    mcureenab Гуру

    1. Я прав. Должно быть

    Код (C++):
      volatile unsigned int A(0), B(0), C(0),D(0);
    2. Переменные A, B, C D типа int. Тип int это 2 байта. Чтобы выполнить вычисления МК должен загрузить значение переменной A в регистр АЛУ. Память он умеет читать только побайтно командой LD один байт. Загрузка A потребует выполнения двух команд LD. Если между этими командами произойдет прерывание и инкремент A, в регистр загрузятся несогласованные данные. Это непредсказуемое поведение. Тесты могут лишь случайно напороться на этот баг. Тут требуется формальное доказательство правильности.
    Должно быть:

    Код (C++):
        noInterrupts();
        int grA=A-B;
        int grC=C-D;
        interrupts();
     
    Что обеспечит согласованное чтение переменые A, B, C, D.
     
    Saimong нравится это.
  8. mcureenab

    mcureenab Гуру

    Переходник типа такого:

    https://ru.aliexpress.com/item/MAX3...LDbRFl2CahPJcEFtQVMaAvn-EALw_wcB&gclsrc=aw.ds

    через Serial отправлять команды в датчик, читать данные, парсить текстовый поток, вычисления выполнять.

    От инклинометра что требуется?
     
    Saimong нравится это.
  9. mcureenab

    mcureenab Гуру

    И при таком раскладе лучше использовать Arduino Leonardo. У нее два Serial устройства - Serial для USB и Serial1 для пинов 0 и 1.

     
    Последнее редактирование: 14 апр 2018
    Saimong нравится это.
  10. parovoZZ

    parovoZZ Гуру

    А где-то можно отдельно?
     
  11. mcureenab

    mcureenab Гуру

    Код (C++):
        cbi $12, 7 ; Clear bit 7 in Port D
     
  12. parovoZZ

    parovoZZ Гуру

    А установить как?
     
  13. mcureenab

    mcureenab Гуру

    Такого примера нет (((

    Код (C++):
       sbi $1C,0 ; Set read bit in EECR
     
  14. Saimong

    Saimong Нуб

    Согласен, я вообще решил Arduino Mega приобрести, так как похоже, что еще и пару дальномеров понадобится и модуль флеш памяти и вай фай модуль и мало ли еще что)))
     
  15. Saimong

    Saimong Нуб

    Наклон по двум осям в градусах, но судя по их спецификациях он и должен сразу выдавать наклон в градусах, так что главное подключить и разобраться что где. Ладно, заказываем деталюшки и будем ждать...