Jump to content
freebits

Atmega16 - значения с АЦП "пляшут"

Recommended Posts

Добрый день.

Реализовал получение и обработку аналогового сигнала как в данной статье -> ссылка. Т.е. используется внутреннее опорное напряжение 2,56 Вольта, прием через прерывания, а на дисплее выводится числовое значение напряжения, которое присутствует на входе АЦП - нога ADC6.

В обработчике прерывания считываются значения из регистров ADCL и ADCH, из которых формируется значение переменной adc_value. В теле программы данное значение АЦП преобразуется в значение напряжения, посредством деления adc_value на 400. Затем полученный результат выводится на дисплей.

Проблема в том, что выводимое значение не стабильно и скачет в диапазоне +/- 300 мВ. Т.е. если к аналоговому входу приложено напряжение 1,4 вольта, то на дисплее значения будут хаотично меняться в диапазоне от 1,1 Вольт до 1,7 вольт, т.е. весьма ощутимый разброс в сотни милливольт. При этом если смотреть сигнал на входе осциллографом, то по факту нет такой картины - максимальный разброс (Vpp) составляет несколько десятков милливольт, но никак не сотен. Даже если этот вход посадить на землю, все равно на дисплее будут хаотичные значения доходящие до 0.4 вольта. Откуда он берет такие цифры на понятно.

Подскажите, в чем может быть проблема и как получить стабильные показания, хотя бы до сотен милливольт?

unsigned int adc_value;

char high_adc=0, low_adc=0;

ISR(ADC_vect) //обработчик прерывания ADC_vect
{
	low_adc = ADCL;
	high_adc = ADCH; //Верхняя часть регистра ADC должна быть считана последней иначе не продолжится преобразование
	adc_value = high_adc * 256 + low_adc; //значение АЦП
}

void ADC_Init(void) //инициализация АЦП
{
	ADCSRA |= (1<<ADEN) // Разрешение использования АЦП
		|(1<<ADSC)	//Запуск преобразования
		|(1<<ADATE)	//Непрерывный режим работы АЦП
		|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//Делитель 128 = 64 кГц
		|(1<<ADIE);	//Разрешение прерывания от АЦП

	ADMUX |= 0b11000110; //Внутренний Источник ОН 2,56В вход ADC6
}

void main(void)
{
	float n = 0;
	while(1)
	{		

		n = (float) adc_value / 400; // преобразование значения АЦП в напряжение

		/*
			Отправка на дисплей
		*/

		_delay_ms(2);
		
	}
}

 

Share this post


Link to post
Share on other sites

Попробуйте частоту семплирования уменьшить. Я плохо знаком с АВРами, но сдаётся мне, что 64 КГц - это весьма немаленькая частота для подобных камушков.

А так, посоветую сделать усреднение за n-ное количество семплов.

Share this post


Link to post
Share on other sites
32 минуты назад, freebits сказал:

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

Короткие помехи, которые вы не видите осциллографом (на питании, в измеряемом источнике), отсутствие конденсатора на Vref, плохое AVcc.  

Убрать помеху,  применить усреднение. Батарейку попробуйте мерять, другой источник питания, Li, например. Попробуйте свой код в Протеусе. Если дело в коде, вылезет и там. 

Частота 64кГц - нормальная. Upd.  Заодно проверьте, не требует ли использованный  вами пример деления CLK на 8 (фьюз CLKDIV)? 

Edited by _abk_

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

20 минут назад, Alex сказал:

А так, посоветую сделать усреднение за n-ное количество семплов.

Ок, спасибо, попробую внедрить усреднение.

13 минуты назад, _abk_ сказал:

Короткие помехи, которые вы не видите осциллографом (на питании, в измеряемом источнике), отсутствие конденсатора на Vref, плохое AVcc.  

Убрать помеху,  применить усреднение. Батарейку попробуйте мерять, другой источник питания, Li, например. Попробуйте свой код в Протеусе. Если дело в коде, вылезет и там. 

Частота 64кГц - нормальная.

Спасибо, попробую поставить конденсатор 0,1 мкФ на Vref.

