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

 
 
> 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
Ответов
bob1
сообщение May 5 2013, 10:11
Сообщение #2


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

Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471



Попробуйте вот этот код под себя переделать:
Код
SLEEP.CTRL=1;


CODE
int16_t ADC_U(uint8_t MUX,uint8_t IN,uint8_t REF)
{
PR.PRPA=PR_AC_bm;
ADCA.CH0.CTRL =IN;
ADCA.CH0.MUXCTRL=MUX;
ADCA.REFCTRL=REF;

if(MUX==ADC_CH_MUXINT_TEMP_gc)
{
ADCA.PRESCALER=ADC_PRESCALER_DIV256_gc;
ADCA.CTRLB=0;
}
else
{
ADCA.PRESCALER=ADC_PRESCALER_DIV256_gc;
ADCA.CTRLB=ADC_CONMODE_bm;
};
ADCA.EVCTRL=0;
ADCA.CTRLA=ADC_ENABLE_bm|ADC_FLUSH_bm; // очистка конвеера

int16_t u=0;

ADCA.CH0.INTCTRL=ADC_CH_INTLVL_LO_gc;
ADCA.CTRLA=ADC_ENABLE_bm|ADC_CH0START_bm;
__sleep();
for(uint8_t i=0;i<16;i++)
{
ADCA.CTRLA=ADC_ENABLE_bm|ADC_CH0START_bm;
__sleep();
int16_t w=ADCA.CH0RES;
u=u+w;
};
ADCA.CH0.INTCTRL=ADC_CH_INTLVL_OFF_gc;
ADCA.REFCTRL=0;
ADCA.CTRLA=0;
PR.PRPA=PR_ADC_bm|PR_AC_bm;
return u;
};


Сообщение отредактировал IgorKossak - May 5 2013, 16:24
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

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


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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 20:06
Рейтинг@Mail.ru


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