PDA

Просмотр полной версии : Блок съёма данных + генератор.



Roadman
25.07.2010, 23:08
Данную штуку но очень давно хотелось иметь. Ввиду того что я сам постоянно перемещаюсь, то нет возможности таскать с собой все приборы. Зато есть возможность кататься с чемоданчиком "ноутбук + железки". Плюс ко всему весьма охота измерять добротность на заданной частоте, АЧХ...

Что нужно на данный момент, сигнал-генератор (синус) на AD9951, AtMega8 (мост между ПК и устройствами).
Что нужно от контроллера:
- работа по UART ибо програмлю под нетворком а последовательный порт поддерживается платформой
- управление SPI устройствами, в частности AD9951
- съём данных с АЦП
- соотвественно обмен с ПО установленным на ПК.

Что следует в дальнейшем:
- подключение к АЦП детекторов AD8307
- ну можно к АЦП ещё и по закону Ома (вольтметр, амперметр)
- подключение различных измерительных мостов (сопротивление, ёмкость, индуктивность, добротность)
- ну если учесть что есть перестраиваемый генератор и детектор то АЧХ, антенку можно померять

Связь с ПК и ПО по протоколу RS-232, терминалом.

Задаюсь вопросом к общественности нужна ли Вам такая универсальная штука?

Для понимающих в програмлении контроллеров дам намётку с первичного опробирования связи с софтом. Особо загонятся не стал взял Bascom ибо привык к диалоговым языкам.

$regfile = "m8def.dat"
$crystal = 12000000
'$crystal = 14745600 ' Частота тактового генератора
$baud = 57600 ' Установка скорости UART
'$baud = 115200
'$baud = 38400

Config Adc = Single , Prescaler = Auto , Reference = Internal ' Конфигурация АЦП
Config Spi = Hard , Master = Yes , Data Order = Msb ' Конфигурация SPI
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Counter , Prescale = 256 . Edge = Falling ' Конфигурация таймера

'Debug On

Dim C As String * 4 ' Строка для организации терминальных комманд
Dim Cfr1(5) As Byte ' Конфигурационный регистр
Dim Cfr2(4) As Byte ' Конфигурационный регистр
Dim Asf(3) As Byte ' Скалярный регистр
Dim Arr(2) As Byte ' Амплитудный регистр (рампа)
Dim Ftw0(5) As Byte ' Аккамулятор частоты
Dim Pow0(3) As Byte ' Аккамулятор фазы
Dim Ftw As Double
Dim Count As Word ' Счётчик

Start Adc ' Старт аналого-цифрового преобразователя
Spiinit ' Инициализации SPI модуля

'Инициализация Ad995x
Cfr1(1) = &H00
Cfr1(2) = &H00
Cfr1(3) = &H00
Cfr1(4) = &H00
Cfr1(5) = &H00
Spiout Cfr1(1) , 5

Cfr2(1) = &H01
Cfr2(2) = &H00
Cfr2(3) = &H00
Cfr2(4) = &H00
Spiout Cfr2(1) , 4

Asf(1) = &H02
Asf(2) = &H00
Asf(3) = &H00
Spiout Asf(1) , 3

Arr(1) = &H03
Arr(2) = &H00
Spiout Arr(1) , 2

Ftw0(1) = &H04
Ftw0(2) = &H00
Ftw0(3) = &H00
Ftw0(4) = &H00
Ftw0(5) = &H00
Spiout Ftw0(1) , 5

Pow0(1) = &H05
Pow0(2) = &H00
Pow0(3) = &H00
Spiout Pow0(1) , 3

' Главный цмкл программы
Do

Input "Enter command:" , C
Select Case C
Case "GLV0" : Print "LV0:" ; Getadc(0)
Case "GLV1" : Print "LV1:" ; Getadc(1)
Case "GLV2" : Print "LV2:" ; Getadc(2)
Case "GLV3" : Print "LV3:" ; Getadc(3)
Case "GLV4" : Print "LV4:" ; Getadc(4)
Case "GLV5" : Print "LV5:" ; Getadc(5)
Case "GLV6" : Print "LV6:" ; Getadc(6)
Case "GLV7" : Print "LV7:" ; Getadc(7)

Case "SFTW":
Input "Input Word:" , Ftw

Case "GFTW" : Print "FTW:" ; Ftw

Case "GCT1" :
Timer1 = 0
Start Timer1
Waitms 1000
Print "CT1:" ; Timer1
Stop Timer1

Case "GCT2" :
Timer1 = 0
Start Timer1
Waitms 100
Print "CT2:" ; Timer1
Stop Timer1

Case "GCT3" :
Timer1 = 0
Start Timer1
Waitms 10
Print "CT3:" ; Timer1
Stop Timer1

Case "GTMR" :
Timer0 = 0
Start Timer0
Waitms 1
Print "TMR:" ; Timer0
Stop Timer0

Case "GHDW" : Print "HDW:UHM"
Case "GVER" : Print "VER:1.0"
Case Else : Print "Incorrect command"
End Select
Loop
End


Секрета особо никакого нету подтолкнула на это данная реализация
http://www3.telus.net/ta/NimbleSig%20III/
Надобно тупо просто контроллер сменить, и всю основную работу на ПК переложить.

Ну и скриншотик пробного прогона. Вроде эмуляции снятия АЧХ, ДДСка пока не задействованна, просто с АЦП снял показания.

UA0YAS
29.07.2010, 14:42
Собрал схемку буквально на картонке,прошил с горем пополам,подключил-работает!!! Саша,давай уже изобретай детекторы и делители,будем измерять! в планах новый трансивер,будем его настраиать с этим приборчиком:super:
PS..Геннадию Завидовскому респект за программатор

UA0YAS
31.07.2010, 20:48
вот первые результаты по работе прибора.измерения проводились по упрощенному способу, напряжение подавали сразу на вход процессора без всяких делителей,чтоб снизить погрешность измерений. чтоб не спалить процессор, величина напряжения была установлена 0,3 вольта. вот скрин экрана программы.смотрим верхнее левое окно Voltmeter1 и фотку дисплея китайского мультиметра,подключе нного параллельно.на остальные окна внимания не обращаем-они не задействованы.

UA0YAS
03.08.2010, 05:27
произвел испытания прибора на предмет измерения постоянного тока малой величины..на рисунке скрин окна программы и фото шкалы поверенного милиамперметра класса точности 0,2. предел шкалы 1,5ма. На скрине смотрим окно амперметра в верхнем ряду .снимал телефоном,за качество извиняюсь...

