Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » Форум разработчиков РЭА »
Трёхканальный АЦП из mega8 (страница 1)

Версия для печати (настроить)
Страницы: 1 2

Новая тема | Написать ответ

Подписаться

Автор Тема:   Трёхканальный АЦП из mega8
Dikoy
Member

Сообщений: 159
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 12 Декабря 2003 16:09ИнфоПравкаОтветитьIP

В общем, забил я на AD7896…

Теперь устремил взор в сторону ATmega8. Вот, что вычитал в даташите:
«8 канальный АЦП 10 бит при 15 Ksamples, 8 бит при 76.»
Это значит, что каждый АЦП не вырабатывает больше 15 (76) самплов, или они все вместе, работая последовательно? То бишь, если я дисейблю ненужные АЦП, получится увеличить скорость?

Идея такая: мега работает чистА как АЦП с 232 портом (ибо ни одного такого хорошего АЦП я не нашёл) и мультиплексором. Это всё летит в комп.
Скорость порта МК ставлю на предел, резонатор на 16 Мгц и т.д. Засаживаю всё через FT245.
P.s. Использовать «AVR с USB на борту» мне неохота – придётся писать драйвер под USB, а для этого нужно хотя бы это уметь… Рано или поздно, конечно, придётся этому учиться, но не сейчас…

AlexOr
Member

Сообщений: 340
Откуда: СПб
Регистрация: Май 2003

написано 12 Декабря 2003 16:57ИнфоПравкаОтветитьIP

Dikoy
65 - 260 µs Conversion Time
Мультиплексор и АЦП отдельны.

То бишь, если я дисейблю ненужные АЦП, получится увеличить скорость?
до 5128,2 Гц для 3х каналов
(На каждый канал)

Канал придется переключать программно, такчто для стабильности частоты дискретизации придется ее еще немного снизить.
Кроме того, это не Сигма-Дельта, поэтому на входе нужен нормальный фильтр против наложения.

Засаживаю всё через FT245.
Почему сразу не через COM?

Dikoy
Member

Сообщений: 160
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 13 Декабря 2003 02:04ИнфоПравкаОтветитьIP

AlexOr
Почему сразу не через COM?
Может и сразу, если 9600 хватит. FT245 - это так, как вариант.
5 кГц на канал должно хватить... А то через DTR больше 400 Гц не получается. Мёртвый вариант.

Мультиплексор и АЦП отдельны.
Не поняла!? (с)

Есть ещё вариант, вычитал в книжке Голубцова М.С. "AVR - от простого к сложному". Там на вход 90s8515 подключают внешнее ацп (до боли знакомый MAX1241) и МК работает как чисто преобразователь асинхронник-232. Переписать прошивку (текст ниже) под AD вполне реально, коммутатор под такие АЦП на логике 74НС есть. Так что можно и так поступить. Но не хочется фигнёй маяться...
P.s. Мелкие ляпы - заслуга FineReader-a.

Цифровой вольтметр с использованием АЦП фирмы Maxim типа МАХ1241
Измеренное значение передается с помощью интерфейса RS232. Параметры интерфейса: 9600 8N1.
Материал взят из демонстрационной версии компилятора Code-VisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.
Частота кварцевого резонатора: 4,000 МГц.


