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

 
 
> АЦП ATxmega
KIG
сообщение Jul 13 2011, 17:34
Сообщение #1


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

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



Добрый вечер.

Проблема с АЦП AtXmega. Подаю переменное напряжение (1В) на диф входы АЦП. АЦП замеряет код с постоянной подставкой в 200мВ. Осциллограф также видет постоянную подставку. Величина подставки зависит от величины переменного напряжения. Кто-нибудь с таким сталкивался?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KIG
сообщение Jul 17 2011, 16:48
Сообщение #2


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

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



Источником сигнала является генератор типа 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 Гц. Правильно ли я понял Даташит?

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

Даже когда подаю сигнал с генератора без емкости все равно присутствует отрицательное смещение.
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Jul 17 2011, 18:21
Сообщение #3


Участник
*

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



Цитата(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) найдите более понятный источник сигнала

Сообщение отредактировал Юрий_СВ - Jul 17 2011, 18:26
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- KIG   АЦП ATxmega   Jul 13 2011, 17:34
- - ArtemKAD   В проце на входах стоят защитные диоды которые при...   Jul 13 2011, 17:55
|- - KIG   Попробовал подать переменный сигнал напрямую на но...   Jul 16 2011, 09:02
|- - Юрий_СВ   Цитата(KIG @ Jul 16 2011, 12:02) Попробов...   Jul 17 2011, 06:56
- - V_G   Диапазон напряжений на всех ногах процессора, вклю...   Jul 16 2011, 10:16
- - V_G   Уточните величину смещения вашего генератора. 1. Е...   Jul 17 2011, 22:46
- - ArtemKAD   ЦитатаИсточником сигнала является генератор типа P...   Jul 18 2011, 09:24
- - KIG   Генератор действительно выдает постоянный уровень ...   Jul 18 2011, 17:56
- - KIG   Попробовал предложение Юрий_СВ. Получилось следующ...   Jul 19 2011, 18:45
|- - V_G   Цитата(KIG @ Jul 20 2011, 05:45) 1) Обнар...   Jul 19 2011, 22:29
|- - Юрий_СВ   Цитата(KIG @ Jul 19 2011, 21:45) 1) Обнар...   Jul 20 2011, 11:24
- - KIG   1) По первому вопросу: ПОРТ В , использую PIN0 (по...   Jul 20 2011, 15:21
|- - Юрий_СВ   Цитата(KIG @ Jul 20 2011, 18:21) 1) По пе...   Jul 20 2011, 17:28
- - KIG   Юрий_СВ, спасибо, теперь получилось   Jul 23 2011, 10:55


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:59
Рейтинг@Mail.ru


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