Вот с проверкой кода в Протеусе именно для данного случая есть загвоздка - в Протеусе отсутствует тот цифровой индикатор, который я использую - 10-пиновый трехразрядный led-индикатор. У него индикация реализована не как у стандартного нидикатора поразрядно, а посегментно, т.е. в единицу времени можно зажечь только 1 сегмент, и соответственно отрисовка цифр идет совершенно по другому. Т.е. я не смогу никак увидеть какие именно показания измеряет АЦП.

Share this post


Link to post
Share on other sites

Усреднение надо вводить в последнюю очередь, когда будет устранен такой разброс. 

0,1 мкФ на Vref обязан быть при использовании внутренней "опоры". Не забудьте про AVCC.

Для проверки в Протеусе не нужен индикатор: сделайте вывод в терминал (через UART).

 

 

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

37 минут назад, freebits сказал:

10-пиновый трехразрядный led-индикатор.... в единицу времени можно зажечь только 1 сегмент

Очень интересно. Что это за индикатор? Наименование его?

Share this post


Link to post
Share on other sites
27 минут назад, _abk_ сказал:

Усреднение надо вводить в последнюю очередь, когда будет устранен такой разброс. 

0,1 мкФ на Vref обязан быть при использовании внутренней "опоры". Не забудьте про AVCC.

Для проверки в Протеусе не нужен индикатор: сделайте вывод в терминал (через UART).

 

 

Ок, понял, спасибо. AVCC у меня подключено к выводу VCC, а VCC запитывается от стабилизированного источника питания (БП от принтера). Проверю осциллографом форму напряжения, но думаю что там напряжение должно быть без скачков. Про  UART погляжу сейчас.

10 минут назад, _abk_ сказал:

Очень интересно. Что это за индикатор? Наименование его?

Наименование отсутствует. Он от китайского цифрового вольтметра, заказывал через алиэекспресс, т.к. они уже были с внешней оправкой и цена не сильно большая.

Электрическую схему зарисовал, даже пытался выводить что-то в протеусе.

LED.thumb.png.72ecd979dc1d97a606446bd1a3fb79f3.png

Таблицу истинности тоже зарисовал. Когда заказывал, думал что будут стандартные, но пришло то что пришло

1.png.6604f09a90d9627021e3f6100f5244ad.png

 

 

Share this post


Link to post
Share on other sites
26 минут назад, freebits сказал:

AVCC у меня подключено к выводу VCC

Не пойдет :)  

AVCC надо подключить к выводу VCC через LC фильтр (0,1 мкФ, 10...47 мкГн). А лучше не к VCC, а к точке подачи VCC на плату отдельным проводком, чтобы исключить влияние неправильной разводки.  Через LC фильтр, конечно. Фильтр - непосредственно у вывода.

Про индикатор понятно.

Моделька-то работает?

Share this post


Link to post
Share on other sites
51 минуту назад, _abk_ сказал:

AVCC надо подключить к выводу VCC через LC фильтр (0,1 мкФ, 10...47 мкГн). А лучше не к VCC, а к точке подачи VCC на плату отдельным проводком, чтобы исключить влияние неправильной разводки.  Через LC фильтр, конечно. Фильтр - непосредственно у вывода.

Ммм, про данные тонкости я был вообще не вкурсе. Спасибо!  Тогда вначале переделаю аналоговое питание и добавлю фильтры!

 

51 минуту назад, _abk_ сказал:

Моделька-то работает?

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

Edited by freebits

Share this post


Link to post
Share on other sites
6 часов назад, freebits сказал:

n = (float) adc_value / 400; // преобразование значения АЦП в напряжение

Я бы сделал эту операцию атомарной, т.к. она выполняется не за один такт и в процесс деления может вклинится прерывание, которое изменит переменную adc_value (тут можно посмотреть ассемблерный листинг):

#asm("cli");

n = (float) adc_value / 400;

#asm("sei");

Share this post


Link to post
Share on other sites
4 минуты назад, kotwlf сказал:

Я бы сделал эту операцию атомарной

и без float :D

Share this post


Link to post
Share on other sites
14 часа назад, proekt07 сказал:

