Полная версия этой страницы:
ads1255
messenger
Aug 20 2015, 05:13
Добрый день!
Помогите разобраться.
У ацп ads1255 максимальная скорость оцифровки 30 000 измерений в секунду.
Флаг готовности ацп появляется с периодом 34 мкс. При работе на рекомендуемой производителем тактовой частоте 7,68 Мгц, время на запрос, t6, и чтение составляет порядка 23 мкс.
Задача собрать максимальное количество измерений за 1 мс.
Ранее я уже работал с этим ацп, блок расчетов взял старый, но там и скорости были 1-5 измерений в секунду.
Сейчас ПО организовано так, запускаю таймер на 1 мс, и читаю в цикле сколько успею. Получается 1 измерение. А нужно 5-10.
Вопросы)
1. На какой тактовой частоте должен работать контроллер, чтобы успеть забрать все данные на такой скорости?
2. Данные забирает компьютер. Как правильно организовать алгоритм чтения чтобы забрать максимальное количество измерений. Т.е. пересылать только значения 3-х байт данных, а обрабатывать уже в ПК? А как же переключение пределов.
У меня сейчас Atmega16 разбирает данные. Пишу на Си. Так в лучшем случае 1-2 измерения получается забрать на такой скорости.
Циклы for, While, и т.д. съедают от 5 до 10 мск.
Если заремаркировть полные циклы вычислений, то удается проконтролировать байт готовности 23-26 раз. Как только добавляю вычисления (приведение к виду напряжения, обработку предела) все сразу сходит до 1 го измерения за 1 мс.
Тема о нехватке квалификации в правильном выборе и последующей работе с аппаратурой и ПО, а несчастный АЦП здесь вовсе не при чём.
Alexashka
Aug 21 2015, 05:01
Цитата(messenger @ Aug 20 2015, 08:13)

1. На какой тактовой частоте должен работать контроллер, чтобы успеть забрать все данные на такой скорости?
2. Данные забирает компьютер. Как правильно организовать алгоритм чтения чтобы забрать максимальное количество измерений. Т.е. пересылать только значения 3-х байт данных, а обрабатывать уже в ПК? А как же переключение пределов.
1. Встречные вопросы. SPI реализован аппаратно или программно? Если второе, то о высокой скорости можно забыть. Далее при аппаратной реализации скорость чтения НАПРЯМУЮ определяется настройками тактовой частоты блока SPI. Достаточно просто помножить длительность такта SPI на число бит (24 или сколько там выдает АЦП) и получите время, затрачиваемое на чтение слова.
2. Опять вопросы. А что нужно обрабатывать и как? Может Вы там корреляцию считаете или БПФ, а может нужно просто взять среднее - это совершенно разные по затратам операции и план действий соответственно будет разным. Но в любом случае, если объем данных для передачи после обработки не снижается кординально, то лучше передавать в ПК "как есть", и обработку делать в нём же.
Что значит переключение пределов? У Вас интерфейс какой - USB? Или COM? Что мешает передавать в одну сторону данные, а в другую команды на переключение пределов? (одновременно)
Если нужно задать определенную комбинацию каналов для опроса, то это можно сделать массивом -передаете массив номеров каналов, в той последовательности, в которой нужно их опросить, и контроллер далее начинает опрос согласно этому порядку. Тем более что каналов у вас, насколько я понимаю, всего 2

Работа с АЦП по прерываниям -АЦП завершил преобразование -> попали в прерывание от АЦП -> запустили чтение 3байт SPI ->вышли из прерывания; чтение SPI закончено->попали в прерывание от блока SPI -> скопировали значение из SPI в программный буфер->вышли из прерывания. C портом ВВ- можно и в главном цикле работать. Если что приходит (команда) -изменяете настройки АЦП (согласно команде) между циклами заполнения буфера. Это если 1мс нужно опросить разово. Если нужно непрерывный опрос -тогда 2 буфера "качельки", один заполняется -второй в это время передается в ПК. Это удобней для USB. Если UART -удобнее один кольцевой буфер. Както так.
Цитата(Alexashka @ Aug 21 2015, 14:31)

