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

 
 
 
Reply to this topicStart new topic
> помогите с АЦП 12, Не знаю как запустить АЦП в таймерном прерывании
alexey55
сообщение Apr 21 2011, 11:18
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 21-04-11
Пользователь №: 64 525



Может кто поможет....
Мне надо запускать АЦП прямо в таймерном прерывании... а как сделать не знаю....
Я только учусь... поэтому не судите строго...

Сообщение отредактировал alexey55 - Apr 21 2011, 11:20
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 21 2011, 13:18
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Запускать - везде одинаково, что в таймерном прерывании, что в любом другом месте:
ADC12CTL0 |= ADC12SC;
(Это для F149)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 21 2011, 15:37
Сообщение #3


Гуру
******

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



Цитата(alexey55 @ Apr 21 2011, 17:18) *
Мне надо запускать АЦП прямо в таймерном прерывании...
Вы хотите сделать программный старт АЦП с периодом, определяемым таймером, или использовать аппаратные возможности АЦП по управлению выборкой/преобразованием каким-либо таймером? Какой именно кристалл используете и в чем заключаются сложности, с которыми вы столкнулись?
Go to the top of the page
 
+Quote Post
alexey55
сообщение Apr 22 2011, 05:03
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 21-04-11
Пользователь №: 64 525



мне надо сделать программный старт АЦП с периодом, определяемым таймером.
я использую 147 кристал.
но не знаю как это сделать((


Сообщение отредактировал alexey55 - Apr 22 2011, 05:04
Go to the top of the page
 
+Quote Post
VAI
сообщение Apr 22 2011, 06:53
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вот АНТОХА и написал Вам, как это делается.
Подробнее так:
1. инициализируете АЦП на 1 цикл измерения последовательности каналов (или 1 канала). Примерно так у меня для MSP430F1611
Код
#define adc_cnt   8                     // оцифровываются 8 каналов
#define Start_conversion()        { ADC12CTL0 |= ADC12SC; }

/* --- adc_ini() ------------------------------------------------------------------------------------------ **
*  Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
  P1SEL = BINARY( 00001100 );
  P1DIR = BINARY( 00001111 );
  P1OUT = BINARY( 00000000 );

  P6SEL = BINARY( 11111111 );                                     // весь порт используется, как входы АЦП
  P6DIR = BINARY( 00000000 );

  ADC12CTL0 = ADC12ON                                             // АЦП включено
            | SHT0_2                                              // время установленияния для ADC12MEM0…ADC12MEM7, tsample >= 2 us, сделаем 16/4us
            | SHT1_3                                              // время установленияния для ADC12MEM8…ADC12MEM15 сделаем 32/4us (tsample > 5us)
            | MSC                                                 // обрабатываем последовательность каналов
            | REFON + REF2_5V                                     // опорное напряжение 2.5В включено
          ;

  ADC12CTL1 = CSTARTADD_0                                         // данные будем помещать начиная с ADC12MEM0
            | SHP                                                 // Сигнал SAMPCON берется с таймера защёлки. Передний фронт сигнала Sample-input запускает таймер.
            | ADC12SSEL_3                                         // тактовая частота для ядра АЦП (ADC12CLK) - SMCLK
            | ADC12DIV_1                                          // деленая на 2 - итого 4 МГц, время преобразования (13 * 1/4 + tsample)us
            | CONSEQ_1                                            // один цикл измерения последовательности каналов
          ;

// Порядок каналов в ADC12MEMх выстроим в соответствии с "enum gase_num" (будем оцифровывать Vref+ .. AVSS)
  ADC12MCTL0 = INCH_2  + SREF_1;                                  // канал = A2,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL1 = INCH_0  + SREF_1;                                  // канал = A0,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL2 = INCH_3  + SREF_1;                                  // канал = A3,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL3 = INCH_1  + SREF_1;                                  // канал = A1,               Vr+=Vref+, Vr-=AVSS

  ADC12MCTL4 = INCH_4  + SREF_1;                                  // канал = A4,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL5 = INCH_6  + SREF_1;                                  // канал = A6,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL6 = INCH_5  + SREF_1;                                  // канал = A5,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL7 = INCH_7  + SREF_1 + EOS;                            // канал = A7,           Vr+=Vref+, Vr-=AVSS + EOS (последний обрабатываемый канал)

// -----------------------------------------------------------------------------------------------------------------
  ADC12IE = 1 << ( adc_cnt - 1 );                                 // Enable ADC12IFG.x - разрешим прерывание от последнего оцифровываемого канала
  Enable_conversions();
}

2. в таймерном прерывании запускаете преобразование, как АНТОХА написал. Подробнее:
Код
/* --- Timer_A_isr() -------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A_isr( void )
{

  ........
  Start_conversion();
  ........
}

3. Ну и обработчик прерывания от АЦП, важно, чтоб он успел отработать до следуюшего запуска преобразования...
Код
unsigned short x_adc_t[adc_cnt];

/* --- ADC12_isr() ---------------------------------------------------------------------------------------- **
*  Конец преобразования АЦП, вызывается по таймеру А с частотой 1000 Гц
* Накапливаем сигнал за ADC_SUM преобразований
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=ADC_VECTOR
__interrupt void ADC12_isr( void )
{
unsigned short *adc_mem_ptr;
int a;

  adc_mem_ptr = (unsigned short *)&ADC12MEM0;
  for ( a = 0; a < adc_cnt; a++ )        
    x_adc_t[a] = *adc_mem_ptr++;                                 // сохраним результаты АЦП во временный массив
}


В глобальный массивеx_adc_t[] у Вас будут помещатся результаты преобразования после вызова прерывания ADC12_isr(). В этом-же прерывании можете поставить флажок или ещё как-то сообщить в программу что данные готовы.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
alexey55
сообщение Apr 22 2011, 07:11
Сообщение #6





Группа: Новичок
Сообщений: 3
Регистрация: 21-04-11
Пользователь №: 64 525



Очень благодарен за подробные объяснения!!!!
Спасибо!
Go to the top of the page
 
+Quote Post

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

 


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


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