Питание для АЦП.

 

Снимок.JPG

Спасибо! Оказывается про это есть в даташите. Надо даташит внимательнее изучить.

 

16 часов назад, kotwlf сказал:

Я бы сделал эту операцию атомарной, т.к. она выполняется не за один такт и в процесс деления может вклинится прерывание, которое изменит переменную adc_value (тут можно посмотреть ассемблерный листинг):

#asm("cli");

n = (float) adc_value / 400;

#asm("sei");

Ясно, спасибо! Действительно в программе еще обрабатывается  прерывание переполнения таймера , поэтому запросто оно может вклиниться, учту и этот момент.

Как появится время, реализую все переделки, потом отпишусь о результатах.

Edited by freebits

Share this post


Link to post
Share on other sites

переменную adc_value может изменить только прерывание от АЦП. и никакое другое прерывание эту переменную изменить не может.

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

а ведь, кроме деления, МК должен еще успеть сделать кучу другой работы до наступления следующего прерывания от АЦП, в том чисде и вывести результат измерения на индикатор.

Share this post


Link to post
Share on other sites
В 1/22/2019 в 06:02, freebits сказал:

ISR(ADC_vect) //обработчик прерывания ADC_vect { 
	low_adc = ADCL; 
	high_adc = ADCH; //Верхняя часть регистра ADC должна быть считана последней иначе не продолжится преобразование 
	adc_value = high_adc * 256 + low_adc; //значение АЦП 
}

 

Почему сразу не написать adc_value = ADC; - пользуйтесь тем, что вам уже предоставляет компилятор, а именно доступ к двум 8-битным регистрам АЦП (кстати, и счетчикам таймеров тоже) как к одной 16-битной переменной.

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

Лично я чаще всего применяю фильтрацию скользящим средним, как самым простым и понятным вариантом:

// глубина буфера усреднения. чем больше, тем сильнее фильтрация и медленнее работа
// очень хорошо, если число кратно степени двойки (т.е. 4, 8, 16, 32, 64 и т.д.)
#define AVERAGE_DEPTH	16
  
// функция получает результат очередного замера и возвращает отфильтрованное значение
uint16_t get_average(uint16_t val){
  static uint16_t buf[AVERAGE_DEPTH];
  static uint8_t cur;
  uint16_t sum = 0;
  
  buf[cur++] = val;
  if(cur >= AVERAGE_DEPTH) cur = 0;
  
  for(uint8_t i=0; i < AVERAGE_DEPTH; i++) sum += buf[i];
  
  return sum / AVERAGE_DEPTH;
}

В вашем случае вы должны выдавать на дисплей не adc_value, а get_average(adc_value).

4 часа назад, freebits сказал:

переполнения таймера , поэтому запросто оно может вклиниться

Пусть вклинивается, онож не меняет переменную adc_value. Атомарность следует обеспечивать именно для защиты от прерывания АЦП, которое может её изменить.

Только что, Starichok сказал:

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

А вывод на дисплей? Тут не время деления важно, а независимость изменения переменной и её считывания.

Поскольку модификация переменной делается в прерывании, т.е. асинхронно по отношению к главному циклу, даже небольшая рассинхронизация рано или поздно приведет к тому, что прерывание возникнет в аккурат "между" обработкой двух байт этой переменной :) Во всяком случае, теоретически такое возможно.

Edited by ARV

Share this post


Link to post
Share on other sites
2 часа назад, ARV сказал:

А вывод на дисплей?

а прочитать мой пост до конца ты не сумел?

3 часа назад, Starichok сказал:

а ведь, кроме деления, МК должен еще успеть сделать кучу другой работы до наступления следующего прерывания от АЦП, в том чисде и вывести результат измерения на индикатор.

 

Share this post


Link to post
Share on other sites
4 часа назад, Starichok сказал:

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

У него непрерывный режим работы АЦП, так что запросто.

К тому же не приведен ассемблерный листинг операции деления - кто знает как там его компилятор делает? И параметры оптимизации кода тоже неизвестны.

Share this post


Link to post
Share on other sites
В 1/22/2019 в 10:02, freebits сказал:

выводимое значение не стабильно и скачет в диапазоне +/- 300 мВ. Т.е. если к аналоговому входу приложено напряжение 1,4 вольта, то на дисплее значения будут хаотично меняться в диапазоне от 1,1 Вольт до 1,7 вольт, т.е. весьма ощутимый разброс в сотни милливольт.

Такое поведение говорит скорее об аппаратных проблемах, чем о программных. Если бы портились байты из-за прерываний и пр., получили бы разброс на всю шкалу. Ну смотрите:  1)AVCC никак не фильтровано и прямо

В 1/22/2019 в 11:44, freebits сказал:

подключено к выводу VCC, а VCC запитывается от стабилизированного источника питания (БП от принтера).

 2) на Vref нет положенного при внутренней опоре конденсатора, 3) есть подозрение, что  неправильная разводка вкупе с динамической индикацией усугубляет дело, 4) что это за источник 1,4 В пытается  измерять ТС, на котором

В 1/22/2019 в 10:02, freebits сказал:

При этом если смотреть сигнал на входе осциллографом, то по факту нет такой картины - максимальный разброс (Vpp) составляет несколько десятков милливольт, но никак не сотен.

Если там такой разброс имеется, то чего еще ждать? Не факт, что еще и "иголок" там нет. Но это еще не все.

Об аппаратных проблемах говорит и то, что

В 1/22/2019 в 10:02, freebits сказал:

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

По-моему, так все понятно. Да еще и "посадить на землю" надо грамотно. 

Share this post


Link to post
Share on other sites
3 часа назад, kotwlf сказал:

У него непрерывный режим работы АЦП, так что запросто.

К тому же не приведен ассемблерный листинг операции деления - кто знает как там его компилятор делает? И параметры оптимизации кода тоже неизвестны.

ну, если задан непрерывный режим, то точно не успеет поделить к следующему прерыванию.

и никакая оптимизация не спасет, так как код на Си работает в несколько раз медленнее кода, написанного на ассемблере.

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

или запускать измерение по таймеру и суммировать несколько измерений для вычисления среднего.

Share this post


Link to post
Share on other sites

Давайте внесу ясность, чтобы предметно говорить и не гадать на кофейной гуще, что есть по факту  и для чего все.

В общем, я конструирую паяльную станцию. На данный момент все подключено в точности по схеме ниже (только что зарисовал) и все работает прекрасно, кроме, конечно же, регистрации температуры. Даже интерфейсная оболочка уже написана (выбор одного из 5-ти термопрофилей: два готовых (бессвинцовый и свинцовосодержащий припой) и три ручных). На данном этапе произвожу наладку регистрации температуры. Имеется датчик температуры  до 500°С - позистор, у которого сопротивление меняется от 0 до 60 Ом (при комнатной температуре 10 Ом). Предусилительный каскад отлажен и испытан при помощи на 100-омного переменного резистора вместо датчика температуры. На выходе каскада, как и задумано, напряжение меняется от 0 до 2,6 Вольт при изменении сопротивления от 0 до 60 Ом. Есть калибровка через подстроечный резистор. Осталось теперь оцифровать значение на аналоговом входе для дальнейшей обработки.  Порт С пока не задействован, т.к. на данном контроллере находится в неисправном состоянии. После замены микросхемы, порт С планируется задействовать на управление 5-ью секциями нагревателей (каждая секция - это два 1 кВт-ных нагревателя, подключенных последовательно; итого 10 нагревателей общей мощностью 2,5 кВт). Секции можно отключать/включать в зависимости от заданных настроек. Плюс также порт С будет задействован на индикацию 3-х светодиодов. Итого свободным будет только 1 пин PA7 (DCA7), который возможно тоже будет задействован в качестве обратной связи с драйверов нагревателей. 

5c492adb18d92_.thumb.png.a634b64297bf7f28d8cf40fb37f4789c.png

Как мне подсказали выше, предстоит переделать аналоговое питание, ввести фильтры, в т.ч. опорного напряжения, аналогового питания и, я так думаю, еще аналогового сигнала.