1. Встречные вопросы. SPI реализован аппаратно или программно? Если второе, то о высокой скорости можно забыть. Далее при аппаратной реализации скорость чтения НАПРЯМУЮ определяется настройками тактовой частоты блока SPI. Достаточно просто помножить длительность такта SPI на число бит (24 или сколько там выдает АЦП) и получите время, затрачиваемое на чтение слова.
В порядке общего трепа: программный SPI не так уж плох. Помнится, лет пять назад я его гонял на Cypress EZ FX2, получалось около 800 kbps. Писал на С, на Кайле.
Цитата(=AK= @ Aug 21 2015, 10:18)

В порядке общего трепа: программный SPI не так уж плох. Помнится, лет пять назад я его гонял на Cypress EZ FX2, получалось около 800 kbps. Писал на С, на Кайле.
А что ж в нём плохого? Только максимальная скорость от МК ведь зависит. На Меге атора столько не получится.
Alexashka
Aug 21 2015, 18:23
Цитата(=AK= @ Aug 21 2015, 10:18)

получалось около 800 kbps. Писал на С, на Кайле.
Это если хорошо представляешь как работает ядро контроллера, для этого надо немного и ассемблером владеть

А вот если писать на С чисто алгоритмически, не задумываясь об оптимизации можно такого наворотить что ууу... Вот сегодня как раз разгребал чужой г%№*о-код: тоже запись в SPI, программная, сделано на сдвигах. На запись одного бита уходит более 100 команд (точно не считал), а всего передается 24 бита (хотя нужно 21, но кодер не стал заморачиваться такой мелочью). В итоге на весь цикл записи уходит около 1мс, рабочая частота контроллера 20МГц (сравнивая с результатами ТС -у него результат даже чуть лучше). После оптимизации весь цикл стал занимать 33мкс при том что тактовая частота была еще и снижена до 5МГц. Как говорится - почуствуй разницу
А использование аппаратного SPI даст тотже результат (а то и лучше) не прикладывая особых умственных усилий. Кстати по моим прикидкам тот же цикл в аппаратной реализации у меня бы вышел за 8,5мкс, т.е в 4 раза лучше чем оптимизированный программный вариант.
messenger
Aug 22 2015, 02:46
SPI программный. Скорость взята максимально возможная исходя из рекомендаций производителя ацп.
Как я писал выше на обработку получается 10 мкс, это если хотим успеть забарать все данные.
А циклы For While сьедают порядка 5 -10 мкс. Если еще добавить приведение к виду напряжения, несколько перемножений и делений числел с точкой (что бы понять на какой предел переключиться) то все сводится к одному измерению.
Вот и не пойму как праильно
Правильно - с аппаратным SPI, никаких делений и умножений, только сдвиги и сложения, и работа по прерываниям, а не парсинг.
Alexashka
Aug 22 2015, 09:03
Цитата(messenger @ Aug 22 2015, 05:46)

Вот и не пойму как праильно
Во время работы аппаратного SPI контроллер может обрабатывать предыдущий результат, ну это так, на заметку - времени на умножение/деление с плавающей точкой все равно не хватит. Можно делать проще -есть какойто индикатор переполнения АЦП -ну например один отсчет перевалил за 0.9 шкалы -просто берете и в 2 раза уменьшаете усиление PGA АЦП. Приводить к вольтам не нужно если в самом устройстве не требуется отображать значение в вольтах - просто передаете отсчет АЦП в компьютер, снабдив его значением PGA при котором этот отсчет получен, а комп сам посчитает сколько это будет в вольтах.
Задача ведь наверняка использовать по максимуму шкалу АЦП, а не подстраивать ее под какието вольты или амперы, так и меняйте шкалу -для этого достаточно оценивать сами отсчеты без перевода в физические величины.
messenger
Aug 26 2015, 12:35
Ошибся. SPI аппаратный.
Как я понял приводить к виду напряжения не нужно.
Тогда другой вопрос, а как правильно контролировать флаг готовность, в цикле программно или аппаратно через прерывание?
И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?
Цитата(messenger @ Aug 26 2015, 15:35)

И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?
Ручками.
P.S.
Для прикола ради - как мы считали в 80-х ручками объемы и такты на асме i8080 - 580:
Нажмите для просмотра прикрепленного файла
Цитата(messenger @ Aug 26 2015, 18:35)

