Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: помогите с АЦП 12
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
alexey55
Может кто поможет....
Мне надо запускать АЦП прямо в таймерном прерывании... а как сделать не знаю....
Я только учусь... поэтому не судите строго...
AHTOXA
Запускать - везде одинаково, что в таймерном прерывании, что в любом другом месте:
ADC12CTL0 |= ADC12SC;
(Это для F149)
rezident
Цитата(alexey55 @ Apr 21 2011, 17:18) *
Мне надо запускать АЦП прямо в таймерном прерывании...
Вы хотите сделать программный старт АЦП с периодом, определяемым таймером, или использовать аппаратные возможности АЦП по управлению выборкой/преобразованием каким-либо таймером? Какой именно кристалл используете и в чем заключаются сложности, с которыми вы столкнулись?
alexey55
мне надо сделать программный старт АЦП с периодом, определяемым таймером.
я использую 147 кристал.
но не знаю как это сделать((
VAI
Вот АНТОХА и написал Вам, как это делается.
Подробнее так:
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(). В этом-же прерывании можете поставить флажок или ещё как-то сообщить в программу что данные готовы.
alexey55
Очень благодарен за подробные объяснения!!!!
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.