Lost_Viking 0 2 февраля, 2013 Опубликовано 2 февраля, 2013 (изменено) · Жалоба Для анализа работы четырех датчиков потребовался многоканальный осциллограф. Не более 5кГц на канал. Этого будет вполне достаточно. Даже можно до 1кГц. Кварц на 7.3728МГц. Информацию требуется передавать по usart (скорость usart до 115200). Думаю передавать так: заголовок начала пакета, 4 байта по 1 байту на канал. Но для этого придется часто переключать каналы АЦП, следовательно придется пропускать от 1 до 3 выборок АЦП. Так я буду терять информацию. Можно и другой вариант попробовать: 10 байт на 1 канал, 10 на 2 канал... Но за полный период передачи я очень много потеряю информации с первого датчика. Вопрос: как лучше организовать передачу? Байты потом будут приниматься на компьютере в гипертерминале, или в подобном софте, который может делать лог с ком-порта в файл. Файл этот потом будет обрабатываться либо в excel, либо в матлаб, либо в вольфрам математика. Будут вычленяться каналы, будут строиться графики по этим данным. Пока что можно даже с двумя датчиками работать. То есть с двумя каналами ацп. Но все же - как лучше организовать передачу? Изменено 2 февраля, 2013 пользователем Lost_Viking Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
telix 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Какая разница как передавать и причем здесь компьютер, если вопрос в АЦП. Не хочется терять выборки, ставьте 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кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона. АЦП 8 бит Кто мешает переключать АЦП 4 раза за 1ms и собирать отсчеты на частоте скажем 5кГц. Никто похоже не мешает. В этом случае 1 отсчет будем занимать 200мкс. 4 канала отстреляются за 800мкс и останется еще 200мкс на переключение между каналами и переходные процессы. В результате Вы получаете реальную скорость снятия данных 1кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно. Да, вы меня правильно поняли. Я думаю о переходных процессах. А по поводу расчета частоты семплирования - это мне понятно. По даташиту меги при переключении канала стоит пропускать от 1 до 3 выборок. То есть вы хотите сказать, что мне на 1кгц не стоит волноваться о переходных процессах, и пропускать выборки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба При такой требуемой частоте беспокоиться совершенно не о чем. Кстати, на всякий случай напоминаю - при 8 битах тактовую частоту ADC можно поднять до 1 MHz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Кстати, стоит ли использовать прерывания от ацп в данном случае? Для отправки и приема данных использую такую конструкцию: while ( !(UCSRA & (1<<RXC)) while ( !(UCSRA & (1<<UDRE)) Соответственно, пока условия истинны программа стоит и ничего не делает. Если использовать прерывание от АЦП, то в это время можно считывать результаты от АЦП. Но часто, чаще чем передаются данные, считывать нет смысла. Если не использовать прерывания, то что-то не пойму... Что же получится... Как правильней? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
telix 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Кстати, стоит ли использовать прерывания от ацп в данном случае? Для отправки и приема данных использую такую конструкцию: while ( !(UCSRA & (1<<RXC)) while ( !(UCSRA & (1<<UDRE)) Соответственно, пока условия истинны программа стоит и ничего не делает. Если использовать прерывание от АЦП, то в это время можно считывать результаты от АЦП. Но часто, чаще чем передаются данные, считывать нет смысла. Если не использовать прерывания, то что-то не пойму... Что же получится... Как правильней? Правильно работать по прерываниям, и использовать аппаратный USART. Программа крутится в пустом цикле, пришло прерывание от АЦП, процессор принял данные сложил в память. А вот дальше начинается самое интересное. Откуда USART узнает где брать пакет или следующий байт? Вот и пускай не сидит в пустом цикле, а отслеживает указатели на массивы. Если данных нет, тогда пустой цикл, если данные есть, тогда процессор запихивает байт в регистр передатчика. Короче основная программа должна выполнять две функции, принимать данные от АЦП, заполнять этими данными массив данных, в простонародье FIFO, и отправлять данные по USART из этого же массива. Заполнение массива идет по прерываниям от АЦП, отгрузка данных тоже по прерываниям от USART по мере готовности передатчика. Ну вот и получаем целую программу. Отработка двух типов прерываний и работа с указателями FIFO. На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 (изменено) · Жалоба На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит :) Едрён-батон! Вы так любезны! Ам.. а есть какие-нибудь примеры, исходники? Ткните меня мордой в... интернет, плиз =)) Хотя я сам сейчас поищу, но может быть есть что-то более перевариваемое. http://mainloop.ru/avr-atmega/avr-uart-fifo-irq.html вроде бы подходит Изменено 3 февраля, 2013 пользователем Lost_Viking Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
telix 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Ам.. а есть какие-нибудь примеры, исходники? Ткните меня мордой в... интернет, плиз =)) Начните впервую очередь с референс дизайнов на самом сайте Atmel, там куча исходников и примеров. Еще я б поискал на Microchip, там тоже на C полно неплохих исходников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 (изменено) · Жалоба Пытаюсь скомпилировать код, что выше по ссылке - выдает ошибку "...hudson.../stdio/" . AVR Studio 4 Перерыл интернет, ничего не нашел . Только лишь инфа о том, что это баг авр студии. Надо шестую студию с сервис паком качать. Но у меня avr jtag ice !!! Придется бубен доставать. Изменено 3 февраля, 2013 пользователем Lost_Viking Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 4 февраля, 2013 Опубликовано 4 февраля, 2013 · Жалоба Да, в студии 6 компилится. :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться