Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП ATxmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
KIG
Добрый вечер.

Проблема с АЦП AtXmega. Подаю переменное напряжение (1В) на диф входы АЦП. АЦП замеряет код с постоянной подставкой в 200мВ. Осциллограф также видет постоянную подставку. Величина подставки зависит от величины переменного напряжения. Кто-нибудь с таким сталкивался?
ArtemKAD
В проце на входах стоят защитные диоды которые при отрицательной полуволне открываются, что ускоренно разряжает тот последовательно соединенный кондер который у Вас стоит. При положительной полуволне естественно на величину этого разряда поднимается постоянная составляющая всего сигнала...
ЗЫ. Найдите у себя в схеме такую цепочку http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...pe_detector.gif ...
KIG
Попробовал подать переменный сигнал напрямую на ножки PIN0, PIN4 порта В. АЦП работает в диф. режиме с уилением. Коэффициент усиления равен 1. При этом код АЦП показывает наличие постоянной подставки отрицательного уровня примерно в 10-100 мВ , в зависимости от уровня переменного сигнала. Подскажите, пожалуйста, откуда берется эта подставка и как от нее избавиться?

Согласно тех описанию АЦП, возможно производить корректировку показаний АЦП с помощью калибровочного регистора. Для выполнения калибровки АЦП необходимо сосчитать соответствующее калибровочное значение из сигнатурного кода производителя. Как это сделать? Может ли это быть причиной появления постоянной подставки?
V_G
Диапазон напряжений на всех ногах процессора, включая АЦП, должен быть от нуля до напряжения питания. Сначала выполните это условие, потом говорите о подставке и о калибровочных величинах.
Юрий_СВ
Цитата(KIG @ Jul 16 2011, 12:02) *
Попробовал подать переменный сигнал напрямую на ножки PIN0, PIN4 порта В. АЦП работает в диф. режиме с уилением. Коэффициент усиления равен 1. При этом код АЦП показывает наличие постоянной подставки отрицательного уровня примерно в 10-100 мВ , в зависимости от уровня переменного сигнала. Подскажите, пожалуйста, откуда берется эта подставка и как от нее избавиться?

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

Гадать не хотелось бы.
Где схема источника сигнала для АЦП ? Где название кристалла ?
Где инициализация АЦП ?
(хорошо хоть об диф.режиме и усилении обмолвились)

Если вы подаёте на вход АЦП сигнал с ОУ и меняете амплитуду изменением коэф-та усиления ОУ - то сразу возникает вопрос: величина U смещения ОУ и коэф. усиление.

Если вы даже не грузите калибровочные значения в АЦП, то о чём спрашивать дальше ?

Теор-ки, АЦП калибруется по смещению и коэф-ту усиления.
Но для данного АЦП производитель не расшифровывает назначение калибровочных значений.
Он говорит, что АЦП не предназначено для калибровки пользователем.
Пользователь лишь должен загрузить значения заводской калибровки из Production Signature Row.


Цитата(V_G @ Jul 16 2011, 13:16) *
Диапазон напряжений на всех ногах процессора, включая АЦП, должен быть от нуля до напряжения питания. Сначала выполните это условие, потом говорите о подставке и о калибровочных величинах.

Для данного случая диапазон уже (0 - 2,4 В).

Что такое "подставка" - не очень понятно. Наверное, тоже, что и ПОДСТАВА. sm.gif
(видимо, речь о смещении ...)
KIG
Источником сигнала является генератор типа PV6501. Сигнал с выхода генератора поступает со смещением в половину размаха величины сигнала (под размахом понимаю разницу между максимальным значением и минимальным). Чтобы избавиться от смещения последовательно к выходу генератора подключаю емкость. Далее сигнал поступает на ножки АЦП.

Использую ATxmega192A3. Частота внешнего кварца 7.3728 МГц. Далее привожу код инициализации АЦП:
Код
void ADC_init()
{

ADCB.CTRLA=1;
ADCB.CTRLB=(1<<4)|(1<<2);
ADCB.REFCTRL=(1<<4)|(1<<1);
ADCB.PRESCALER=(1<<1)|(1<<2)|1;
ADCB.CH0.CTRL=3;
                    
ADCB.CH0.MUXCTRL=0;
ADCB.CH0.INTCTRL=3;

}

void main()
{
   ADCB.CTRLB|=(1<<3);//старт преобразований АЦП
}


Предделитель 512. Для данной частоты и 8 битного результата частота дискретизации АЦП должна быть 2880 Гц, а у меня получается 14150 Гц. Правильно ли я понял Даташит?

Как же все таки загрузить в калибровочные регисторы значение заводской калибровки (и как их определить)?

Даже когда подаю сигнал с генератора без емкости все равно присутствует отрицательное смещение.
Юрий_СВ
Цитата(KIG @ Jul 17 2011, 19:48) *
Источником сигнала является генератор типа PV6501. Сигнал с выхода генератора поступает со смещением в половину размаха величины сигнала (под размахом понимаю разницу между максимальным значением и минимальным).

Как у него устроен выход - одному Богу известно. Тем более, если вы его грузите на ёмкость + диоды.

Цитата(KIG @ Jul 17 2011, 19:48) *
Чтобы избавиться от смещения последовательно к выходу генератора подключаю емкость. Далее сигнал поступает на ножки АЦП.

"странный" способ избавится от смещения. Тут будет вноситься смещение. Причём вряд ли кто-то сможет сказать каким именно оно будет. Будет зависеть от качества защитных диодов.

Цитата(KIG @ Jul 17 2011, 19:48) *
Использую ATxmega192A3. Частота внешнего кварца 7.3728 МГц. Далее привожу код инициализации АЦП:
Код
void ADC_init()
{

ADCB.CTRLA=1;
ADCB.CTRLB=(1<<4)|(1<<2);
ADCB.REFCTRL=(1<<4)|(1<<1);
ADCB.PRESCALER=(1<<1)|(1<<2)|1;
ADCB.CH0.CTRL=3;
                    
ADCB.CH0.MUXCTRL=0;
ADCB.CH0.INTCTRL=3;

}

void main()
{
   ADCB.CTRLB|=(1<<3);//старт преобразований АЦП
}


Предделитель 512. Для данной частоты и 8 битного результата частота дискретизации АЦП должна быть 2880 Гц, а у меня получается 14150 Гц. Правильно ли я понял Даташит?

1) сначала АЦП вЫключаем, чистим, настраиваем, грузим калибровочные значения и только потом включаем. (у вас наоборот)
2) Вы выбрали в качестве опорного VCC/1.6 - самое нестабильное. Но зачем тогда включаете внутренний опорник ? (я бы не начинал с нестабильного опорного. не лучше ли, для начала, внутренний опорник ?)
3) на сколько я понял, вы вручную запускаете каждое преобразование (НЕ непрерывный режим). Тогда при чём тут "частота дискретизации". Делитель определяет только частоту синхронизации АЦП.
В вашем случае : "переферийная синхронизация" / 512. Чему у вас равна "переферийная синхронизация" я не знаю. Если вы правильно запустили кварц, выбрали его как источник синхронизации, и установил все делители и умножитель в 1, то тогда "переферийная синхронизация" действительно равна частоте кварца.

Цитата(KIG @ Jul 17 2011, 19:48) *
Как же все таки загрузить в калибровочные регисторы значение заводской калибровки (и как их определить)?

Калибровочные значения вы должны прочитать с Production Signature Row и записать в регистры АЦП.
Я (в WinAVR) делал так :
(вроде получалось)
Код
unsigned char Production_Signature_Row_Read(unsigned char num)
{
unsigned char data;
asm volatile("cli\n\t"::);
NVM.CMD=0x02;
data=pgm_read_byte(num);
NVM.CMD=0x00;
asm volatile("sei\n\t"::);
return data;
}

Но, если трудно прочитать самому - возьмите значения считанные программатором (AVRISP mkII + AVR Studio). Закладка Advanced.

Настраиваю АЦП так :
Код
ADCA.CTRLA=0x02;     // выключаем и чистим АЦП
ADCA.CTRLB=0x10;     // знаковый, 12-бит, выравнивание вправо, "непрерывный" режим выключен

ADCA.REFCTRL=0x30;   // опорное с порта B, внутр. опорник и "температурный опорник" - выкл
//ADCA.REFCTRL=0x02;   // внутреннее опорное 1,0 В, внутр. опорник - вкл и "температурный опорник" - выкл // ОТЛАДКА !!!

ADCA.EVCTRL=0x01;    // запуск только канала 0 по событию № 0
ADCA.PRESCALER=0x05; // пусть 250 кГц. Предположительно, синхро переферии / 128
ADCA.INTFLAGS=0x0f;  // сбрасываем флаги прерываний АЦП

ADCA.CH0.CTRL=0x03;  // коэф.усиления=1; диф.режим с усилением
ADCA.CH0.MUXCTRL=0x1b;//2b; //

ADCA.CH0.INTCTRL=0x03;  // прер. по завершению преобразования, уровень = 3 (высший приоритет)
ADCA.CH0.INTFLAGS=0x01; // сбрасываем флаги прерываний канала

//Загрузить значения из Product Signature Row или результаты калибровки.
ADCA.CALL=Production_Signature_Row_Read(32); // ADCACAL0
ADCA.CALH=Production_Signature_Row_Read(33); // ADCACAL1

ADCA.CTRLA=0x01;     // включаем АЦП


Цитата(KIG @ Jul 17 2011, 19:48) *
Даже когда подаю сигнал с генератора без емкости все равно присутствует отрицательное смещение.

Я уже сказал, не имею понятия как устроен этот генератор.

Я бы предложил такое :
1) правильно настройте АЦП (порядок, опорное, калибровка)
2) найдите более понятный источник сигнала
V_G
Уточните величину смещения вашего генератора.
1. Если она порядка половины питания проца, или хотя бы мгновенное значение напряжения на выходе в любой момент времени не выходит за допустимые рамки (сейчас с емкостью у вас напряжение на проце уходит в минус, что недопустимо), просто уберите емкость.
2. Если первое условие не выполняется, поставьте после емкости резистивный делитель на землю и питание, выводящий сигнал в середину рабочей области АЦП.
ArtemKAD
Цитата
Источником сигнала является генератор типа PV6501. Сигнал с выхода генератора поступает со смещением в половину размаха величины сигнала (под размахом понимаю разницу между максимальным значением и минимальным). Чтобы избавиться от смещения последовательно к выходу генератора подключаю емкость. Далее сигнал поступает на ножки АЦП.

Вы проще сделайте. Отключите генератор от ног проца и посмотрите что получаете. Потом подключите генератор на минимальной амплитуде. Постмотрите каково постоянное смещение. А затем увеличивайте амплитуду до тех пор, когда смещение появится...
KIG
Генератор действительно выдает постоянный уровень в половину величины размаха сигнала. Однако выходной код АЦП показывает, что присутствует отрицательное смещение, которое уменьшает смещение генератора.

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

Попробую настроить АЦП как предложил Юрий_СВ. Потом напишу, что вышло.
KIG
Попробовал предложение Юрий_СВ. Получилось следующее: Отрицательное смещение пропало, когда подаю сигнал от генератора (у генератора смещение в половину размаха сигнала) (еще понаблюдаю).

Несколько вопросов:

1) Обнаружил наличие напряжения питания на отрицательном входе АЦП. Это напряжение поступает от МК. Почему так?
2) Почему нельзя использовать емкость как развязку по постоянному напряжению для того, чтобы избавиться от смещения?
3) Что означают знаки после слова SEI в команде asm ("SEI \n\t":sm.gif?
4) Начало преобразования у меня начинается после того как выполянется следующая команда ADCB.CTRLB|=(1<<3);? В описании написано что необходимо устанавливать стартовый бит для начала первого преобразования, я правильно понял?
5) После записи 3 бита в ADCB.CTRLВ начинается непрерывное преобразование точек АЦП. Причем частота дискретизации для предделителя 512 и частоты кварца 7372800Гц составляет 14150Гц. Вот код для инициализации кварца:

Код
void clock (void)
{
OSC.XOSCCTRL=0x43;
OSC.CTRL|=0x08;
do{} while ((OSC.STATUS & 0x08)==0);
asm ("ldi r16,0xd8");
asm ("ldi r17,0x03");
asm ("out 0x34,r16");
asm ("sts 64,r17");
OSC.CTRL&=~(1);
}


Почему такая большая частота дискретизации?

Заранее спасибо.
V_G
Цитата(KIG @ Jul 20 2011, 05:45) *
1) Обнаружил наличие напряжения питания на отрицательном входе АЦП. Это напряжение поступает от МК. Почему так?
2) Почему нельзя использовать емкость как развязку по постоянному напряжению для того, чтобы избавиться от смещения?

НЕЛЬЗЯ в устройствах с высоким входным сопротивлением оставлять входы плавающими по постоянному току. Это называется азы схемотехники.
Юрий_СВ
Цитата(KIG @ Jul 19 2011, 21:45) *
1) Обнаружил наличие напряжения питания на отрицательном входе АЦП. Это напряжение поступает от МК. Почему так?

трудно понять, что вы имели в виду...
я не телепат.
какой порт ? как "обнаружено" ? какие настройки порта? (должен быть 2-х тактный выход, работающий на вход, цифровой входной буфер - выкл)
Не мешает ли вам ЦАП или JTAG ?

Цитата(KIG @ Jul 19 2011, 21:45) *
2) Почему нельзя использовать емкость как развязку по постоянному напряжению для того, чтобы избавиться от смещения?

Если между выходом генератора и входом АЦП вы включите ёмкость - вы обязаны также включить и сопротивление от входа АЦП на корпус (это очевидно). (номиналы R и C надо правильно подобрать)
При положительной полуволне - всё в порядке. А вот при отрицательной.... абсолютно не понятно.
На входе контроллера - защитный диод. Скорее всего там шотка (мало понимаю в микроэлектронике).
Его характеристики нам абсолютно не известны !
В любом случае, характеристика у диода плавная, а не ступенчатая (закрыто/открыто).
Н-р, у Шотки 1N5819 уже при 0,2 вольта с небольшим прямой ток может достигать 0,1 А !!!
Это ток диода ограничит вам напряжение на резисторе и, соответственно, перекосит постоянную составляющую на ёмкости. На сколько перекосит - одному Богу известно.
(зависит от диода. характеристики которого не описаны)

Цитата(KIG @ Jul 19 2011, 21:45) *
3) Что означают знаки после слова SEI в команде asm ("SEI \n\t":sm.gif?

Inline Assembler Cookbook
Цитата
The linefeed and tab characters will make the assembler listing generated by the compiler more readable. It may look a bit odd for the first time, but that's the way the compiler creates it's own assembler code.


Цитата(KIG @ Jul 19 2011, 21:45) *
4) Начало преобразования у меня начинается после того как выполянется следующая команда ADCB.CTRLB|=(1<<3);? В описании написано что необходимо устанавливать стартовый бит для начала первого преобразования, я правильно понял?

Не пользовался непрерывным режимом. Нисего определённог не подскажу.
В описании не очевидно. По идее нужно первый раз запускать вручную. Но в описании применения AVR1300, как будто, без этого.

Цитата(KIG @ Jul 19 2011, 21:45) *
5) После записи 3 бита в ADCB.CTRLВ начинается непрерывное преобразование точек АЦП. Причем частота дискретизации для предделителя 512 и частоты кварца 7372800Гц составляет 14150Гц. Вот код для инициализации кварца:

Код
void clock (void)
{
OSC.XOSCCTRL=0x43;
OSC.CTRL|=0x08;
do{} while ((OSC.STATUS & 0x08)==0);
asm ("ldi r16,0xd8");
asm ("ldi r17,0x03");
asm ("out 0x34,r16");
asm ("sts 64,r17");
OSC.CTRL&=~(1);
}


Почему такая большая частота дискретизации?

Заранее спасибо.

Нельзя ли писать более понятно ? Или с комментариями...
(Лазить по всевозможным таблицам и искать что такое 0x34 или 64...)

Наверное, правильно, но время запуска я бы 256 тактов (для кварцевого резонатора) не ставил.
У меня 16000.

Насчёт частоты дискретизации... У вас она равна частоте синхронизации АЦП.
7372800 / 512 = 14 400
Такое возможно (если работает конвеер АЦП)
Должен ли он работать в вашем случае так сразу и не скажу.
KIG
1) По первому вопросу: ПОРТ В , использую PIN0 (положительный вход АЦП) и PIN4 (отрицательный вход АЦП). Напряжение обнаружил с помощью осциллографа. Замерял относительно земли МК. Настройки порта по умолчанию, ничего не изменял. ЦАП и JTAG отключены. Fuse бит JTAG не трогал, тоже установлен по умолчанию.

2) По пятому вопросу: Извиняюсь, что без комментов. Исправлюсь.. Насколько я понимаю одно преобразование АЦП состоит из нескольких тактов частоты синхронизации АЦП (для 8 битного кода 5 тактов). Поэтому частота дискретизации определяется следующим образом: 7372800/(512*5)=2880 Гц. А у меня частота дискретизации равна частоте синхронизации 14400Гц. Как узнать работает ли конвеер?
Юрий_СВ
Цитата(KIG @ Jul 20 2011, 18:21) *
1) По первому вопросу: ПОРТ В , использую PIN0 (положительный вход АЦП) и PIN4 (отрицательный вход АЦП). Напряжение обнаружил с помощью осциллографа. Замерял относительно земли МК. Настройки порта по умолчанию, ничего не изменял. ЦАП и JTAG отключены. Fuse бит JTAG не трогал, тоже установлен по умолчанию.

2) По пятому вопросу: Извиняюсь, что без комментов. Исправлюсь.. Насколько я понимаю одно преобразование АЦП состоит из нескольких тактов частоты синхронизации АЦП (для 8 битного кода 5 тактов). Поэтому частота дискретизации определяется следующим образом: 7372800/(512*5)=2880 Гц. А у меня частота дискретизации равна частоте синхронизации 14400Гц. Как узнать работает ли конвеер?


1) По умолчанию JTAG разрешён. Отсюда и ваши трудности с ПОРТ Б бит 4 (JTAG - порт Б, биты 4-7).
(надо запретить либо энерго независимым конфигурационным битом (FUSEBYTE4), либо програмно (MCUCR), при настройке оборудования)
Кроме того, как я уже сказал, потры надо настраивать. По умолчанию включен входной цифровой буфер.
Для аналоговых входов это лишнее потребление и шум.
Цитата
PORTCFG.MPCMASK=0xff; // битовая маска одновременного изменения всех PINxCTRL порта
port_p->PIN0CTRL=0x07; // фронты не замедлять, инверсия - выкл.,
// 2-х тактный выход без подвеса, цифровой вход - выкл.



2) Первое преобразование действительно будут занимать 5 (скорее всего 6, т.к. используется усилитель) тактов синхронизации АЦП. А вот с какой частотой будут цифровать после окончания первого преобразования... Точно не скажу - надо читать (я не пользуюсь конвеером).
KIG
Юрий_СВ, спасибо, теперь получилосьsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.