Принцип работы и приемы программной конфигурации модуля АЦП цифрового сигнального процессора TMS320F2812, страница 2

4.3 Разрешили запуск АЦП от Менеджера Событий А (регистр GPTCONA).

EvaRegs.GPTCONA.bit.T1TOADC = 2;

4.4 Рассчитали значение периода (T1PR), зная, что  = 10 Гц:

EvaRegs.T1PR = 58594;

5. Инициализация модуля АЦП.

5.1 Задали: двух последовательный режим, запретили непрерывный режим, коэффициент деления 1 (регистр ADCTRL1).

5.2 Записали количество преобразований 2 (регистр ADCMAXCONV).

5.3 Выбрали каналы ADCIN_A0 и ADCIN_B0 (регистр ADCCHSELSEQ1).

5.4 Разрешили преобразования от Менеджера Событий А, разрешили прерывания АЦП в конце каждой последовательности (регистр ADCTRL2)

5.3 Задали делитель частоты высокоскоростного таймера равный 4.

AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;            // Dual Sequencer Mode

AdcRegs.ADCTRL1.bit.CONT_RUN = 0;           // No Continuous run

AdcRegs.ADCTRL1.bit.CPS = 0;                        // prescaler = 1

AdcRegs.ADCMAXCONV.all = 0x0001;       // Setup 2 conv's on SEQ1

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.//

Assumes EVA Clock is already enabled in InitSysCtrl();

AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // Setup ADCINB0 as 2nd SEQ1 conv.

AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // Enable EVASOC to start SEQ1

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOEvaRegs.GPTCONA.bit.T1PIN = 1;

AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;           // Divide HSPCLK by 4

6. Настройка прерываний.

6.1 Указали адрес вектора прерываний (регистр ADCINT).

EALLOW;  // This is needed to write to EALLOW protected registers

PieVectTable.ADCINT = &adc_isr;

EDIS;    // This is needed to disable write to EALLOW protected registers

6.2 Разрешили прерывание 6 группы 1 (регистр PIEIER1).

PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

6.3 Вызвали подпрограммы инициализации: модуля прерывания периферийных устройств “InitPieCtrl()”,  вектора прерывания периферийных устройств “InitPieVectTable()”, модуля АЦП “InitAdc()”.

InitPieCtrl();

InitPieVectTable();

InitAdc();

7. Получение результатов преобразования АЦП (подпрограмма “adc_isr()”).

7.1 Считали результаты преобразования из регистров ADCRESULT0 и ADCRESULT1 и сохранили их соответственно в переменные Voltage_A0 и Voltage_B0. Так как данные в регистрах ADCRESULTn выровнены к левому краю, произвели сдвиг данных на четыре разряда вправо.

Voltage_A0 = AdcRegs.ADCRESULT0>>4;

Voltage_B0 = AdcRegs.ADCRESULT1>>4;

7.2 Подготовили АЦП к следующему преобразованию: сбросили последовательность SEQ1 (регистр ADCTRL2), сбрасили бит прерывания SEQ1 (регистр ADCST), подтверждили прерывания (регистр PIEACK).

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;     

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;    

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;  

8. Вывод показаний АЦП на светодиодные индикаторы

8.1. В основной подпрограмме main() написали программу вывода показаний данных из АЦП на линейку светодиодных индикаторов. Для этого использовали подпрограмму show_ADC(result), которая отображает четыре младших бита параметра result на светодиодных индикаторах в виде светящейся линейки. Вывод показаний с каждого канала осуществляли поочередно через 1 секунду. В программе также сбрасывали сторожевой таймер процессора.

while(1) {

for(i=0;i<1500000;i++) {

EALLOW;

SysCtrlRegs.WDKEY = 0xAA;

EDIS;

show_ADC(Voltage_A0>>8);  

}

for(i=0;i<1500000;i++) {

EALLOW;

SysCtrlRegs.WDKEY = 0xAA;

EDIS;

show_ADC(Voltage_B0>>8);

}

}

8.2. Скомпоновали проект: Project → Build.

8.3 Загрузили выходной файл: File → Load Program → Debug\ lab6.out.

8.4. Запустили программу на выполнение Debug → Run.

8.5. Контролировали правильное выполнение программы, изменяя потенциометрами напряжение, подаваемое на входы АЦП и наблюдали за линейкой светодиодных индикаторов.

9. Задание для самостоятельной работы

Написали программу «бегущий огонь», аналогичную разработанной в лабораторной работе № 2. Скорость движения «бегущего огня» задавали потенциометром канала ADCIN_A0.