Текст программы:
«include <90s8515.h>
// Стандартная библиотека ввода/вывода
«include <stdio. h>
// Библиотека SPI-функций
«include <spi.h>
// Библиотека для формирования задержек
«include <delay. h>
// Опорное напряжение для МАХ1241 [мВ]
«define VREF 5000
// Определение управляющих сигналов для МАХ1241
«define NSHDN PORTB.O «define NCS PORTB.1 «define DOUT PINB.6
union adcu
{
unsigned char byte[2]; unsigned int word;
};
// Произвести одно аналого-цифровое преобразование и
// вернуть его результат
unsigned int max1241_read(void)
{
union adcu adc_data;
// Вывести микросхему МАХ1241 из режима shutdown
NSHDN=1;
// Подождать 5 мкс для приведения МАХ1241 в рабочее состояние
delay_us(5);
// Теперь выбрать чип для начала преобразования
NCS=0;
// Ждать, пока преобразование не завершится
// DOUT будет равен 0 в процессе преобразования
while (DOUT==0);
// DOUT=1 -> преобразование завершено
// Прочитать младший байт (MSB)
adc_data. byte[1]=spi(0);
// Прочитать старший байт (LSB)
adc_data. byte[0]=spi(0);
// Снять сигнал выбора чипа
NCS=1;
// Перевести АЦП в режим shutdown
NSHDN=0;
// Форматировать результат преобразования и возврат результата
return (adc_data,word»3)&0xfff;
void main(void)
{
// Переменная для хранения результата преобразования
unsigned n;
// Инициализация портов ввода/вывода
// Port A
DDRA=OxOO;
PORTA=OxOO;
// Port В
// Линия /SS установлена на вывод информации
// на уровне 1, это необходимо для работы
// SPI-порта в режиме мастер
DDRB=OxA3;
PORTB=Ox12;
// Port С DDRC=OxOO; PORTC=OxOO;
// Port D DDRD=OxOO; PORTD=OxOO;
// Инициализация UART (интерфейс RS-232)
// Параметры интерфейса: 8 битов данных, 1 стоп бит, без проверки четности
// приемник UART: отключен
// передатчик DART: включен
UCR=Ox08;
// Скорость передачи данных: 9600
UBRR=Ox19;
// Инициализация SPI
// Режим работы SPI: мастер
// Тактовая частота SPI: 1000 000 кГц
// Порядок передачи данных: младший бит первый SPCR=Ox50;
putsf("MAX1241 Demo using the CodeVisionAVR С Compiler");
putsf( *************************************************\n");
// Произвести аналого-цифровое преобразование и передать результаты
// через интерфейс RS-232
while (1)
{
n=max1241_read();
printf("MAX1241-> N=%4u U=%4umV\r\n",n, (unsigned) ((long) n*VREF/4096));
// 0.3 sec. delay
delay_ms(300);
};
}

Весельчак У
Moderator

Сообщений: 4482
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 13 Декабря 2003 03:27ИнфоПравкаОтветитьIP

Dikoy
Это значит, что каждый АЦП не вырабатывает больше 15 (76) самплов, или они все вместе, работая последовательно?
Там всего один АЦП и аналоговый коммутатор на входе.

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

Dikoy
Member

Сообщений: 165
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 13 Декабря 2003 03:45ИнфоПравкаОтветитьIP

Весельчак У
Там всего один АЦП и аналоговый коммутатор на входе.
АЦП будет работать с одной скоростью,
Угу. Понял.

AlexOr
Member

Сообщений: 341
Откуда: СПб
Регистрация: Май 2003

написано 13 Декабря 2003 03:49ИнфоПравкаОтветитьIP

Dikoy
Может и сразу, если 9600 хватит. FT245 - это так, как вариант.
5 кГц на канал должно хватить... А то через DTR больше 400 Гц не получается. Мёртвый вариант.

Так надо через TXD и RXD, получится до 1 Мбит в сек. и драйвер имхо проще писать.
Причем здесь 9600?

Dikoy
Member

Сообщений: 167
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 14 Декабря 2003 01:18ИнфоПравкаОтветитьIP

AlexOr
Так надо через TXD и RXD,
Ну дык я это уже понял!
Причем здесь 9600?
Есть готовые модули к Дельфи (с С++Builder я ещё на "Вы") для работы с COMом. Там выставляются стандартные скорости, вплоть до 151200 (кажется...). Но я точно не знаю, как это будет работать - драйвером другой чел занимается.
А как, кстати, разогнать МК до 1Мбит/сек? Там же, вроде, настраивается стандартная скорость, выбирается кварц исходя из "таблицы ошибок"... Или не так?
Короче, я сейчас в таком дурацком положении, когда ещё ничего не ясно и можно только догадываться. Информации мало...

All
У меня, собственно, другой вопрос: нет ли у Вас примеров прошивок (или просто статей и т.п.), где идёт работа с АЦП в mega8? Передачи через 232? Короче, всего того, что может мне пригодиться.
Заранее спасибо.

[Это сообщение изменил Dikoy (изменение 14 Декабря 2003 04:41).]

AlexOr
Member

Сообщений: 342
Откуда: СПб
Регистрация: Май 2003

написано 14 Декабря 2003 16:33ИнфоПравкаОтветитьIP

Dikoy
Или не так?
Да так. Кварц всяко не ровный придется ставить.

нет ли у Вас примеров прошивок
Кинул.
Это для ICCAVR но не мега8, разницы нету.

[Это сообщение изменил AlexOr (изменение 14 Декабря 2003 17:20).]

Dikoy
Member

Сообщений: 169
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 15 Декабря 2003 01:13ИнфоПравкаОтветитьIP

AlexOr
Да так. Кварц всяко не ровный придется ставить.
Угу.

Я смотрел по таблице, составленой в каком-то московском ВУЗе. Там рекомендуется при предельной скорости RS232 и условии, что МК ещё что-то обрабатывает ставить не менее 14 МГц.

Кинул.
Спасибо, буду разбираться.

AlexOr
Member

Сообщений: 343
Откуда: СПб
Регистрация: Май 2003

написано 15 Декабря 2003 11:03ИнфоПравкаОтветитьIP

Кстати
ADM222/ADM232A/ADM242
всего до 200kbit/s Transmission Rate

лучше ADM101E
460kbit/s Transmission Rate

а более шустрых что-то и не видно.

Похоже что при разгоне на мегабит в сек проблема именно с RS-232 Drivers/Receivers

Dikoy
Member

Сообщений: 175
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 21 Декабря 2003 19:43ИнфоПравкаОтветитьIP

Похоже что при разгоне на мегабит в сек проблема именно с RS-232 Drivers/Receivers
В смысле?
Помнится, на хоботе некий Tahoe глаголил:

"Если коротко, генеральная мысль такова. Я сам работаю сейчас плотно с этими камнями (причем как с 232-ми, так и с 245-ми) и точно знаю что все работает. Больше того, я их запускал изохронном режиме, а еще измывался над ними на 512000 и 1024000 Бод. И все работает безупречно."

Надо бы поиграться с микрушкой, да доставят только после Нового Года

AlexOr
Member

Сообщений: 348
Откуда: СПб
Регистрация: Май 2003

написано 22 Декабря 2003 04:14ИнфоПравкаОтветитьIP

Dikoy
А чего с ними играться? Это строки из документации.
Оно вам надо - летом солце припечет, и начнутся глюки.

Dikoy
Member

Сообщений: 183
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 23 Декабря 2003 09:33ИнфоПравкаОтветитьIP

AlexOr
Это строки из документации.
Та ветка на хоботе как раз и началась с того, что у кого-то там что-то не работало.

Оно вам надо - летом солце припечет, и начнутся глюки.
Не надо. Мне надо ровно столько, чтоб все самплы прокачивались. Ни больше, ни меньше

Добавление от 23 Декабря 2003 10:55:

Кстати, здесь ссылка можно найти скриншот проги считывания инфы с АЦП под вынь и схемку коммутатора для подключения нескольких их к одному COMу. Примитивно, конечно, но мало-ль, мож пригодится...

Dikoy
Member

Сообщений: 320
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 23 Февраля 2004 17:54ИнфоПравкаОтветитьIP

AlexOr
Кстати
ADM222/ADM232A/ADM242
всего до 200kbit/s Transmission Rate
лучше ADM101E
460kbit/s Transmission Rate

Да это, в принципе, не очень страшно... Если скоростную микросхему-драйвер откопать не получится, всегда есть вариант с ОУ+мостовик+двуполярное питание. В стационарном приборе это не очень страшно.

All
Теперь обсудим прошивку в третьем посте.
Я не стал использовать внутренние АЦП меги - разрядность мала. По ТЗ мне нужен АЦП 12-24 разряда, так что её 10 ни в какие ворота не лезет
Так что АЦП придётся делать внешний.
Так же я не стал пока запариваться с FT245, т.к. лучше, ИМХО, сначала поэкспериментировать на чём-то по-проще (типа прокачки данных через КОМ напрямую), а уж потом, достигнув определённого уровня, всё это дальше усовершенствовать (Во как завернул! Аж самому приятно! ).
Переписать прошивку под конкретный АЦП я смогу. Вопрос по передаче через RS232.
Требуется высосать из АЦП максимум самплов и передать их на максимуме скорости через UART AVR (то есть на 115200) в КОМ.
Тогда, по скромным прикидкам, при скорости передачи 115200 можно получить 5 кСамплов с 12 разрядного АЦП. Всё лучше, чем 0.2 кСампла.
Что то мне подсказывает, что 90S8515 с его кварцем на 4 (да хоть 8) МГц не сможет этого сделать...
Так вот вопроса два:
1) Какой мне МК из линейки Atmel выбрать для этой задачи? Хватит ли ресурсов 2313 или всё же мегу придётся напрягать?
2) Как переделать под него описанную выше прогу? В смысле, передачи данных и максимального её ускорения (я там заметил несколько строк, явно замедляющих её работу). Но это, конечно, уже после выбора МК...

