Цитата(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