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

 
 
> ATxMega32D4, Вопрос по АЦП
tier
сообщение May 4 2013, 17:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 14-08-09
Пользователь №: 51 892



Подскажите кто чем сможет, что-то бьюсь а результата нет.
Есть ATxMega32D4, на начальном этапе пытаюсь просто измерить постоянное напряжение (~1.2В) которое подается к Pin2.
Ф-я ADC_GetValue() вызывается по требованию программы (необходимость измерения в данный момент)

Независимо от подключенного измеряемого напряжения выдает 0xC0...0xC3 в случае
UnsignedMode и 0x02...0x06 в случае SignedMode (ADC_CONMODE_bm)

CODE
void ADC_Init(void)
{
PORTA.DIRCLR = PIN6_bm; // Настраиваем нужный вход
// Устанавливаем разрядность и режим Signed Mode
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | ADC_CONMODE_bm;
ADCA.REFCTRL = ADC_REFSEL_AREFB_gc; // Внешний ИОН 2,36В, подключен к PB0 Pin4

// Настраиваем мультиплексор - Канал 0 ADCA настроен на внешний несимметричный вход
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;

ADCA.CH0.MUXCTRL |= ADC_CH_MUXPOS_PIN6_gc; // Positive Input ADC6 PA6 Pin2

ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП

ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc; // Делитель частоты (32МГц/256=125кГц)
// Прерывание по завершению преобразования, уровень прерываний - средний
ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_MED_gc;
}

uint16_t ADC_GetValue(void)
{
uint16_t i, tmp, sum = 0;

for (i=0; i<16; i++) // Number of samples
{
ADCA.CTRLA |= ADC_CH0START_bm; // ADC Start Conversion

while(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm);
ADCA.CH0.INTFLAGS |= ADC_CH_CHIF_bm; // Clear interrupt flag

tmp = ADCA.CH0RES;
sum += tmp;
}

sum /= 16;

return sum;
}


в чем может быть проблема

Сообщение отредактировал IgorKossak - May 5 2013, 16:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение May 4 2013, 19:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(tier @ May 4 2013, 20:57) *
Независимо от подключенного измеряемого напряжения выдает 0xC0...0xC3 в случае
UnsignedMode

Вход на земле не сидит или может вообще оборван? Есть на нём напряжение?

Цитата(tier @ May 4 2013, 20:57) *
Код
void ADC_Init(void)
{
...
}

Калибровки не хватает, но вряд ли она так сильно влияет. Так всё вроде правильно.

Цитата
ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc; // Делитель частоты (32МГц/256=125кГц)

Не 125кГц, а 125/8, но это не так важно.

Цитата
Код
// Прерывание по завершению преобразования, уровень прерываний - средний
    ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_MED_gc;

ADC_GetValue при разрешённых прерываниях измеряет?
JTAG-а в D4 нет? Если есть, то может он разрешён?

Сообщение отредактировал IgorKossak - May 5 2013, 16:24
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
tier
сообщение May 5 2013, 06:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 14-08-09
Пользователь №: 51 892



Цитата(_Артём_ @ May 4 2013, 22:26) *
Вход на земле не сидит или может вообще оборван? Есть на нём напряжение?


На входе контролирую мультиметром, напряжение есть 1.22В

Цитата(_Артём_ @ May 4 2013, 22:26) *
ADC_GetValue при разрешённых прерываниях измеряет?

да , там где инициализация делаю разрешение уровней прывания

Код
PMIC.CTRL |= PMIC_MEDLVLEN_bm;
PMIC.CTRL |= PMIC_HILVLEN_bm;

JTAGa нет. Я уже пробовал и в дифференциальном режиме измерять подключая Negative Pin к земле. Ничего не меняется.
Такое впечатление что АЦП вообще не работает, не пойму....
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:14
Рейтинг@Mail.ru


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