|
АЦП ATxmega |
|
|
|
Jul 17 2011, 06:56
|
Участник

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

|
Цитата(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 В). Что такое "подставка" - не очень понятно. Наверное, тоже, что и ПОДСТАВА.  (видимо, речь о смещении ...)
Сообщение отредактировал Юрий_СВ - Jul 17 2011, 06:59
|
|
|
|
|
Jul 17 2011, 16:48
|
Частый гость
 
Группа: Участник
Сообщений: 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 Гц. Правильно ли я понял Даташит? Как же все таки загрузить в калибровочные регисторы значение заводской калибровки (и как их определить)? Даже когда подаю сигнал с генератора без емкости все равно присутствует отрицательное смещение.
|
|
|
|
|
Jul 17 2011, 18:21
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 19 2011, 18:45
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884

|
Попробовал предложение Юрий_СВ. Получилось следующее: Отрицательное смещение пропало, когда подаю сигнал от генератора (у генератора смещение в половину размаха сигнала) (еще понаблюдаю). Несколько вопросов: 1) Обнаружил наличие напряжения питания на отрицательном входе АЦП. Это напряжение поступает от МК. Почему так? 2) Почему нельзя использовать емкость как развязку по постоянному напряжению для того, чтобы избавиться от смещения? 3) Что означают знаки после слова SEI в команде asm ("SEI \n\t":  ? 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); } Почему такая большая частота дискретизации? Заранее спасибо.
Сообщение отредактировал KIG - Jul 19 2011, 19:08
|
|
|
|
|
Jul 20 2011, 11:24
|
Участник

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

|
Цитата(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":  ? 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 Такое возможно (если работает конвеер АЦП) Должен ли он работать в вашем случае так сразу и не скажу.
|
|
|
|
|
Jul 20 2011, 17:28
|
Участник

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

|
Цитата(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, т.к. используется усилитель) тактов синхронизации АЦП. А вот с какой частотой будут цифровать после окончания первого преобразования... Точно не скажу - надо читать (я не пользуюсь конвеером).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|