Вопрос по энкодеры и подсчету оборотов

Тема в разделе "Arduino & Shields", создана пользователем ДмитрийД, 8 июн 2015.

  1. ДмитрийД

    ДмитрийД Нерд

    Добрый день.
    Есть задача - считать обороты бесколлекторного мотора. Обороты до 3,5 тыс.
    В наличии имею энкодер магнитный AS5048A , подключенный по SPI.
    Но толи в коде косячу, толи этот энкодер не может считать столько

    Общий смысл как я считаю :
    0) в переменную angle считываю угол в текущий момент времени
    1) переменная ug, в которую считаю насколько повернулся мотор
    2)переменная ob делаю +1 как только ug стал больше 360.
    Но на маленьких оборотах все ок, чуть даешь выше, сразу не успевает считать, недосчитывает

    Код (Text):
    if (ug>360) {ug=0; ob=ob+1}
    angle = получаю угол;
    delay(10);
    angle2 = получаю новый угол;
    razn=angle2-angle;
    ug=ug+razn;
    Serial.println(ob);
    Вопрос - может я в корне неправильно мыслю и обороты нужно считать по другому?
    или не подходит датчик?

    Смотрел еще на такой http://amperka.ru/product/miniq-wheel-encoder , и сделать на мотор диск с прорезями
    Но тоже смущает что на быстрых оборотах на входе будет тупо ноль или единица
    Или мб есть быстрые оптические датчики?
     
  2. Unixon

    Unixon Оракул Модератор

    А попробуйте ка измерять без Serial.println() в главном цикле.
     
    iglooshtosser нравится это.
  3. ДмитрийД

    ДмитрийД Нерд

    а как тогда правильно сделать? вывести в монитор показания ведь надо, чтобы сравнить факт с реальностью
     
  4. Unixon

    Unixon Оракул Модератор

    Запоминайте по ходу в буфере, потом как забили показаниями буфер - вывели, потом все по новой.
     
  5. ДмитрийД

    ДмитрийД Нерд

  6. Unixon

    Unixon Оракул Модератор

    Да даже без этого Serial.print не очень то быстро выполняется. Не нужно отладкой мешать процессу измерения.
     
  7. DrProg

    DrProg Вечный нерд

    Щелевой оптодатчик не справится с такой задачей?
     
  8. ДмитрийД

    ДмитрийД Нерд

    Вот и я думаю , справится или нет?)))
    Хотя решение с магнитных энкодером мне нравится больше
     
  9. DrProg

    DrProg Вечный нерд

    Магнитный наверное не успевает размагнититься при таких оборотах или намагнититься. )
    Попробуйте с щелевым, мне кажется он быстрее.
     
  10. Unixon

    Unixon Оракул Модератор

    Издеваетесь? Кто в датчики ферромагнетик будет ставить?:)
    По даташиту частота отсчетов этого датчика 11~12кГц.
     
  11. Unixon

    Unixon Оракул Модератор

    3500rpm это 58.3(3)Гц, при 12кГц дискретизации датчик должен эту центрифугу с точностью 1.75 градуса.
     
  12. DrProg

    DrProg Вечный нерд

    Я не знаю почему в таком случае не работают магнитные датчики, но вот у оптических частота срабатывания два килогерца, то есть до 120 000 rpm должны отслеживать. Попробовать то можно?
     
  13. iglooshtosser

    iglooshtosser Гик

    Я почти на 100% уверен что проблему автору создает отладочный Serial.prinrtln.
    Он довольно медленный и к тому же синхронный.
    Сам об это спотыкался.
    Тем более что он выводит число оборотов каждый оборот! Лучше выводить каждые 500 оборотов. То есть примерно каждые 8.5 секунд.
    Как-то так:
    Код (Text):
    if ((ob % 500) == 0) Serial.println(ob);
     
    Последнее редактирование: 9 июн 2015
  14. 9xA59kK

    9xA59kK Гик

    Попробуй вот эту lib, проверял на обычном(контактном) энкодере работает отлично. Обороты не пробывал считать.
     
  15. ANV

    ANV Гуру

    На таких оборотах можно уже не угол смотреть, а обороты считать.
    Подключите по PWM и считайте импульсы