И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?
Также как и операций фиксированной точки:
Делаете короткий цикл, выполняете его N раз (N большое число == тысячи или десятки или сотни тысяч), измеряете длительность цикла по таймеру.
Добавляете в цикл исследуемую команду, выполняете его N раз, измеряете длительность цикла по таймеру.
Вычитаете первый результат из второго, делите на N.
panther26
Aug 27 2015, 17:48
удалено
messenger
Nov 18 2015, 03:47
Возник еще вопрос.
Я правильно понимаю таблицу 13 и 15. Что за 1 мс я получу только 1 измерение?
Период обновления 0,21 мс и первые 5 измерений нужно выбросить?
messenger
Nov 18 2015, 16:39
на осциллографе DRDY идет с периодом 30 мкс
Alexashka
Nov 19 2015, 06:01
Насколько я понимаю при скорости преобразования 30 килосэмплов в сек. период выдачи DRDY равна 1/30000=33,3мкс, далее по табл.15 находим, что для получения независимых отсчетов (без замешивания предыдущих значений) на этой частоте требуется выждать время Settling time равное 5 периодам DRDY, т.е 167 мкс. Соответственно данные можно забирать с частотой 1/1.67Е-4 = 6000 Гц. (ну или проще 30000/5=6000

Если у Вас период обновления (или частота с коротой Вы забираете отсчеты) больше, чем 167мкс, то Вы уже автоматически пропускате нужное количество DRDY, а значит никаких дополнительных пропусков делать не надо. По-моему так. Фильтру ведь все равно -забираете Вы данные или нет

-он свое дело всё равно делает.
messenger
Nov 19 2015, 11:00
я правильно понимаю, что дождавшись изменение параметра и начав измерение из ряда измеренных значение нужно выбросить 1-5 т.к. они содержат результаты преобразования до момента окончания установления параметра. А начиная с 5 можно брать все?
Alexashka
Nov 19 2015, 11:52
Ну это не совсем задержка в обычном понимании, просто отсчеты АЦП всегда содержат комбинацию (по простому говоря -среднее значение) последних 5 отсчетов, и если произошло резкое изменение сигнала, то нужно выждать 5 периодов DRDY, при этом выходной код АЦП будет точно соответствовать новому установившемуся значению сигнала.
Вопрос в том, какие именно и когда отсчеты нужно пропускать, ведь момент изменения сигнала как правило не известен...
Ruslan1
Nov 19 2015, 14:31
Вообще-то лучше несколько иначе подходить.
На 30ksps сеттлинг тайм 5 периодов, то есть считаете все кроме первых четырех от момента переключения коммутатора. А дальше - просто есть вклад величины до изменения в следующие после ее изменения четыре преобразования, ну и что? Это есть всегда, когда больше, когда меньше, и часто зависит больше от физики датчика, чем от измерителя.
То есть берем все измерения кроме первых 4х после переключения коммутатора и усредняем-фильтруем, как хотите.
Это усреднение реальных показаний реальной величины. Первые 4 величины после переключения- да, мусор. А дальше-нормальные измерения.
Если же необходимо измерять резко меняющиеся сигналы без влияния предыстории- то нужно усреднять плавающим окном по 5 соседним значениям, это даст 5 независимых значений каждую миллисекунду.
Ну а если три значения достаточно- то 3750sps без заморочек с ручными вычислениями.
Alexashka
Nov 20 2015, 06:30
Я так понимаю автору просто нужно оцифровывать один канал с максимально-возможной частотой, поэтому и 30kSps. Если это так, то я бы вообще не заморачивался с какими-то пропусками отсчетов -АЦП имеет встроенный фильтр и сужает полосу, а любая фильтрация (не важно цифровой фильтр или банальная RC цепочка) приводит к тому, что выходной сигнал начинает зависеть от предыстории. Это есть и в обычных (недельтасигма АЦП), поскольку там есть антиалиайзинговый фильтр. И этого не нужно бояться.
Но вот чего точно нужно бояться (о чем в даташите особо предупреждают) -это то, что при переключении каналов происходит наложение данных нескольких каналов, в этом случае нужно обязательно делать пропуски или как там рекомендуется выполнять команду синхронизации.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.