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

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


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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

в чем может быть проблема
Я не вдавался в подробности кода, но вот две ошибки, на мой взгляд, уже нашел.
1. На порту нужно отключить цифровой вход, который может влиять на результат измерений. Т.е. после настройки порта на вход, необходимо еще инициализировать регистр PIN6CTRL значением INTPUT_DISABLE.

2. Разрешать работу АЦП нужно после проведения всех настроек - т.е. строка
ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП
должна быть самой последней в функции
void ADC_Init(void)


--------------------
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 11:09
Сообщение #3


Гуру
******

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



Цитата(prottoss @ May 5 2013, 13:19) *
1. На порту нужно отключить цифровой вход, который может влиять на результат измерений. Т.е. после настройки порта на вход, необходимо еще инициализировать регистр PIN6CTRL значением INTPUT_DISABLE.

Врядли это поможет.

Цитата(prottoss @ May 5 2013, 13:19) *
2. Разрешать работу АЦП нужно после проведения всех настроек - т.е. строка
ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП
должна быть самой последней в функции

Тоже не принципиально.

Цитата(tier @ May 5 2013, 09:13) *
да , там где инициализация делаю разрешение уровней прывания

Может прерывания от АЦП мешают работе ADC_GetValue?

Цитата(tier @ May 5 2013, 09:13) *
Такое впечатление что АЦП вообще не работает, не пойму....

В симуляторе (или отладчике) пробовали проверять?
Лучше проект выложте, а то гадать можно долго.
Go to the top of the page
 
+Quote Post

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


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

 


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


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