Вот так я вызываю Преобразования с определенным периодом по таймеру.
Если нужна еще и передача оцифрованых значений по UART, то можно еще и это добавить, важно, чтоб успело передаться до следующего вызова.
Код
// --- Определения ---------------------------------------------------------------------------------------- **
#define Start_conversion() { ADC12CTL0 |= ADC12SC; }
#define Enable_conversions() { ADC12CTL0 |= ENC; }
#define Disable_conversions() { ADC12CTL0 &= ~ENC; }
#define ADC_SUM 4 // сколько преобразований суммируем и принимаем за 1 отсчет
#define ADC_MAX ( 4095 * ADC_SUM )
#define ADC_NORMA ( 3500 * ADC_SUM )
/* --- adc_ini() ------------------------------------------------------------------------------------------ **
* Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
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_2 // тактовая частота для ядра АЦП (ADC12CLK) - MCLK
| ADC12DIV_1 // деленая на 2 - итого 4 МГц, время преобразования (13 * 1/4 + tsample)us
| CONSEQ_1 // один цикл измерения последовательности каналов
;
// При перестановке каналов при инициализации АЦП не забыть переставить enum variable_resistor
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();
}
/* --- Timer_A_isr() -------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A_isr( void )
{
tick_ms++;
Start_conversion();
......
......
}
/* --- ADC12_isr() ---------------------------------------------------------------------------------------- **
* Конец преобразования АЦП, вызывается по таймеру А с частотой 1000 Гц
* Накапливаем сигнал за ADC_SUM преобразований
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=ADC_VECTOR
__interrupt void ADC12_isr( void )
{
unsigned short *adc_mem_ptr;
static int a_cnt;
int a;
adc_mem_ptr = (unsigned short *)&ADC12MEM0;
for ( a = 0; a < adc_cnt; a++ ) // остальные из ADC_SUM
x_adc_t[a] += *adc_mem_ptr++; // сохраним результаты АЦП во временный массив
if ( ++a_cnt < ADC_SUM )
return;
// Сюда попадает с частотой ( 1000 / ADC_SUM ) = 250 Гц
for ( a_cnt = a = 0; a < adc_cnt; a++ ) // сумма ADC_SUM отсчетов готова, перенесем "куда нада"
{ x_adc[a] = x_adc_t[a];
x_adc_t[a] = 0;
}
// Дальше не критично ко времени, лишь бы до следующего прерывания выполнилось, поэтому разрешим прерывания
__enable_interrupt();
if ( flag.channel_REF == OFF ) // Опорнай канал игнорируется
x_adc[X_REF] = ADC_NORMA;
ADC12_isr_add(); // Дальнейшая обработка, должна успеть закончится до следующего вызова
}
первый пробел съедается при форматировании....