ЗЫ: Я не халявщик, я только учусь

Весельчак У
Moderator

Сообщений: 4829
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 24 Февраля 2004 04:24ИнфоПравкаОтветитьIP

Что то мне подсказывает, что 90S8515 с его кварцем на 4 (да хоть 8) МГц не сможет этого сделать...
А мне что-то подсказывает (калькулятор ), что 8 МГц позволит сделать 69 тактов на 1 сэмпл. Программное считывание, естественно, не получится, а через SPI (ежели АЦП имеет его) должно работать. Иначе придётся брать 16 МГц кристалл и делать полную оптимизацию по скорости, невзирая на объём кода. ~65 тактов - считывание 12 разрядов, остаётся 138-65=73 такта, в RS232 запихать(4..6 тактов), так что получается, что можно.

Тогда, по скромным прикидкам, при скорости передачи 115200 можно получить 5 кСамплов с 12 разрядного АЦП.
Ежели упаковывать 2 сэмпла в 3 байта, то и 9600 можно получить.

Хватит ли ресурсов 2313 или всё же мегу придётся напрягать?
Судя по данным atmel.ru 2313 имеет максимальную частоту 10 МГц, SPI отсутствует. Получается ~86 тактов, что должно хватить. Естественно, на 1 один канал. На 3 - нет.

