Перейти к содержанию
    

Добрый день!

Помогите разобраться.

У ацп 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 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема о нехватке квалификации в правильном выборе и последующей работе с аппаратурой и ПО, а несчастный АЦП здесь вовсе не при чём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. На какой тактовой частоте должен работать контроллер, чтобы успеть забрать все данные на такой скорости?

2. Данные забирает компьютер. Как правильно организовать алгоритм чтения чтобы забрать максимальное количество измерений. Т.е. пересылать только значения 3-х байт данных, а обрабатывать уже в ПК? А как же переключение пределов.

1. Встречные вопросы. SPI реализован аппаратно или программно? Если второе, то о высокой скорости можно забыть. Далее при аппаратной реализации скорость чтения НАПРЯМУЮ определяется настройками тактовой частоты блока SPI. Достаточно просто помножить длительность такта SPI на число бит (24 или сколько там выдает АЦП) и получите время, затрачиваемое на чтение слова.

2. Опять вопросы. А что нужно обрабатывать и как? Может Вы там корреляцию считаете или БПФ, а может нужно просто взять среднее - это совершенно разные по затратам операции и план действий соответственно будет разным. Но в любом случае, если объем данных для передачи после обработки не снижается кординально, то лучше передавать в ПК "как есть", и обработку делать в нём же.

Что значит переключение пределов? У Вас интерфейс какой - USB? Или COM? Что мешает передавать в одну сторону данные, а в другую команды на переключение пределов? (одновременно)

Если нужно задать определенную комбинацию каналов для опроса, то это можно сделать массивом -передаете массив номеров каналов, в той последовательности, в которой нужно их опросить, и контроллер далее начинает опрос согласно этому порядку. Тем более что каналов у вас, насколько я понимаю, всего 2 :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Встречные вопросы. SPI реализован аппаратно или программно? Если второе, то о высокой скорости можно забыть. Далее при аппаратной реализации скорость чтения НАПРЯМУЮ определяется настройками тактовой частоты блока SPI. Достаточно просто помножить длительность такта SPI на число бит (24 или сколько там выдает АЦП) и получите время, затрачиваемое на чтение слова.

В порядке общего трепа: программный SPI не так уж плох. Помнится, лет пять назад я его гонял на Cypress EZ FX2, получалось около 800 kbps. Писал на С, на Кайле.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В порядке общего трепа: программный SPI не так уж плох. Помнится, лет пять назад я его гонял на Cypress EZ FX2, получалось около 800 kbps. Писал на С, на Кайле.

А что ж в нём плохого? Только максимальная скорость от МК ведь зависит. На Меге атора столько не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

получалось около 800 kbps. Писал на С, на Кайле.

Это если хорошо представляешь как работает ядро контроллера, для этого надо немного и ассемблером владеть :) А вот если писать на С чисто алгоритмически, не задумываясь об оптимизации можно такого наворотить что ууу... Вот сегодня как раз разгребал чужой г%№*о-код: тоже запись в SPI, программная, сделано на сдвигах. На запись одного бита уходит более 100 команд (точно не считал), а всего передается 24 бита (хотя нужно 21, но кодер не стал заморачиваться такой мелочью). В итоге на весь цикл записи уходит около 1мс, рабочая частота контроллера 20МГц (сравнивая с результатами ТС -у него результат даже чуть лучше). После оптимизации весь цикл стал занимать 33мкс при том что тактовая частота была еще и снижена до 5МГц. Как говорится - почуствуй разницу :biggrin:

А использование аппаратного SPI даст тотже результат (а то и лучше) не прикладывая особых умственных усилий. Кстати по моим прикидкам тот же цикл в аппаратной реализации у меня бы вышел за 8,5мкс, т.е в 4 раза лучше чем оптимизированный программный вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SPI программный. Скорость взята максимально возможная исходя из рекомендаций производителя ацп.

Как я писал выше на обработку получается 10 мкс, это если хотим успеть забарать все данные.

А циклы For While сьедают порядка 5 -10 мкс. Если еще добавить приведение к виду напряжения, несколько перемножений и делений числел с точкой (что бы понять на какой предел переключиться) то все сводится к одному измерению.

Вот и не пойму как праильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно - с аппаратным SPI, никаких делений и умножений, только сдвиги и сложения, и работа по прерываниям, а не парсинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и не пойму как праильно

Во время работы аппаратного SPI контроллер может обрабатывать предыдущий результат, ну это так, на заметку - времени на умножение/деление с плавающей точкой все равно не хватит. Можно делать проще -есть какойто индикатор переполнения АЦП -ну например один отсчет перевалил за 0.9 шкалы -просто берете и в 2 раза уменьшаете усиление PGA АЦП. Приводить к вольтам не нужно если в самом устройстве не требуется отображать значение в вольтах - просто передаете отсчет АЦП в компьютер, снабдив его значением PGA при котором этот отсчет получен, а комп сам посчитает сколько это будет в вольтах.

Задача ведь наверняка использовать по максимуму шкалу АЦП, а не подстраивать ее под какието вольты или амперы, так и меняйте шкалу -для этого достаточно оценивать сами отсчеты без перевода в физические величины.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ошибся. SPI аппаратный.

Как я понял приводить к виду напряжения не нужно.

Тогда другой вопрос, а как правильно контролировать флаг готовность, в цикле программно или аппаратно через прерывание?

И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?

 

Ручками.

 

P.S.

Для прикола ради - как мы считали в 80-х ручками объемы и такты на асме i8080 - 580:

post-29537-1440614435_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как узнать сколько нужно машинных циклов на обработку операций с плавающей точкой?

Также как и операций фиксированной точки:

Делаете короткий цикл, выполняете его N раз (N большое число == тысячи или десятки или сотни тысяч), измеряете длительность цикла по таймеру.

Добавляете в цикл исследуемую команду, выполняете его N раз, измеряете длительность цикла по таймеру.

Вычитаете первый результат из второго, делите на N.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возник еще вопрос.

Я правильно понимаю таблицу 13 и 15. Что за 1 мс я получу только 1 измерение?

Период обновления 0,21 мс и первые 5 измерений нужно выбросить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...