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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.