|
ATxMega32D4, Вопрос по АЦП |
|
|
|
May 4 2013, 17:57
|
Участник

Группа: Участник
Сообщений: 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] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
May 5 2013, 10:19
|

Гуру
     
Группа: Свой
Сообщений: 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)
--------------------
|
|
|
|
|
May 5 2013, 11:09
|
Гуру
     
Группа: Свой
Сообщений: 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)  Такое впечатление что АЦП вообще не работает, не пойму.... В симуляторе (или отладчике) пробовали проверять? Лучше проект выложте, а то гадать можно долго.
|
|
|
|
|
May 6 2013, 12:36
|
Участник

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

|
Цитата(prottoss @ May 5 2013, 13:19)  1. На порту нужно отключить цифровой вход, который может влиять на результат измерений. Т.е. после настройки порта на вход, необходимо еще инициализировать регистр PIN6CTRL значением INTPUT_DISABLE. сделал, в ADC_Init добавил Код PORTA.PIN6CTRL = PORT_ISC_INPUT_DISABLE_gc; Цитата(prottoss @ May 5 2013, 13:19)  2. Разрешать работу АЦП нужно после проведения всех настроек - т.е. строка ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП должна быть самой последней в функции void ADC_Init(void) тоже не помогает Цитата(_Артём_ @ May 5 2013, 14:09)  В симуляторе (или отладчике) пробовали проверять? не пробовал, потому как тут непосредственно с перефирией работаю, кода мизер у кого-нибудь есть эта самая 32d4 ревизии A, просто errata конечно большая, но не вообще ж не работать АЦП...
|
|
|
|
|
May 6 2013, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(tier @ May 6 2013, 15:36)  не пробовал, потому как тут непосредственно с перефирией работаю Попробуйте, хуже не будем - всёж равно не работает. Цитата(tier @ May 6 2013, 15:36)  кода мизер P.S. Непонятно как у вас чтение АЦП происходит - проде и прерывания по готовности результата АЦП разрешены и в функции АЦП по флагу готовноси читается.
|
|
|
|
Сообщений в этой теме
tier ATxMega32D4 May 4 2013, 17:57 _Артём_ Цитата(tier @ May 4 2013, 20:57) Независи... May 4 2013, 19:26 tier Цитата(_Артём_ @ May 4 2013, 22:26) Вход ... May 5 2013, 06:13 bob1 Попробуйте вот этот код под себя переделать:
КодSL... May 5 2013, 10:11    tier Цитата(_Артём_ @ May 6 2013, 16:09) Попро... May 6 2013, 13:42 zombi На Си не пишу. С ацп не работал.
Извиняюсь если бр... May 6 2013, 15:33 tier Цитата(zombi @ May 6 2013, 18:33) Но, Вы ... May 6 2013, 18:42  zombi Цитата(tier @ May 6 2013, 21:42) Вот сдел... May 6 2013, 21:18   _Артём_ Цитата(zombi @ May 7 2013, 00:18) А здесь... May 6 2013, 22:04    tier Цитата(_Артём_ @ May 7 2013, 01:04) Не т... May 7 2013, 07:11     zombi Цитата(tier @ May 7 2013, 10:11) кстати в... May 7 2013, 09:43 tier Все заработало, скомпилировал другой студией и все... May 7 2013, 21:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|