Ну, на святое-то !!! … Семён Семёныч ![]()
если подключить к компьютеру, запустить терминал на скорости 38400 тогда форумы совсем не нужны будут
Только Михаилу не говори
К сожалению это совсем не знаю. Можете подсказать, куда копать хотя бы?
видимо спросить у гугла
Не могли бы Вы пояснить, что именно Вы имеете в виду?
Частота младших моделей Ардуино, как правило, 16 МГц. У старших - в разы поболее.
Это нужно смотреть в дэйташите на ADS1115. Как правило, ограничения вносит именно датчик.
Вопрос неправильно поставлен.
Правильно: как снять с датчика 5 значащих цифр? Ардуинка здесь - дело десятое.
А Вы не подскажете, как человеку, не имеющему ни слуха, ни голоса, не говоря уже о музыкальном образовании, как петь соло в Большом театре?
Ну нет тут какого-то волшебного рецепта: нужно прочитать от корки до корки (и, главное, - понять) хотя бы 3-5 книжек и приобрести практические навыки хотя бы в течении 2-3 лет.
Вы альтернативно одаренный?
Выше была приведена точная цифра 115200, откуда взялась 38400?
Если сами не соображаете, то хотя бы в точности следуйте советам.
Арифметику в школе учили?
В передаваемом по последовательному порту байте 10 битов: 8 информационных и два служебных. Следовательно, при скорости 115200 максимум за секунду можно передать 11520 байтов. Если Вам нужно передавать по два байта на отсчет, то это соответствует 5760 отсчетов в секунду. То есть в Ваш лимит 2000 вполне укладывается. Только ведь Вы перед отправкой зачем-то переводите целое число в число с плавающей точкой, тратя на это преобразование время (причем, немалое, т.к. у Ардуины нет FPU) и увеличивая объем двоичных данных в 2 раза, а после этого еще и переводите в текст, теряя на этом еще несколько раз как на объеме, так и на преобразовании.
В общем, представляется, что Вы сделали все возможное, чтобы измерение и передача информации происходила как можно медленнее, да еще и с потерями.
В общем, проблема совсем не с COM портом.
Список ошибок я вкратце перечислил выше - исправляйте.
Люблю я оды от тебя, но все что ты законспектировал, ребята выше все уже обьяснили.
К сожалению не знал, что вывод на COM-порт такой медленный. Уже разобрался. Из всего написанного выше есть хоть что-то положительное. Сократил время вывода.
Через ADS1115 пять значащих цифр снимал. Датчик выдавал.
По ограничениям датчика согласен, что может внести ограничения. Пробовал методом проб и ошибок. Раз тормознулся на ардуинке, то испытать скорость вывода датчика (модуля усилителя) попробовать не смог. Скорость передачи ниже описанную тоже, т.к. основная часть лежит на работе, а ехать туда в субботу не захотелось. Как следствие и скинул скорость, которая была опробована.
Суммарно на данный момент завершая тему:
- Скорость передачи данных в моем случае ограничивало передача в порт. Вроде разобрался в большей части.
- Передача по цифре не аналогу испытаю позже, по понятным обстоятельствам.
- Скорость вывода от датчика проверю. Передача от ADS - 860 выборок в секунду, предварительно почти устраивает.
remosYa и andriano спасибо
Видите ли, есть точность датчика, а есть разрядность.
То, что Вы “снимали” - это разрядность. Естественно, точность ограничивается разрядностью. Теоретически. На практике при конструировании датчика разрядность выбирается так, чтобы она не ограничивала точность.
А точность подразумевает, что младшая цифра является достоверной.
Например, разрядность датчика может указываться как 16 разрядов, но при этом ошибка появляется уже в 12-м разряде. Т.е. точность такого датчика не 16, а не более 12 разрядов.
Вот, например, разрядность большинства предназначенных для обработки звука АЦП составляет 24 разряда. А точность лучших из составляет лишь 20-21 разряд (имеются в виду прецизионные АЦП ценой порядка $10000). В последних 3-4 разрядах содержится только шум.
Кроме шума (случайной погрешности) есть еще нелинейность датчика (систематическая погрешность). То есть датчик с такой погрешностью может, скажем для напряжения ровно 1 Вольт выдавать значение (с учетом шума) в диапазоне от 1.02 до 1.03.
Да. Луше всего передавать на ПК “сырые” данные, а обрабатывать их уже там. Т.е. передаем снятые с датчика 2 байта, не приводя к нужной размерности и не преобразуя в текст (для чего вместо Serial.print() используем Serial.write()). Только не забудьте, что int в Ардуино имеет разрядность 2 байта, а на ПК - 4. Т.е. при чтении на стороне ПК нужно использовать short int.
По Serial.print() и Serial.write() тоже уже нашел. Как преобразовать на ПК найду.
Конечно еще вариант рассматривал путем накопления данных в массиве и вывод их через определенный промежуток времени в порт по println, но тут ограничение - объем памяти + пока не вышла информация не видно, что происходит, что опять же снижает существенно удобство
Это тоже понимаю. Датчиком буду смотреть затухающие колебания, при этом нужно или микронная точность, или увеличение амплитуды колебаний (путем места расположения датчика). Понимаю, что на микронах шум будет превалировать, но тогда возможно внести коррективы в амплитуду, что даст возможность уменьшить требуемую точность на которую в свою очередь будет меньше влиять суммарный шум.
Спасибо большое за подсказки.
ну так не хватит точностивозьмет ADS1220, он уже 2ksps может, 24 бита, такого точно хватит, тем более для минимизации шумов есть пин для организации чистого аналогового питания
В любом случае ADS лучше встроенного от AVR на порядки
Как понял точности и битности ADS1115 достаточно. Главная проблема только точность модуля лазерного датчика. Хотя по почти известной зависимости колебания (движения) можно математически попробовать интерполировать результаты на ПК. А вот скорость работы ADS1220 поинтереснее конечно выглядит. Пока все же пойду по ADS1115. Спасибо за ADS1220)
у 1220 шумы порядка 20 микровольт, так что его за глаза хватит, так как твой датчик выдает с разрешением 160 микровольт (1 микрон)
Понял. В любом случае новый велосипед нужен, если старый опробован и не подходит)) Покупать новый ADS хоть и копейки стоит, все же лучше, когда старый не подойдет. В любом случае спасибо
ads1115 цифрует с точностью 32 микровольта, и тебе же не абсолютное значение надо, а относительное, так что обязан выделить твои вибрации
Не надо println(), этим Вы затрачиваете лишнее время на преобразование, увеличиваете объем данных и снижаете их точность.
Да я уж понял. Просто привел вариант. Думал будет сложнее потом в VBNet писать программу. Пока испытал перевод миллисекунд в таком формате (раз нет сейчас датчика), вроде не так и сложно
да, если нужны с еще большим kSPS (30) то из недорогих ads1256, отличается высочайшей линейностью, на малых SPS гарантируется 23 бит без шумов, на больших SPS 18 бит, правда измеряет до 3 вольт, он как раз для токовой петли
Поясните, зачем вам перевод миллисекунд? Вы их тоже с Ардуино передаёте? Тогда время передачи увеличивается ещё минимум вдвое.
Если сигналы с датчика надо записывать с точными отметками времени, то лучше всё-таки предварительно накапливать отчёты на контроллере и только потом передавать. Что касается ограничений памяти - Уно/нано не единственные платы. Для вашей задачи можно взят, например RP2040 - стоит как нано, а памяти в 150 раз больше. При этом раз у вас АДС внешний, вам даже не придется переписывать код
отметки времени совсем не нужны, нужно гнать сырые данные по компорту с максимально возможной скоростью, в avr буфер всего один байт, на коротком кабеле потерь не будет совсем, лучше второй канал соединить с аналоговой землёй и измерять шум и его гнать в компьютер, тогда можно будет с сигналами поработать