1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получать кэшбэк с покупок в online-магазинах? Сервис "Zozi.ru" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Arduino и AVR (Atmel) микроконтроллеры

Тема в разделе "Наши другие увлечения", создана пользователем raefa, 9 мар 2016.

Реклама. Купить это место.
  1. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Последнее редактирование: 19 окт 2017
  2. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Вот такие показания идут в поправленом коде.
    сериал с показанияи.png
     
  3. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Окей, отлично.
    проверяем
    11864332-11847696=16636 мкс
    то есть 3 оборота он сделал примерно за 16 мс. То есть скорость 3/0,016636=180.3 об/сек. Или 180*60=10819 оборотов в минуту.
    Всё совершенно корректно.
    Возвращайте из комментов кусок кода, который под if :) В dtostrf отводите не меньше 5 знаков под результат преобразования, а то у вас переполнение идёт.
     
  4. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Вот так показывает экранчик без кода
    PB160024.JPG
    R2 тут = rpm_cntr1
    R1 =realRPM1

    А вот так с кодом
    PB160025.JPG
     
  5. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    код на github обновите. Количество разрядов в dtostrf под realRPM1 сделайте не меньше 7.
     
  6. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Все разобрался. сам виноват не в ту линию выводил показания. терь все работает.
    --- Сообщения объединены, 16 ноя 2017 ---
    Последний вариант кода обновил.:)
    --- Сообщения объединены, 16 ноя 2017 ---
    ААААА !!!! работает !!!! теперь показания остаются на экране когда датчик относиш.

    Как уменьшить скачки десяток и единиц??? по такой формуле
    indI = (indI * 0.9) + (realI / 10); // усреднение.
    можно усреднять обороты? или есть какая нить другая?
    --- Сообщения объединены, 16 ноя 2017 ---
    Вот так теперь работает. это я на 7 разделил чтоб обороты адекватные были.
    тут видно что последние 2 знака скачут. как сделать поплавнее.
    PB160026.JPG
     
  7. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    if (rpm_cntr1 > 0)
    в третий раз повторяю - здесь ДОЛЖНО БЫТЬ > 2, иначе результат некорректен!!!

    dtostrf(realRPM1, 6, 0, line1 + 3); //собираю строчку 4 здесь будет скорост вращ верхнего мотора
    line2[11] = ' ';
    выводите в строку 1, пробел вбиваете в строку 2, причём не в ту позицию.

    все диагностические serial.print'ы выкидывайте - они жрут кучу времени и ресурсов.
    на хрена? это меньше процента от результата.
     
  8. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Все поставил if (rpm_cntr1 > 4) скачет теперь только единицы, десятки почти не шевелятся. Результат измерения тот же самый что и нафото.
    Это я понял что лишнего ничего не надо включать.

    Подскажите когда засуну в основной скеч измерение оборотов где нужно прописать noInterrupts() и interrupts() ? Я так понимаю надо запретить прерывания во время передачи данных в комп и сигнала из компа pwm
     
  9. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    На фига? Прерывания лучше вообще запрещать на максимально короткий период времени.
    Лучше всего вынести в кусок без прерываний все неатоммарные операции - это быстро и наиболее корректно.

    Примерно так:
    if (rpm_cntr1 > 4)
    {
    noInterrupts();
    unsigned long tmp_start = start_t1;
    unsigned long tmp_stop = stop_t1;
    uint16_t tmp_cntr = rpm_cntr1;
    rpm_cntr1 = 0;
    interrupts();

    realRPM1 = (float) (tmp_cntr - 1) * 60000000.0f / (float)(tmp_stop - tmp_start);
    }
     
  10. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Вот так правильно писать?
    Код:
              //Измерение оборотов
    
    float realRPM1 = 0.0;
    float realRPM2 = 0.0;
    if (rpm_cntr1 > 4){
    noInterrupts();
    unsigned long tmp_start1 = start_t1;
    unsigned long tmp_stop1 = stop_t1;
    uint16_t tmp_cntr1 = rpm_cntr1;
    rpm_cntr1 = 0;
    unsigned long tmp_start2 = start_t2;
    unsigned long tmp_stop2 = stop_t2;
    uint16_t tmp_cntr2 = rpm_cntr2;
    rpm_cntr2 = 0;
    interrupts();
    realRPM1 = (float) (tmp_cntr1 - 1) * 60000000.0f / (float)(tmp_stop1 - tmp_start1);   //Считаем количество оборотов в минуту.
    realRPM2 = (float) (tmp_cntr2 - 1) * 60000000.0f / (float)(tmp_stop2 - tmp_start2);
    }
    
    или вот так правильней?
    Код:
    //Измерение оборотов
    
    float realRPM1 = 0.0;
    if (rpm_cntr1 > 4){
    noInterrupts();
    unsigned long tmp_start1 = start_t1;
    unsigned long tmp_stop1 = stop_t1;
    uint16_t tmp_cntr1 = rpm_cntr1;
    rpm_cntr1 = 0;
    interrupts();
    realRPM1 = (float) (tmp_cntr1 - 1) * 60000000.0f / (float)(tmp_stop1 - tmp_start1);   //Считаем количество оборотов в минуту.
    }
    
    float realRPM2 = 0.0;
    if (rpm_cntr2 > 4){
    noInterrupts();
    unsigned long tmp_start2 = start_t2;
    unsigned long tmp_stop2 = stop_t2;
    uint16_t tmp_cntr2 = rpm_cntr2;
    rpm_cntr2 = 0;
    interrupts();
    realRPM2 = (float) (tmp_cntr2 - 1) * 60000000.0f / (float)(tmp_stop2 - tmp_start2);
    }
     
  11. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Второй вариант, конечно. Выполнение условий же совершенно независимо для первого и второго счётчиков.
     
  12. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
  13. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    attachInterrupt(digitalPinToInterrupt(5), interrupt1, RISING); // пин датчика верхнего двигателя
    attachInterrupt(digitalPinToInterrupt(6), interrupt2, RISING); // пин датчика нижнего двигателя
    у вас кто - Uno?
    на UNO прерывания могут быть назначены ТОЛЬКО на второй и третий пин
    https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
     
  14. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Nano на самом стенде стоит nano
     
  15. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
  16. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    блин надо тогда кнопки куда то перекинуть.
    --- Сообщения объединены, 16 ноя 2017 ---
    Вот тут правильно?
    Код:
    uint16_t tmp_cntr2 = rpm_cntr2;
    rpm_cntr2 = 0;
    interrupts();
    почему тут пишем rpm_cntr2 = 0; а не tmp_cntr2 = 0;
    Хотя остальные переменные заменили и берем новые.
    --- Сообщения объединены, 16 ноя 2017 ---
    Если заменить этот код
    Код:
    if (realRPM1 > 3){
            dtostrf(prSpr1, 5, 0, line4 + 2); //собираю строчку 4 здесь будет скорост вращ верхнего мотора
            line4[7] = ' ';
           }
    
    Заменить на этот, на что это повлияет?
    Код:
    dtostrf(prSpr1, 5, 0, line4 + 2); //собираю строчку 4 здесь будет скорост вращ верхнего мотора
            line4[7] = ' ';
    Просто в первом варианте на экране высвечивается постоянно остаточное число оборотов. по второму варианту при резкой остановке обороты обнуляются. Так правильней чтоб обороты при невращающемся моторе спадали до ноля.

    Правильно будет так сделать. показания работаю что там что тут. разница в остаточных числах при остановке мотора.
     
  17. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Потому, что нам нужно, чтобы прерывание знало о том, что надо считать с начала.
    Меняйте. Я же писал о том, что это защита от мерцания в случае очень короткого цикла loop. С весами и прочим барахлом loop у вас достаточно длинный и даже на небольших оборотах успевает пройти несколько прерываний за время одного loop'а.
     
    Marksheider нравится это.
  18. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Интересно получается , Вот этот датчик типа аналоговый, на нем показывает полнейшую чушь как его не регулируй.
    PB170028.JPG
    А вот с этим датчиком как я понял имеющий цифровой выход обороты считаются как положено, но его надо очень близко подносить к вращающимся элементам.
    PB170029.JPG
    Датчик холла есче едет, Интересно будет он реагировать на магниты мотора?
     
  19. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Куда направляли? Надо на боку мотора лепить кусочек фольги (фольгированного скотча) и на него направлять светодиод/фотодиод (сводить их в точку). И аккуратненько потенциометром настраивать так, чтобы он срабатывал только на метку.
    Да, на светодиод/фотодиод желательно надеть кусочки какой-нибудь чёрной трубки (термоусадки, например), чтобы минимум внешних засветок был.
    same shit - всё, что не просветное - должно работать на хорошее отражение. Поэтому метка (фольга) обязательно.
    Не факт.
     
  20. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Если использовать датчик хола из мотора от дисковода древнего? ему надо будет усилитель сигнала мостырить на ОУ или есть какая нить порпроще схема подключения?
    --- Сообщения объединены, 17 ноя 2017 ---
    Вот от сюда если попробовать выковырять датчик, он как раз стоит с боку мотора и реагирует на магнитный круг.
    Его можно будет сразу напрямую подключить?
     

    Вложения:

    • PB170030.JPG
      PB170030.JPG
      Размер файла:
      321,2 КБ
      Просмотров:
      3
  21. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    хз, никогда с ними дела не имел.
     
Реклама. Купить это место.