Arduino Mega 2560 Расширение SRAM

Тема в разделе "Arduino & Shields", создана пользователем un1x, 18 окт 2017.

  1. un1x

    un1x Нерд

    Дело в том что нужно форму сигнала записать. Из-за этого нужно хранить значения всех 10000 так называемых отсчетов...
     
  2. DIYMan

    DIYMan Guest

    Куда вы её записываете? Вы на дисплее, подключённом к дуне, строите графики, или просто во внешний мир данные пихаете? Если второе - то можно и без такого огромного массива обойтись, там в расчётах фигурируют соседние ячейки, следовательно, алгоритм прост: получили N значений, нужных для расчёта очередной точки, посчитали - выплюнули, далее по кругу.
     
  3. un1x

    un1x Нерд

    Суть такая, снимаю 10000 отсчетов непрерывно, фильтрую, далее запись на SD. Выплевываю рассчитанное среднеквадратичное значение сигнала на дисплей.
     
  4. un1x

    un1x Нерд

    Если фильтровать и реализовывать математику в цикле то увеличивается время, тем самым падает частота опроса ацп(как я понимаю).
     
  5. DIYMan

    DIYMan Guest

    Кто мешает за раз снимать не 10000, а 100? Фильтровать, записывать на SD, как только записали 100 таких пакетов - прочитать их из SD, рассчитать среднеквадратичное, вывести на дисплей? Экономия памяти - в 100 раз ;)
     
    un1x нравится это.
  6. un1x

    un1x Нерд

    ТЗ мешает, для актуальности данных(мониторинга) - 100 значение мало. Технологический процесс на котором будет тестироваться устройство имеет множество оговорок, а так же факторов как шум и за 100 отсчетов возможно поймать только шум и наводки. Поэтому и ставится задача получить непрерывно 10к отсчетов и уже на их основе рассчитать среднеквадратичное значение.
     
  7. un1x

    un1x Нерд

    Хотя возможно я вас не так понял, было бы интересно посмотреть на то что вы предлагаете, и сравнить с тем что мне нужно пусть не на 10к записях а хотя-бы на 1к. Если не затруднить можете накидать примерчик.
     
  8. DIYMan

    DIYMan Guest

    Я предлагаю считывать те же 10000 показаний, только не сразу в память, а порциями: считали 100 показаний (пусть даже там один шум, вы же всё равно читаете из порта), рассчитали по формулам, что надо, записали на SD, повторили 100 раз этот цикл. По итогу - имеем на SD 100 записей по 100 рассчитанных значений. Поскольку по формуле фильтрации видно, что в расчёте принимают участие только соседние ячейки - получили РОВНО ТОТ ЖЕ результат, что и при считывании 10000 значений сразу, с одной поправкой: паузы между съёмом показаний, т.к. для расчёта и записи нужно время. В алгоритме следует учесть момент, что при расчёте очередного блока нужно иметь в наличии N последних значений из предыдущего блока, судя по алгоритму расчёта.

    Но проще, конечно, перелезть на другой камень, где памяти будет достаточно.
     
    un1x нравится это.
  9. un1x

    un1x Нерд

    Тогда еще 2 вопроса возникает:
    1. Форма сигнала же получится с дефектами?(если до то как бороться с этим? интервал какой то рассчитывать?)
    2. Как просчитать время пауз между съемом показаний.
    Примеры приветствуются.
     
  10. DIYMan

    DIYMan Guest

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

    2. millis() :)
     
    un1x нравится это.
  11. un1x

    un1x Нерд

    1. При серфинге я нашел данную тему, http://dml.compkaluga.ru/forum/index.php?showtopic=54850
    проверил выборка из 10000 значений происходит за 150~400 мсек, что вполне приемлемо.
    2. Спасибо буду пробовать.
     
  12. un1x

    un1x Нерд

    Код (C++):
    // Цикл для 100 пачек
    for (int i = 0; i < 100; i++)
    {
      // Цикл для получения 100 значений
      for (int i = 0; i < 100; i++)
      {
        val[i] = analogRead(pinA1);
        //Serial.println(val[i]);
      }
      // Конец цикла для получения 100 значений
     
      // Цикл записи 100 значений
      for (int i = 0; i < 100; i++)
      {
        myFile = SD.open(Str, FILE_WRITE);
        //Serial.println((val[i]/204.6)-2.15);
        myFile.println((val[i]/204.6)-2.15);
        myFile.close();
        //Serial.println((val[i]/204.6)-2.15);
      }
      //Конец цикла записи
    }
    // Конец цикла для 100 пачек
    как то жестко получается на запись 3 минуты уходит...
     
  13. DIYMan

    DIYMan Guest

    Дело небыстрое :) Может, действительно взять другой камень, и не париться? ;)
     
  14. un1x

    un1x Нерд

    Возможно, думаете DUE для таких целей подойдет? или что-то посерьезнее надо?
     
  15. DIYMan

    DIYMan Guest

    Ну у Due 96 Кб SRAM, есличо. Тактовая повеселее, 84 МГц против 16-ти, да и вообще - это ARM, камешек годный.

    По вашей задаче: 10 000 * 4 = 40 000 байт, меньше половины памяти, хватает. Так что есть смысл попробовать на Due, порог вхождения - тот же, что и для обычной дуньки. Но - стоимость :( Закажите у китайцев плату, пробуйте.
     
    un1x нравится это.
  16. sslobodyan

    sslobodyan Гик

    Лично мне для задач типа осциллографа очень нравится использование модуля DMA, которые есть в ARMах. Конечно, все зависит от ТЗ, особенно от требуемой частоты опроса АЦП. Но при использовании DMA сам опрос как раз проводится без затрат процессорного времени с записью в ОЗУ. Для единичного устройства смотрел бы в сторону модульков на STM32F103RE (RC, RD, RE и далее - 64к ОЗУ). Стоимость +- 10 уе. Или что-либо постарше из 205-207 серии, а может быть и на 4хх серию бы замахнулся. Цены достаточно демократичные. Ардуино-совместимые.
     
    DIYMan нравится это.
  17. AlexU

    AlexU Гуру

    Средне квадратичное значение можно подсчитать и без всяких буферов, так сказать на лету. Некоторый небольшой буфер может пригодиться для гарантии того, что бы не пропустить какой-нибудь отсчёт.
    А это должно быть в ТЗ, какова частота замера сэмплов нужна? Ну или какая частота исследуемого сигнала?
    Все зависит от частоты сэмплирования и частоты исследуемого сигнала. Форма оцифрованного сигнала всегда будет с дефектами, но количество дефектов будет зависеть от разности частоты сэмплирования и частоты исследуемого сигнала. По теореме Котельникова частота сэмплирования должна быть как минимум в два раза выше частоты сигнала, но при этом оцифрованный сигнал будет мало похож на исходный. Чем выше будет разница между частотой сэмплирования и частотой сигнала, тем более точно оцифрованный сигнал будет повторять исходный. Так думаю, что при разнице в 10 раз можно получить вполне приемлемый оцифрованный сигнал. В этом случае, учитывая что Мега2560 штатно сэмплирует с максимальной частотой ~15 кГц, частота входного сигнала не должна превышать ~1500 Гц. Хотя у Меги2560 можно поднять частоту сэмплирования до ~74 кГц, но тогда снизится точность АЦП. Тут уже надо думать что важнее -- точность преобразования или скорость преобразования.
     
    DIYMan нравится это.
  18. un1x

    un1x Нерд

    Исследуемые сигнал находится в диапазоне 600 - 3000 Гц