Dikoy
Member

Сообщений: 322
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 24 Февраля 2004 14:59ИнфоПравкаОтветитьIP

Весельчак У
Программное считывание, естественно, не получится, а через SPI (ежели АЦП имеет его) должно работать.
Нету там СПАй... И считывание придётся делать программное, ибо АЦП все такие разные, и нужно их штуки 3 и не факт, что все 3 будут одинаковыми (это в перспективе; планируется на базе всей этой байды сделать систему стабилизации приборной полки на корабле).
Тогда, ИМХО, лучше не мегу, а ATtiny26 (или 15, какую мы там обсуждали с ядром в пиковых 26 МГц) использовать. Если памяти хватит. жалко на такое дело мегу с её прибамбасами...

Ежели упаковывать 2 сэмпла в 3 байта, то и 9600 можно получить.
Да, это мысля.

У меня, собсна, такой вопрос: судя по всему, строчка printf("MAX1241-> N=%4u U=%4umV\r\n",n, (unsigned) ((long) n*VREF/4096)); в программе отвечает за отправку через RS. Вот только я её не понимаю почти... Что в ней что делает и где, собственно, сама отправка?

Весельчак У
Moderator

Сообщений: 4833
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 25 Февраля 2004 04:23ИнфоПравкаОтветитьIP