UA0YAS
03.08.2010, 05:43
Опыт по измерению тока величиной 0,12ма. На этом диапазоне за точность показаний милиамперметра не ручаюсь-просто нечем было его поверить:-(

UA0YAS
03.08.2010, 05:54
Еще один опыт по измерению тока величиной 0,04ма. На этом диапазоне за точность показаний милиамперметра не опять же не ручаюсь. Ток меньше 0,035 ма прибор уже не фиксирует:cry:
Саша,давай уже тестить высокочастотный вольтметр ?

Roadman
04.08.2010, 20:45
Да я то не против у ВЧ части там как раз самое интересное будет :smile: Для ВЧ части нужно детектор... Если учесть что детектор будем к вольтметру постоянного тока подключать, то... Господин метролог каковы ваши заключения относительно вольтметра (тобишь АЦП)?
Я смотрю пока я со своим "байком" копался в гараже UA0YAS уже метрологические исследования провёл. Интересно эт на каких шунтах делал?
Я смотрю часовой кварц стоит как вкопанный, 500мс кажет чётко.

Roadman
08.05.2011, 22:05
Возвращаясь к теме... Геннадий Завидовский вот что получилось на Вашей платке касательно AD8310, но чем не паспортное -95дБВ, очень даж рядом (правда без нагрузки). Плата фактически не собранна до конца, питается от импульсного БП. Идея в отвязке земли весьма благотворно сказалась.

Genadi Zawidowski
08.05.2011, 22:11
касательно AD8310, но чем не паспортное -95дБВ, очень даж рядом (правда без нагрузки).
Дорабатывать пришлось? У меня что-то с фильтрацией выхода детектора не получалось... Что сделали? Схему можно?
Шкала, как я понял, некалиброванная?
Идея Вам:
Я тут делал измеритель мощности со встроенным АЦП АТмеги. Применил оверсэмплинг - в расчёты уходила сумма последовательных 64 отсчётов 10-разрядного АЦП (работающего по прерываниям, с равноверно расположенными по времени выборками). Кажется, пара разрядов точно добавилась.

Roadman
08.05.2011, 22:24
Геннадий я распаял элементы согласно даташиту к детектору, тоесть без доп. конденсаторов 220пф и пр. Соотвественно порезал дорожки ибо для 10-й ошибки на плате. Фильтрации выхода никакой, напрямую с детектора на вход АЦП МК. Едино преобразование делаю так...



void ADC_Conv(void)
{
ADCSRA |= (1<<ADSC); //Запуск первого преобразования (холостое преобразование)
while (ADCSRA & (1 << ADSC)); //Ждать завершения преобразования
ADCSRA |= (1 << ADSC); //Запуск преобразования
while (ADCSRA & (1 << ADSC)); //Ждать завершение преобразования
adc[0] = ADCL; //Запись младшего байта
adc[1] = ADCH; //Запись старшего байта
}


Думаю фильтрация может дать плоды как и оверсемплинг, но пока битва идёт с обменом. Я применил Wake протокол http://digit-el.com/files/open/wake/wake.html
У автора были ошибки в примерах пришлось исправлять. С утилитой автора вроде всё работает но вот в своём софте идёт война, воюю с ком-порот, теряются пакеты. Величины идут от слопера в 24мВ. Но я поступил по другому вычислил от хекс числа приращение в дБ и вывел константу (0.10416666666666666 666666666666667F), при Uref = 2.56 и поэтому лишние вычисления отсутсвуют. Ну на экране я просто тупо 1600 раз снял показания с детектора.

Genadi Zawidowski
08.05.2011, 22:40
Геннадий я распаял элементы согласно даташиту к детектору, тоесть без доп. конденсаторов 220пф и пр.
Вот странно... У меня не получалось. Можно подробнее, как стала выглядеть схема? Какую именно картинку из даташита спаял?

Roadman
08.05.2011, 22:45
Вот так спаянно, и прям с выхода МГТФом на АЦП. Самое странное у меня даж тантал не распаян его попросту нет у меня.

Genadi Zawidowski
08.05.2011, 22:52
Вот так спаянно, и прям с выхода МГТФом на АЦП. Самое странное у меня даж тантал не распаян его попросту нет у меня.

А, понял. В обход "повторителя" - потому пришлось перерезать провода? Если выпаять операционник, можно и без перерезания обойтись?

Соотвественно порезал дорожки ибо для 10-й ошибки на пл

Всё равно не понял, что пришлось перерезать.

зы: "для тех, кто только что к нам присоединился" - схема (с ошибками) в аттачменте.
ps2: RN3QMP, посмотри на монтажную схему - как должны быть припаяны конденсаторы 1206 вокруг MAX3232 . Может, потому и сбоит компорт?

Roadman
08.05.2011, 22:55
Ошибки на плате касательно AD8310, фактически 50% линий ошибочны, даже на схеме у Вас сразу видны. MAX3232 тоже не заработает, ошибки плачевны почти все проводники ошибочны, поэтому я подкинул платку USB-UART. Геннадий а случаем не повторитель у Вас гадил? Попробую я его запаять и сравнить результат.

Genadi Zawidowski
08.05.2011, 23:00
Нет ошибки на плате касательно AD8310, фактически 50% линий ошибочны. Геннадий а случаем не повторитель у Вас гадил? Попробую я его запаять и сравнить результат.

С AD8310 повторитель не нужен. Вообще.

Соотвественно порезал дорожки ибо для 10-й ошибки на пл

Что пришлось резать?

Roadman
08.05.2011, 23:04
Значит AD8310 выгодней она и дешевле. А вы сдаташитом MAX3232 сравните и поймёте, что весь ряд от 1 до 8 пина вы на пин то и спустили вниз (иль вверх):)Я что т резал-резал и в итоге не заработало и я просто сделал быстрей, см. фото :) Вот ещё раз прогнал и включил поправку на величину в дБм, всё взято в даташите, читать там. Видно даж на двух всплесках выбивает пакеты, вот борюсь с этим. График эмулировал и сравнивал с даташитными графиками, опирался на них.

ut1wpr
08.05.2011, 23:15
Применил оверсэмплинг - в расчёты уходила сумма последовательных 64 отсчётов 10-разрядного АЦП (работающего по прерываниям, с равноверно расположенными по времени выборками). Кажется, пара разрядов точно добавилась.Гена, привет.
Я сейчас практикую приблизительно такой метод. Делаю N^2 + 2 выборок. Скажем 18. Потом прогоняю сортировку массива методом вставки (для малых размеров массива достаточно быстрый). Потом суммирую без первого и последнего элементов массива и делю сдвигом. Тоже неплохо "чистит"...

Roadman
08.05.2011, 23:19
Мужики если подкините алгоритм оверсемплинга, то могу попробовать, так пока я его сделаю....
А вот простой тест, пальчиком за землю BNC разъёма, чует моментно, а пальчиком к земле на плате реакция нулевая.

Genadi Zawidowski
08.05.2011, 23:35
Код с оверсэмплингом. Возврящает 16-бит значение.


unsigned int adcsumx;
unsigned int adcsum;
unsigned char adccount;
#define ADC_VREF_TYPE 0x40
// ADC interrupt service routine
// with auto input scanning
ISR(ADC_vect)
{
// Read the AD conversion result
unsigned int adc_data = ADCW;
// Start the AD conversion
ADCSRA|=0x40;
adcsum += adc_data;
if (++ adccount >= 64)
{
adccount = 0;
adcsumx = adcsum;
adcsum = 0;
}
}

