Изучение работы со встроенным аналого-цифровым преобразователем микроконтроллера ATmega 128, страница 2

ADLAR – выравнивание результата преобразования. Если ADLAR=1, результат преобразования выравнивается по левой границе 16-разрядного слова (младшие 6- разрядов регистра ADCL – незначащие). Режим применяется в случае достаточности 8-разрядного преобразования. При этом, полученный код можно считать только из регистра ADCH.

MUX4 .. MUX0 – выбор входного канала. Биты MUX4 .. MUX0 задают номер опрашиваемого канала АЦП в двоичном коде. Биты MUX4 .. MUX3 применяются при использовании входов АЦП в дифференциальном режиме.

1.3. Регистры данных

После завершения преобразования (при установке в 1 флага ADIF регистра ADCSRA) его результат сохраняется в регистрах данных АЦП. Поскольку результат преобразования 10-разрядный, он физически размещается в двух регистрах ввода\вывода ADCH и ADCL.

По умолчанию результат преобразования выравнивается в право (старшие 6-разрядов регистра ADCH – незначащие).

Для считывания результата, сначала необходимо прочитать регистр ADCL, а затем -ADCH. Пока ADCH не будет прочитан, запись в регистры данных для АЦП блокируется.

Если результат преобразования выровнен влево, предварительной установкой бита ADLAR=1 регистра  ADMUX, достаточно считать только содержимое регистра ADCH.

2. Порядок работы с АЦП без использования прерываний

1.  Задать номер опрашиваемого канала в регистре ADMUX.

2.  Разрешить работу АЦП, запустить АЦП на преобразования, установить коэффициент деления предделителя. (C6(H)→ADCSRA)

3.  Ожидать окончания преобразования, опрашивая бит ADIF регистра ADCSRA.

4.  Считать данные из регистров данных АЦП.

Пример на ассемблере:

;Опрос канала ADC1 (бит PF1 порта F)

;Вход AREF не подключен

.include <m128def.inc>

ldi r19,0x10      ;Инициализация стека

out       SPH,r19   

ldi r19,0xFF

out       SPL,r19

ldi r19, 0b11111111      ;Порт A на вывод

out DDRA, r19

;Опрос АЦП с выравниванием вправо (бит ADLAR=1 в рег. ADMUX)

;С помещением результата в r18

ldi r16,0b01100001       ; выбор канала 1 и выравнивание

out ADMUX,r16                      ; результата вправо, ИОН=AVcc

Start:

ldi r16, 0b11000110      ; запуск преобразования

out ADCSRA, r16                    ; частота преобразования 7.37/64=115кГц

FinPr:

in r17, ADCSRA          ; задержка до окончания преобразования

andi r17, 0x10  ; опрос бита ADIF регистра ADCSRA

breq FinPr

ldi r16, 0x10     ;очистка бита ADIF

out ADCSRA, r16

in r18, ADCH   ;чтение 8 старших битов результата

mov r19, r18                ;вывод 8 старших битов результата в порт A

com r19           ;инверсия содержимого регистра r19

out PORTA, r19

rjmp Start

Пример на Cи:

#include <MEGA128.H>

#include <delay.h>

unsigned char  D=0;

void main(void)

{

//****Инициализация портов

DDRA=0xff;

DDRB=0x00;

DDRC=0x00;

DDRD=0xff;

SPH=0x10; SPL=0xFF;//Инициализация стека

//****Инициализация АЦП

//Выбор канала 1,Выравнивание результата вправо (бит ADLAR=1

// в рег. ADMUX), ИОН=AVcc

ADMUX=0b01100001;

while (1)

{

//Опрос АЦП

ADCSRA=0b11000110;//запуск преобразования

//частота преобразования 7.37/64=115кГц

while (!(ADCSRA & 0x10));// Проверка завершения преобразования

//(опрос бита ADIF регистра ADCSRA)

ADCSRA |= 0x10; // Очистка бита ADIF записью в него "1"

D = ADCH;            //чтение 8 старших битов результата

D= D^0xFF; // Инверсия при помощи XOR

PORTA=D;

delay_ms(1000);

}

}

Задание к лабораторной работе

1. Реализовать программу опроса потенциометра ADC0 подключенного к нулевому каналу встроенного АЦП.

2. Реализовать программу управления технологическим процессом согласно варианту. В качестве датчиков аналогового сигнала использовать потенциометры ADC0, ADC1 подключенных к одноимённым входам встроенного АЦП. Варианты заданий:

а)