реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> atmega16, четырехканальный usart осциллограф
Lost_Viking
сообщение Feb 2 2013, 23:06
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



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

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

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

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

Сообщение отредактировал Lost_Viking - Feb 2 2013, 23:07
Go to the top of the page
 
+Quote Post
telix
сообщение Feb 3 2013, 05:16
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 9-12-12
Из: Курск
Пользователь №: 74 767



Какая разница как передавать и причем здесь компьютер, если вопрос в АЦП. Не хочется терять выборки, ставьте 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кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно.


--------------------
улыбаемся ...
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 3 2013, 07:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона.
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Feb 3 2013, 08:43
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Цитата(adnega @ Feb 3 2013, 11:20) *
Если АЦП реально более 8 бит, то можно применить компандирование для расширения динамического диапазона.

АЦП 8 бит

Цитата(telix @ Feb 3 2013, 09:16) *
Кто мешает переключать АЦП 4 раза за 1ms и собирать отсчеты на частоте скажем 5кГц. Никто похоже не мешает.
В этом случае 1 отсчет будем занимать 200мкс. 4 канала отстреляются за 800мкс и останется еще 200мкс на переключение между каналами и переходные процессы.
В результате Вы получаете реальную скорость снятия данных 1кГц по каждому каналу и отгружаете все каналы одним пакетом непрерывно.

Да, вы меня правильно поняли. Я думаю о переходных процессах. А по поводу расчета частоты семплирования - это мне понятно.
По даташиту меги при переключении канала стоит пропускать от 1 до 3 выборок. То есть вы хотите сказать, что мне на 1кгц не стоит волноваться о переходных процессах, и пропускать выборки?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Feb 3 2013, 09:15
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



При такой требуемой частоте беспокоиться совершенно не о чем. Кстати, на всякий случай напоминаю - при 8 битах тактовую частоту ADC можно поднять до 1 MHz.
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Feb 3 2013, 09:21
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Кстати, стоит ли использовать прерывания от ацп в данном случае?
Для отправки и приема данных использую такую конструкцию:
while ( !(UCSRA & (1<<RXC))
while ( !(UCSRA & (1<<UDRE))

Соответственно, пока условия истинны программа стоит и ничего не делает. Если использовать прерывание от АЦП, то в это время можно считывать результаты от АЦП. Но часто, чаще чем передаются данные, считывать нет смысла. Если не использовать прерывания, то что-то не пойму... Что же получится... Как правильней?
Go to the top of the page
 
+Quote Post
telix
сообщение Feb 3 2013, 10:35
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 9-12-12
Из: Курск
Пользователь №: 74 767



Цитата(Lost_Viking @ Feb 3 2013, 13:21) *
Кстати, стоит ли использовать прерывания от ацп в данном случае?
Для отправки и приема данных использую такую конструкцию:
while ( !(UCSRA & (1<<RXC))
while ( !(UCSRA & (1<<UDRE))

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


Правильно работать по прерываниям, и использовать аппаратный USART. Программа крутится в пустом цикле, пришло прерывание от АЦП, процессор принял данные сложил в память.
А вот дальше начинается самое интересное. Откуда USART узнает где брать пакет или следующий байт? Вот и пускай не сидит в пустом цикле, а отслеживает указатели на массивы.
Если данных нет, тогда пустой цикл, если данные есть, тогда процессор запихивает байт в регистр передатчика.
Короче основная программа должна выполнять две функции, принимать данные от АЦП, заполнять этими данными массив данных, в простонародье FIFO, и отправлять данные по USART из этого же массива. Заполнение массива идет по прерываниям от АЦП, отгрузка данных тоже по прерываниям от USART по мере готовности передатчика.
Ну вот и получаем целую программу. Отработка двух типов прерываний и работа с указателями FIFO.
На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит sm.gif


--------------------
улыбаемся ...
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Feb 3 2013, 11:44
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Цитата(telix @ Feb 3 2013, 14:35) *
На слух это все воспринять безусловно трудно. Поэтому начните, Вам предстоит долгий гемор, но оно того стоит sm.gif

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

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


Сообщение отредактировал Lost_Viking - Feb 3 2013, 12:03
Go to the top of the page
 
+Quote Post
telix
сообщение Feb 3 2013, 11:49
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 9-12-12
Из: Курск
Пользователь №: 74 767



Цитата(Lost_Viking @ Feb 3 2013, 15:44) *
Ам.. а есть какие-нибудь примеры, исходники? Ткните меня мордой в... интернет, плиз =))

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


--------------------
улыбаемся ...
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Feb 3 2013, 16:03
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



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

Сообщение отредактировал Lost_Viking - Feb 3 2013, 16:10
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Feb 4 2013, 14:38
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Да, в студии 6 компилится. smile3046.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 15:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016