void hardware_adc_initial ize(void)
{

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=0 | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;
}

uint16_t hardware_adc_read(vo id)
{
unsigned v;
disableIRQ();
v = adcsumx;
enableIRQ();
return v;
}



Ты запаял (на фото) конденсаторы ПОПЕРЁК предназначенных для них площадок. Попроси у Сергея фото, попробуй рассмотреть.

Roadman
09.05.2011, 02:21
Ну да есть эффект. Кондеры поперёк :) Третья картина кварцевый генератор был подкинут на вход детектора.

Genadi Zawidowski
09.05.2011, 07:07
Ну да есть эффект. Кондеры поперёк :)

Смотрю на картинки... Не нравятся мне эти выбросы на графике. Ты случайно не выкинул функции disableIRQ() и enableIRQ() из текста? Это cli() / sei():



#define enableIRQ() do { sei(); } while (0)
#define disableIRQ() do { cli(); } while (0)



Для съёма характеристик и подстроек может быть медленно. Сейчас настроено 125 кГц тактовая, примерно 12 кГц выборки, 4 оверсэмпленных результата в секунду. Экран будет перерисовываться долго. Надо поднять скорость до максимума, что позволит аппаратура анлогово-цифрового преобразователя и какой-то более разумный (не 64, а поменьше) счётчик.

Roadman
09.05.2011, 13:36
Про АЦП. У меня так.
АЦП постоянно включенно, делитель х64 (8000 / 64 = 125кГц). Включенно постоянно потому что после включения требуется 25 тактов для преобразования, в остальном 13-14 тактов. Из литературы вычитанно, что наибольшая точность достигается при 50-200кГц тактовой частоты модуля АЦП. Если достаточно точности меньше 10 бит, то можно увеличить тактовую. Ну оверсемпл я просто циклом сделал. Попробую погонять на клоке повыше на 250кГц, посмотрим что будет.
Прерывания я не использую, я вообще сторонник петлевых и циклических алгоритмов, UART у меня только работает по прерыванию, ибо ему отдан самый высший приоритет.
По поводу выбиваний это не МК я предупреждал пока с софте не всё гладко на ПК. Утилита автора WakeUP! По крайне мере в 60000 циклах ошибку не показала. При скорости UART 19200, разница между оверсэмплом и без такового, с оверсемплом выполнение обмена за 15мс, без него 7мс, тоесть в два раза. По большому счёту 400 выборок по 15мс = 6сек на прогон, при скорости 38400 это значение сокращается в два раза, но постоянно вылезает ошибка обмена и теряются чаще пакеты.

Roadman
11.05.2011, 19:36
Геннадий пока сделал попроще, как в апноуте Атмела. Фото для сравнения с предыдущими, пошустрей конечо.



void ADC_Over(void)
{

uint8_ti;

for(i=0;i<16;i++)//Накапливаем сэмплы, по типу 4n, где n-желаемое увеличение точности (кол-во бит)
{
ADCSRA|=(1<<ADSC);//Запуск преобразования
while(ADCSRA&(1<<ADSC));//Ожидание окончания преобразования
adcsum_accu+=ADCW;//Накапливаем семпл в аккамулятор
}
adcsum_result=(adcsu m>>2);//Сдвигаем результат (вправо) на n и помещаем его в переменную результата
adcsum=0;//Обнуляем аккамулятор
}

Genadi Zawidowski
11.05.2011, 19:43
adcsum_result=(adcsu m>>2);//Сдвигаем результат (вправо) на n и помещаем его в переменную результата
Вот это не стоит делать. Используй все разряды что получились - и всё.
Ещё, мне казалось что в оверсэмплинге важна монотонность по времени выборок.

Roadman
11.05.2011, 19:52
Ну насчёт шифта эт вроде как для чистки:) Не факт что монотонность, в цифре, идёт битва за результат, а вот как он достигнут будет, тока лаб. работами и прогонами можно увидеть. Я заложил для экспериментов, Вами предложенный, Атмелом предложенный и без оверсемпла. По Атмеловскому сценарию сделал 12, 14 и 16 бит, командой на выбор, а там дело покажет. Так пожалуй ДДС не машает оживить, там нет подводных, кроме питания?

Genadi Zawidowski
11.05.2011, 20:09
Так пожалуй ДДС не машает оживить, там нет подводных, кроме питания?
Ресет... Всё ест по питанию около 800 мА (со включённым INV COSINE для равномерности). Ресет формируется монитором - подобрать с запасом.
Земля генератора плохая (подниамется нижняя полка) - я перемычки бросал. Короче, убюлюдочная плата.
Не забыть корпус разъёма (разъёмов детектора и выхода сигнала) заземлить прямо на месте их припайки.