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

atmega16, четырехканальный usart осциллограф

Для анализа работы четырех датчиков потребовался многоканальный осциллограф. Не более 5кГц на канал. Этого будет вполне достаточно. Даже можно до 1кГц. Кварц на 7.3728МГц. Информацию требуется передавать по usart (скорость usart до 115200). Думаю передавать так: заголовок начала пакета, 4 байта по 1 байту на канал. Но для этого придется часто переключать каналы АЦП, следовательно придется пропускать от 1 до 3 выборок АЦП. Так я буду терять информацию.

 

Можно и другой вариант попробовать: 10 байт на 1 канал, 10 на 2 канал... Но за полный период передачи я очень много потеряю информации с первого датчика.

 

Вопрос: как лучше организовать передачу?

Байты потом будут приниматься на компьютере в гипертерминале, или в подобном софте, который может делать лог с ком-порта в файл. Файл этот потом будет обрабатываться либо в excel, либо в матлаб, либо в вольфрам математика. Будут вычленяться каналы, будут строиться графики по этим данным.

 

Пока что можно даже с двумя датчиками работать. То есть с двумя каналами ацп. Но все же - как лучше организовать передачу?

Изменено пользователем Lost_Viking

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


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

Какая разница как передавать и причем здесь компьютер, если вопрос в АЦП. Не хочется терять выборки, ставьте 4 АЦП, и собирайте полную информацию, либо чаще переключайте АЦП. На частоте 5КГц Вас не хватит времени передать данных в течение одной выборки, поэтому будем говорить об 1кГц.

Итак время 1ms, за это время надо успеть собрать данные с 4 каналов и передать пакет, заголовок и 4 байта. Пускай заголовок 4 байта. Итого пакет 8 байт или 64 бит.

На скорость 115200 ширина бита примерно 9мкс. Передача пакета длиной 64 бит займет 9*64= 576мкс, грубо. То есть за 1ms Вы успеваете отгрузить пакет.

Теперь по сбору данных. Кто мешает переключать АЦП 4 раза за 1ms и собирать отсчеты на частоте скажем 5кГц. Никто похоже не мешает.

В этом случае 1 отсчет будем занимать 200мкс. 4 канала отстреляются за 800мкс и останется еще 200мкс на переключение между каналами и переходные процессы.

В результате Вы получаете реальную скорость снятия данных 1кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно.

 

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


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

Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона.

 

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


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

Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона.

АЦП 8 бит

 

Кто мешает переключать АЦП 4 раза за 1ms и собирать отсчеты на частоте скажем 5кГц. Никто похоже не мешает.

В этом случае 1 отсчет будем занимать 200мкс. 4 канала отстреляются за 800мкс и останется еще 200мкс на переключение между каналами и переходные процессы.

В результате Вы получаете реальную скорость снятия данных 1кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно.

Да, вы меня правильно поняли. Я думаю о переходных процессах. А по поводу расчета частоты семплирования - это мне понятно.

По даташиту меги при переключении канала стоит пропускать от 1 до 3 выборок. То есть вы хотите сказать, что мне на 1кгц не стоит волноваться о переходных процессах, и пропускать выборки?

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


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

При такой требуемой частоте беспокоиться совершенно не о чем. Кстати, на всякий случай напоминаю - при 8 битах тактовую частоту ADC можно поднять до 1 MHz.

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


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

Кстати, стоит ли использовать прерывания от ацп в данном случае?

Для отправки и приема данных использую такую конструкцию:

while ( !(UCSRA & (1<<RXC))

while ( !(UCSRA & (1<<UDRE))

 

Соответственно, пока условия истинны программа стоит и ничего не делает. Если использовать прерывание от АЦП, то в это время можно считывать результаты от АЦП. Но часто, чаще чем передаются данные, считывать нет смысла. Если не использовать прерывания, то что-то не пойму... Что же получится... Как правильней?

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


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

Кстати, стоит ли использовать прерывания от ацп в данном случае?

Для отправки и приема данных использую такую конструкцию:

while ( !(UCSRA & (1<<RXC))

while ( !(UCSRA & (1<<UDRE))

 

Соответственно, пока условия истинны программа стоит и ничего не делает. Если использовать прерывание от АЦП, то в это время можно считывать результаты от АЦП. Но часто, чаще чем передаются данные, считывать нет смысла. Если не использовать прерывания, то что-то не пойму... Что же получится... Как правильней?

 

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

А вот дальше начинается самое интересное. Откуда USART узнает где брать пакет или следующий байт? Вот и пускай не сидит в пустом цикле, а отслеживает указатели на массивы.

Если данных нет, тогда пустой цикл, если данные есть, тогда процессор запихивает байт в регистр передатчика.

Короче основная программа должна выполнять две функции, принимать данные от АЦП, заполнять этими данными массив данных, в простонародье FIFO, и отправлять данные по USART из этого же массива. Заполнение массива идет по прерываниям от АЦП, отгрузка данных тоже по прерываниям от USART по мере готовности передатчика.

Ну вот и получаем целую программу. Отработка двух типов прерываний и работа с указателями FIFO.

На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит :)

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


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

На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит :)

Едрён-батон! Вы так любезны! :biggrin:

Ам.. а есть какие-нибудь примеры, исходники? Ткните меня мордой в... интернет, плиз =)) Хотя я сам сейчас поищу, но может быть есть что-то более перевариваемое.

 

http://mainloop.ru/avr-atmega/avr-uart-fifo-irq.html вроде бы подходит

 

Изменено пользователем Lost_Viking

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


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

Ам.. а есть какие-нибудь примеры, исходники? Ткните меня мордой в... интернет, плиз =))

Начните впервую очередь с референс дизайнов на самом сайте Atmel, там куча исходников и примеров. Еще я б поискал на Microchip, там тоже на C полно неплохих исходников.

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


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

Пытаюсь скомпилировать код, что выше по ссылке - выдает ошибку "...hudson.../stdio/" . AVR Studio 4

Перерыл интернет, ничего не нашел . Только лишь инфа о том, что это баг авр студии. Надо шестую студию с сервис паком качать. Но у меня avr jtag ice !!! Придется бубен доставать.

Изменено пользователем Lost_Viking

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


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

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

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

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

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

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

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

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

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

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