а ATtiny26 (или 15, какую мы там обсуждали с ядром в пиковых 26 МГц) использовать
Так у Tiny15 только наружная частота такая, а внутренняя гораздо ниже (до 1,6 МГц). И в Tiny (кроме одного) нет UART. Программно генерить ещё и UART... - никаких тактов не хватит, тут уже нужен Scenix с его виртуальной периферией. Так что или Classic, или Mega, или Tiny2313 .

строчка printf("MAX1241-> N=%4u U=%4umV\r\n",n, (unsigned) ((long) n*VREF/4096)); в программе отвечает за отправку через RS. Вот только я её не понимаю почти...
Ещё раз повторяю: для достижения максимальной скорости придётся использовать ассемблер. Или, в крайнем случае, использовать непосредственный доступ к регистрам, без использования встроенных функций работы с потоками. А в этой строчке мне тоже почти ничего не понятно .

Dikoy
Member

Сообщений: 323
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 26 Февраля 2004 12:20ИнфоПравкаОтветитьIP

Весельчак У
А в этой строчке мне тоже почти ничего не понятно .
Жаль Вот уже научился я и внешние АЦП мучить, и внутренние, а с UART никак разобраться не могу
Перечитал уже раза три книжку и примеры: в каждом примере инициализация по своему сделана. Причём пбсолютно безо всяких объяснений
Ничего не понимаю... Грустно...

Добавление от 26 Февраля 2004 12:44:

Весельчак У
Кстати, я тут наваял прожку для считывания данных с внутреннего АЦП меги8. Критика приветствуется
// В программе определяются две функции для работы с АЦП:
// void InitADC(void) инициализация АЦП
// int ReadADC(unsigned char) чтение значения напряжения на заданном входе

#include <mega8.h>
void InitADC(void)
{
ADMUX = 0; // выбрать вход номер 0
ADCSR = ОхСО; // включить АЦП и запустить первое "пустое" преобразование
}
int ReadADC(unsigned char channel)
{
int i;
ADMUX = channel; // Выбрать номер входа
ADCSR |= 0x40; // Начать преобразование
while (!(ADCSR & 0x10)); // Проверка завершения преобразования
ADCSR |= 0x10; // Очистка бита "Преобразование завершено" при
// помощи записи в него "1"
i = ADCL; // Чтение младших 8 битов ПЕРВЫМИ
i += (int)ADCH « 8; // Чтение старших 2 битов, умножение их на 256
// и сложение с младшим байтом
return i;
}
void main(void)
{
unsigned int temp;
InitADC(); // Инициализация АЦП
temp=ReadADC(0); // Измерить напряжение на нулевом входе АЦП (линия РАО порта А)
}

Весельчак У
Moderator

Сообщений: 4837
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 27 Февраля 2004 03:24ИнфоПравкаОтветитьIP

i += (int)ADCH « 8;
Вроде всё нормально.
Я бы лично и с RS по такому же принципу работал, только не проверял готовность, а завёл на прерывание.

Dikoy
Member

Сообщений: 325
Откуда: Богота, Колумбия
Регистрация: Май 2003

написано 27 Февраля 2004 21:01ИнфоПравкаОтветитьIP

Весельчак У
Я бы лично и с RS по такому же принципу работал, только не проверял готовность, а завёл на прерывание.
А я вообще не представляю, по какому принципу с ним работать . Придётся, видать, ещё одну книжку покупать .

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики
Страницы: 1 2

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика