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

 
 
> ADC для MSP430F1232, Автоматический опрос нескольких каналов АDC
0xFF
сообщение Jan 10 2006, 08:47
Сообщение #1


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

Группа: Свой
Сообщений: 131
Регистрация: 9-01-06
Пользователь №: 12 984



При автоматическом опросе нескольких каналов АDC данные складываю в вектор памтяти. Проблема: данные разных каналов всё время оказываются в разных местах вектора. Я сканирую два канала и их значения всё время находятся в разных местах вектора - то в одной ячейке, то в другой. Подскажите в чём проблема.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
0xFF
сообщение Jan 11 2006, 20:03
Сообщение #2


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

Группа: Свой
Сообщений: 131
Регистрация: 9-01-06
Пользователь №: 12 984



Значит вместо while (ADC10CTL1 & ADC10BUSY); (как я понял это только для одноканального режима одиночного преобразования) ставлю while ( ADC10IFG ); - жду когда блок заполнится и затем забираю значнеия?



не использовать DTC не могу т.к. опрашиваю ADC где-то раз в 1 ms и необходимо затем по полученным данным расчитывать среднее значение для других вычислений.

Спасибо за то, что откликнулись на мой вопрос.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 11 2006, 23:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(0xFF @ Jan 12 2006, 01:03) *
Значит вместо while (ADC10CTL1 & ADC10BUSY); (как я понял это только для одноканального режима одиночного преобразования) ставлю while ( ADC10IFG ); - жду когда блок заполнится и затем забираю значнеия?

Нет. Неверно. ADC10IFG это битовый флаг в регистре ADC10CTL0. Поэтому нужно накладывать битовую маску. Правильно будет наверное так.
Код
while (!(ADC10CTL0&ADC10IFG));

После чтения результатов ADC10IFG нужно программно сбросить.
Код
ADC10CTL0&=~ADC10IFG;

Если бы вы воспользовались прерыванием от ADC10, то ADC10IFG сбрасывался бы самостоятельно при обслуживании вектора перывания ADС10. А так вручную.
Цитата(0xFF @ Jan 12 2006, 01:03) *
не использовать DTC не могу т.к. опрашиваю ADC где-то раз в 1 ms и необходимо затем по полученным данным расчитывать среднее значение для других вычислений.

Еще раз предлагаю вам подумать о том, что нужно
либо использовать режим однократной последовательности каналов (CONSEQ_1), всего два переноса и софтверный запуск,
либо режим повторяющейся последовательности (CONSEQ_3), нужное вам количество переносов, но в качестве источника запуска преобразований использовать какой-либо из выходных сигналов (Out0, Out1 или Out2) таймера TimerA.
Все зависит от того, важны ли вам значения каждого конкретного преобразования или можно считывать любые из этих значений (преобразование будет идти непрерывно пока не заполнится весь блок), но в определенные моменты времени?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 19:11
Рейтинг@Mail.ru


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