12 часа назад, Starichok сказал:

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

или запускать измерение по таймеру и суммировать несколько измерений для вычисления среднего.

Скорее всего так и сделаю - буду производить измерение по таймеру.

13 часа назад, _abk_ сказал:

По-моему, так все понятно. Да еще и "посадить на землю" надо грамотно. 

По поводу "посадки на землю" я погорячился)) я имел в виду, что на выходе предусилительного каскада присутствовал 0, это конечно не одно и тоже. Но осциллографом отчетливо было видно, что там нет шума амплитудой 0,4 Вольта.

В выходные реализую переделки по питанию, и фильтры. До выходных переделаю постоянное измерение на измерение по таймеру.

Share this post


Link to post
Share on other sites
В 23.01.2019 в 13:27, ARV сказал:

Лично я чаще всего применяю фильтрацию скользящим средним, как самым простым и понятным вариантом:


// глубина буфера усреднения. чем больше, тем сильнее фильтрация и медленнее работа
// очень хорошо, если число кратно степени двойки (т.е. 4, 8, 16, 32, 64 и т.д.)
#define AVERAGE_DEPTH	16
  
// функция получает результат очередного замера и возвращает отфильтрованное значение
uint16_t get_average(uint16_t val){
  static uint16_t buf[AVERAGE_DEPTH];
  static uint8_t cur;
  uint16_t sum = 0;
  
  buf[cur++] = val;
  if(cur >= AVERAGE_DEPTH) cur = 0;
  
  for(uint8_t i=0; i < AVERAGE_DEPTH; i++) sum += buf[i];
  
  return sum / AVERAGE_DEPTH;
}

В вашем случае вы должны выдавать на дисплей не adc_value, а get_average(adc_value).

Спасибо за код! Подскажите здесь при каждом вызове функции массив buf будет переинициализироваться или как раз конструкция static защищает от этого?

Share this post


Link to post
Share on other sites
Только что, freebits сказал:

Подскажите здесь при каждом вызове функции массив buf будет переинициализироваться или как раз конструкция static защищает от этого?

Все static-переменные инициализируются один раз, потом сохраняют свое состояние.

Share this post


Link to post
Share on other sites
1 минуту назад, ARV сказал:

Все static-переменные инициализируются один раз, потом сохраняют свое состояние.

