Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADC10_A в режиме Repeat-Sequence-of-Channels
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
usercod
Добрый день!

В User-guide на стр. 533 рис. 23-9. показана работа АЦП10 в режиме Repeat-Sequence-of-Channels. Допустим, АЦП10 обрабатывает 2 канала, А0 и А1. Интересует как обрабатывается прерывание при ADC10_A conversion is completed
когда
ADC10MSC = 1;
ADC10SHP = 1;
ADC10ENC = 1;

Psych
Прерывание генерируется при каждом готовом результате. Лучше в дополнении к этому использовать DTC.
usercod
Цитата
Прерывание генерируется при каждом готовом результате


Если было бы все так просто, я бы не спрашивал. Под отладкой я вижу, что в прерывании содержание регистра результата преобразования, меняется на значение для другого канала.

Цитата
Лучше в дополнении к этому использовать DTC

У этого АЦП нет DTC, но в кристалле есть DMA. Хотя вопрос не в этом.
rezident
Цитата(usercod @ Feb 17 2012, 12:13) *
Интересует как обрабатывается прерывание при ADC10_A conversion is completed
Обработка прерывания (функция обработки прерывания) это задача программиста. Как напишите, так и будет. Аппаратура АЦП только лишь формирует запрос прерывания в соответствии с описанными условиями.
Цитата
The ADC10IFG0 bit is set when the ADC10MEM0 memory register is loaded with the conversion result.
An Interrupt request is generated if ADC10IE0 bit and the GIE bit are set. The ADC10OV condition occurs
when a conversion result is written to the ADC10MEM0 before its previous conversion result was read.
The ADC10TOV condition is generated when another sample-and-conversion is requested before the
current conversion is completed. The DMA is triggered after each conversion.

С другой стороны посудите сами логически - вот готов результат преобразования, куда его АЦП должен девать, если другого места кроме ADC10MEM0 для него не предусмотрено? А запись в ADC10MEM0 приводит к установке флага ADC10IFG0 и если разрешено прерывания, то к вызову его обработчика. Так что прерывание будет возникать на каждое преобразование.
Цитата(usercod @ Feb 17 2012, 22:33) *
Если было бы все так просто, я бы не спрашивал. Под отладкой я вижу, что в прерывании содержание регистра результата преобразования, меняется на значение для другого канала.
А вы надеялись что-то иное увидеть? АЦП работает независимо от ядра, поэтому с учетом выбранного вами режима работы АЦП и задержек обновления регистров в окне дебаггера вы можете увидеть в окне значение любого из преобразований, вне зависимости от вашего желания. Можете убедиться в этом, проверив значение флагов переполнения ADC10OVIFG. Если хочется определенности, то реализуйте "программные триггеры" и смотрите результаты преобразования во временных переменных, используемых для них.
usercod
rezident, спасибо. Все работает.
usercod
Запустил АЦП10, работает два канала A0 и А1. Результат канала А1 накапливаю, а потом усредняю. Заметил одну странность, во-первых, никогда не получал результат 512 (АЦП 10бит).Опора внешняя - 2.5В, подстроечный резистор на середину и смотрю на усредненные значения. Довожу значения до 511, все нормально, но как только должен появиться результат 512, АЦП начинает сыпать данные = 512 +-50. Во времени это выглядит как шум с постоянкой 1.25В. После - 513, 514 все опять нормально, как и должно быть. Резистор менял, не в нем дело.

Что происходит с АЦП на середине диапазона? Кто-нибудь что-то подобное видел?
usercod
Удивительно! Взял два подстроечных резистора (один 2кОм, другой 100 Ом) соединил последовательно для более плавной регулировки. Довел до 511 -нормальноНажмите для просмотра прикрепленного файла,
далее плавной регулировкой подвел до следующего значения, где должно быть 512, а там это -(руда)
Нажмите для просмотра прикрепленного файла
кручу дальше 513 -все нормально
Нажмите для просмотра прикрепленного файла.

Как раскрутить? Кто работал с подобным АЦП, отпишитесь в середине диапазона нормально себя вел АЦП или нет?
rezident
А у вас конденсатор на входе стоит? Приведите схему подключения, включая питание и опору. Все-таки 2кОм это довольно высокое выходное сопротивление для источника сигнала, который измеряют АЦП типа SAR.
См. Determining Minimum Acquisition Times for SAR ADCs When a DC Voltage is Applied to the Input
usercod
Конденсатор на входе АЦП 1uF. Аналоговое и цифровое питание на микроконтроллере развязаны через LC цепь, согласно рекомендациям. Все стандартно. Я думаю, что эта проблема все же не связана с внешней обвязкой, потому что до и после значения АЦП-512 все нормально. Я надеюсь, что это моя ошибка при инициализации АЦП, а не проблема MSP.
usercod
Начну по порядку:

Все тот же режим, Repeat-sequence-of-channels.

Схема:
(Уточнение, на вход А1 заведен сигнал, через такую же цепь как и на А0). Вместо резистора 1кОм, подстроечный резистор 2кОм на входе А1.
Нажмите для просмотра прикрепленного файла

Мне удалось немного уменьшить колебания на середине диапазона, баги в инициализации, но тем не менее они остались.
Привожу рисунок только проблемного участка, т.к на всех остальных- все нормально

рис.1 unsigned
Нажмите для просмотра прикрепленного файла

рис.2 signed
Нажмите для просмотра прикрепленного файла


Частота кварца 10МГц.

Далее, сомнению также подвергается и инициализация АЦП, а потому вот она:
CODE

//********************************* ADC_10 **************************************
P6SEL |= BIT0 + BIT1; // Enable A/D channel A0 and A1
ADC10CTL0 = ADC10ON + ADC10SHT_4 + ADC10MSC;

// ADC10ON - ADC10_A on;
// ADC10SHT_8 - ADC10_A sample-and-hold time (256 * 1/5MHz*4) ~200uS
// ADC10MSC - ADC10_A multiple sample and conversion.


ADC10CTL1 = ADC10SHP + ADC10CONSEQ_3 + ADC10SSEL_2 + ADC10DIV_1;

// /*
// ADC10CONSEQ_3 - Repeat-sequence-of-channels
// ADC10SSEL_2 - MCLK
// ADC10DIV_1 - Divide by 2
// ADC10ISSH = 0 - The sample-input signal is not inverted.
// ADC10SHP - SAMPCON signal is sourced from the sampling timer.
// ADC10SHS_0 - ADC10_A sample-and-hold source select (ADC10SC bit)


ADC10CTL2 = ADC10RES;

// ADC10SR - ADC10_A buffer supports up to ~50 ksps.
// ADC10DF = 0 - Binary unsigned format of result
// ADC10RES - 10 bit (12 clock cycle conversion time)
// ADC10PDIV_0 - ADC10 predivider /1


ADC10MCTL0 = 0x01 + ADC10SREF_3; // Two chanell are enabled A0 and A1 + DC10SREF_3 - VR+ = VEREF+ and VR- = AVSS

ADC10IE = 0x01; // Enable ADC10IFG.0

ADC10CTL0 |= ADC10ENC; // Enable conversions



Вопрос по userguide.

на стр. 524.(slau208i), написано:
Цитата
12 individually configurable external input channels

где они?
usercod
Пробовал менять режим работы АЦП на одиночный однократный и повторяющийся. результат один и тот же.
Также заметил, что это проблема связана не только с серединой диапазона 512. К примеру, на 128 бьет тоже, но поменьше, такого же рода проблемы и на 64, но на этом значении это явление можно принять за шум, так как выбивает всего 1 бит.

Установил резистор на середину, должно быть 512. В прерывании поставил такое условие:

Код

temp = ADC10MEM0;
     if(temp > 512)
          {Synch_1;}
     if(temp < 511)
          {Synch_0;}

Под отладкой смотрю что выдает АЦП. Так вот результаты бывают просто необъяснимые: 0xFF, 0x300, 0x3FF а иногда и 0x00!

Честно говоря, у меня уже кончились идеи.
rezident
Цитата(usercod @ Mar 19 2012, 17:14) *
Вопрос по userguide.

на стр. 524.(slau208i), написано:

где они?

А никто и не обещал вывести все каналы в малоногом кристалле. Банально не хватает пинов для вывода всех альтернативных функций всех модулей.

Цитата(usercod @ Mar 21 2012, 18:35) *
Честно говоря, у меня уже кончились идеи.

За то время, что вы боретесь с описанным багом уже можно было изучить всю документацию вдоль и поперек. В Erratasheet на страничке продукта ваша проблема описана на стр. 19 под именем ADC31. Программный медианный фильтр должен несколько облегчить вашу участь.
Так, что выходит ваш баг и не баг вовсе, а документированная фича. Ибо "баг, описанный в документации, становится фичей" biggrin.gif
usercod
Нашел уже. Xотел написать что в SLAZ059J описан этот процесс и вопрос снят, но Вы меня опередили, эх, если бы немного раньше на 2-3 дня.
Тем не менее, уважаемый rezident, спасибо за ответ. Насколько я могу судить, т.к. я новичок на этой ветке, Вы, к сожалению, единственный, кто отвечает на вопросы как тому подобает инженерная этика (ИМХО).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.