Понял, спасибо.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
    • By pryanic
      Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.
      На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.
      Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 
      В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
       
       
      ADC_test.zip
    • By dav1977
      Кто-нибудь запускал скоростные  АЦП  AD7606(последовательного приближения)
       в последовательном режиме считывания данных ?,
      из 4 шт одна заработала, остальные на выводе последовательного вывода DOUT ничего не выдают постоянно 0.
      пробовал переключаться с внутренним опорным источником(выдает 2.49), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

    • By dommax
      Распродаю остатки радиодеталей.
      Для удобного поиска написал WEB страничку http://detali.syremo.com.ua/
      Количество может не совпадать. Пишите - отвечу. Договоримся...
      Отправляю только по Украине. Перед отправкой смогу сделать фото.
    • By maxssau
      День добрый!
      Сегодня хотелось бы раcсказать о своей разработке - АЦП AD-01 на преобразователе от Cirrus Logic CS5381.
      Целью данной разработки было получение близких к даташитным параметрам характеристики АЦП, при этом плату имеющeю не высокую стоимость и универсальность.
      На данный момент это уже третья версия платы. Первая версия была сделана ЛУТом, для отработки схемотехники АЦП. Далее последовала вторая версия на заводских платах:

      Схемотехника была взята полностью из даташитов. Стандартное включение CS5381, стабилизаторы питания в цифровой части AMS1117-3.3, в аналоговой из серии TPS7A.
      Схемотехника входного буфера взята из даташита на OPA1632.
      После опробования данной платы, были выявлены некоторые недочеты и разработана третья версия версия:

       
      Входной буфер сделан для 2х вариантов: с конденсатором и без, для чего на ПП предусмотрены соответствующие площадки.

      Топология такого буфера позволяет без переделок проводить замеры/запись как балансного сигнала так и не балансного, достаточно вывод 3 посадить на землю (2). Это достаточно удобно, для различных типов сигнала достаточно иметь 2 пары кабелей с различной распайкой.
      Питание аналоговой части сделано на малошумящих стабилизатора TPS7A4901 и TPS7A3001.

      Питание цифровой части на 2х AMS1117-3.3В, схему нет смысла приводить, она из даташита на стабилизаторы.
      На плате всего 1 генератор на 512fs (24.576 Мгц). Такая частота выбрана не случайно, для работы SPDIF передатчика необходимо иметь частоту мастерклока не ниже 256fs для работы на частоте 96к, я использую передатчик на WM8805 (о этой плате чуть ниже). В качестве интерфейса на компьютере я использую ЗК E-MU 0404 PCIe.
      Полная схема преобразователя:

      На плате присутствует место под DIP переключатель, для настройки режимов работы АЦП. Выход АЦП - I2S, уровни 3.3В.
      Для соединения с компьютером была разработана плата SPDIF интерфейса SI-01.

      Схему приводить особого смысла нет, она повторяет даташитную для WM8805 включенным в HW режиме. В этом режиме есть определенные ограничения, связанные с работой PLL, поэтому максимальная частота приёма/передачи ограничена в 96к. WM8805 позволяет работать как в Master режиме, так и в Slave, что очень удобно. Выбор режима осуществляется установкой джампера. Так же на плате присутствуют джамперы выбора питания, от ЦАП или АЦП. В качестве выходного буфера для передатчика используется 1G125.
       
      Шумовая полка:

      В качестве источника питания пара трансформаторов с стабилизаторами 317/337, даже имея ёмкости в 10000 мкФ полностью подавть 50Гц и гармоники пока не удалось, возможно проблема в корпусе и компоновке.
      Замер моего ЦАПа на 4490, к сожалению не обошлось без земляных петель, поэтому присутствует шум на уровне -125дБ и ниже.

       
      Есть определенные особенности применения ИМС CS5381, скупо описанные в App Notes, позволяющие реализовать данную ИМС в двойном моно и теоретическим уровнем THD+N в -123дБ, что позволит производить оценку и замеры искажений у большинства современных ИМС ЦАП без режекторов.
      В проекте плата с 2мя генераторам на сетки частот 44.1 кГц и 48 кГц, АЦП включенным в моно режимах и DSP процессором ADAU1452.
      Подробную инструкцию с описание на текущую схемы и платы прикладываю.
      инструкция.pdf
  • Сообщения

    • Коттедж есть, но так себе, машинка есть, но тоже так себе, одет так себе, дочка одета тоже так себе, яхты нет, но есть моторная лодка,  гнилая...  Оффшор само собой у него был, но на черный день токмо. 
    • Фона не было в двух каналах подключенных к одному БП?
    • @100482 А у Вашего источника ("регулируемый БП"), - как выглядит выход (схема регулятора... на чём собран)... большая ли емкость на выходе?
    • Это как "осетрина второй свежести" у Булгакова ? «—Осетрину прислали второй свежести, — сообщил буфетчик. —        Голубчик, это вздор! —        Чего вздор? —        Вторая свежесть — вот что вздор! Свежесть бывает только одна — первая, она же и последняя. А если осетрина второй свежести, то это означает, что она тухлая!»
    • Диоды должны быть высокочастотные и с малым напряжением падения. Из отечественных можно попробовать Д311. Конденсаторы около 0,1 мкФ. Диоды выпрямляют переменное ВЧ напряжение (которое на катушке создаёт электромагнитное поле) и заряжают конденсаторы, светодиод начинает светиться. Почитайте про выпрямители и всё поймёте. Про диоды можно почитать здесь
    • При питании 70в  ограничение отрицательного периода синусоиды  начинается намного раньше ( 19в ) чем положительного
    • Сугубо ИМХО, мощность в смартфоне ограничена по определению. Хоть по току, хоть по напряжению. Поэтому скорее всего высокоомные наушники имеют бОльшую звуковую отдачу, чем  обычные. Видимо так технологически получается. 
  • Покупай!

×
×
  • Create New...