Рассмотрим варианты подключений

Лабораторная работа №5

Изучение работы АЦП на примере AVR Amega8

Цель работы : ознакомление с принципами работы таймеров и счетчиков в режиме ШИМ

Методические указания по подготовке к работе

Содержание работы:

Уяснить поставленную задачу, ознакомиться с методами работы с регистрами микроконтроллера, разработать алгоритм работы, разработать программу, позволяющую получать данные с АЦП

Аналого-цифровойпреобразователь (АЦП, англ. Analog-to-digitalconverter, ADC) — устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал). Обратное преобразование осуществляется при помощи цифро-аналогового преобразователя (ЦАП, DAC).

У микроконтроллера ATmega 8 , в зависимости от корпуса находится от 6 до 8 аналого-цифровых преобразователя.

 

 

АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-DigitalConverter). Преобразует некий аналоговый сигнал в цифровой. БитностьАЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП. АЦП встроен во многих микроконтроллерах семейства AVR и упрощает использование микроконтроллера во всяких схемах регулирования, где требуется оцифровывать некий аналоговый сигнал.


Рассмотрим принцип работы АЦП. Для преобразования нужен источник опорного напряжения и собственно напряжение, которое мы хотим оцифровать (напряжение, которое преобразуется должно быть меньше опорного). Также нужен регистр, где будет храниться преобразованное значение, назовем его Z. Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу.

Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается свходным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей. Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение. На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней. С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите:


 

 

АЦП микроконтроллера mega8 позволяет подавать напряжение на один из 5 аналоговых входов (порт С). Результат преобразования сохраняется в регистровой паре ADCH(старший байт):ADCL(младший байт) в виде 10-битного числа

В микроконтроллерах AVR для управления режимом АЦП используются два регистра: регистр управления ADCSR и регистр мультиплексирования ADMUX (определяет, какие из 5 входов порта С являются аналоговым).

Регистр ADCSR

7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIR ADPS2 ADPS1 ADPS0

ADPS0 - ADPS2 - биты выбора тактовой частоты АЦП; чем выше частота работы АЦП, тем ниже эффективное разрешение и выше скорость преобразования. Для достижения полной 10-битной точности рекомендуется использовать тактовую частоту АЦП ниже 200 кГц. При частоте 1 МГц точность преобразования составит 8 бит.

ADPS0 ADPS1 ADPS2 Значение частоты АЦП
0 0 0 Частота АЦП = такту микроконтроллера
0 0 1 Частота АЦП = такту микроконтроллера / 2
0 1 0 Частота АЦП = такту микроконтроллера / 4
0 1 1 Частота АЦП = такту микроконтроллера / 8
1 0 0 Частота АЦП = такту микроконтроллера / 16
1 0 1 Частота АЦП = такту микроконтроллера / 32
1 1 0 Частота АЦП = такту микроконтроллера / 64
1 1 1 Частота АЦП = такту микроконтроллера / 128

ADIE - разряд маскирования прерывания от АЦП (1 - по окончанию преобразования разрешено прерывание);

ADIF - флаг прерывания от АЦП (устанавливается аппаратно по окончанию цикла преобразования);

ADFR - лог. 1 в этом разряде переводит АЦП в несинхронизированный режим работы - обычно АЦП работает в режиме прерывания, чтобы процессор каждый раз не ожидал завершения медленно протекающего преобразования, однако в несинхронизированном режиме АЦП выполняет преобразование постоянно, как можно быстрее (на период такого преобразования должны быть запрещены все прерывания);

ADSC - флаг начала преобразования;

ADEN - флаг разрешения использования АЦП.

Регистр ADMUX

7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0

RESF1,RESF0 - биты выбора опорного напряжения

RESF1 RESF0 Источник опорного напряжения
0 0 AREF
0 1 AVcc с внешним конденсатором (чтобы не было искажений)
1 0 Зарезервировано
1 1 Внутренний 2.56В источник, с внешним конденсатором на AREF

Бит ADLAR определяет каким образом результат преобразования будет записан в регистровую пару ADCH:ADCL. Если ADLAR=0 в ADCH записываются 2 старших бита, остальные 8 в ADCL; если ADLAR=1 в ADCH записываются 8 старших битов и 2 бита записываются в ADCL.

Конфигурация битов выбора аналогого канала

MUX0 MUX1 MUX2 MUX3 Аналоговый вход
0 0 0 0 ADC0
0 0 0 1 ADC1
0 0 1 0 ADC2
0 0 1 1 ADC3
0 1 0 0 ADC4
0 1 0 1 ADC5
0 1 1 0 ADC6
0 1 1 1 АDC7

 

 

В микроконтроллерах AVR как источник опорного напряжения может использоваться вывод AREF, или внутренние источники 2,56В или 1,23В. Также источником опорного напряжения может быть напряжение питания. В некоторых корпусах и моделях микроконтроллеров есть отдельные выводы для питания АЦП: AVCC и AGND. Выводы ADCn – каналы АЦП.

С какого канала будет оцифровываться сигнал можно выбрать с помощью мультиплексора.

 

Рассмотрим программу:

 

#asm

.equ __lcd_port=0x18

#endasm

 

#include <lcd.h>

#include <stdio.h>

#include <delay.h>

#include <mega8.h>

 

//#define ADC_VREF_TYPE 0x00 //AREF // 4 в

//#define ADC_VREF_TYPE 0x40 //AVCC // 5в

#define ADC_VREF_TYPE 0xC0 // внутренний источник 2,56В

 

charlcd_buffer[33];  

unsigned int i1;

 

 

// Read the AD conversion result

unsignedintread_adc(unsigned char adc_input)

{

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSRA|=0x40;

// Wait for the AD conversion to complete

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

}

 

 

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

 

 

lcd_clear();

sprintf(lcd_buffer,"%i",read_adc(4));

lcd_puts(lcd_buffer);

 

//i1=read_adc(4)*4.0/1023*1000; // AREF 4в

//i1=read_adc(4)*5.0*1000/1023; // AVCC 5в

i1=read_adc(4)*2.56/1023*1000; // для 2,56

 

sprintf(lcd_buffer," %i mV",(i1));

lcd_puts(lcd_buffer);

 

}

 

 

// Declare your global variables here

 

void main(void)

{

PORTB=0x00;

DDRB=0xFF;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 15,625 kHz

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: On

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x0C;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x0C;

OCR1AL=0x35;

OCR1BH=0x00;

OCR1BL=0x00;

 

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x10;

 

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

// ADC initialization

// ADC Clock frequency: 31,250 kHz

// ADC Voltage Reference: AREF pin

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x87;

 

 

lcd_init(16);

 

// Global enable interrupts

#asm("sei")

 

while (1)

{

 

 

}

 

}


Программа проста. В начале мы инициализируем порты ввода/вывода. Для того, чтобы служить входом АЦП, пинPC4 должен работать на вход. Далее проводим инициализацию ЖКИ и АЦП. Инициализация АЦП заключается в его включении битом ADEN в регистре ADCSRA. И выбора частоты преобразования битами ADPS2, ADPS1, ADPS0 в том же регистре. Также выбираем источник опорного напряжения, биты REFS1 REFS0 в регистре ADMUX и вход АЦП: биты MUX0,MUX1,MUX2, MUX3 (в нашем случаем входом АЦП является PC4, поэтому MUX0.3=0). Далее, в вечном цикле, начинаем преобразования установкой бита ADSC в регистре ADCSRA. Дожидаемся окончания преобразования (бит ADIF в ADCSRA становиться равным 1). Далее вынимаем данные из регистра ADC и выводим их на ЖКИ. Вынимать данные из ADC нужно в такой последовательности: v=(ADCL+ADCH*256);

Так-же есть хитрость, чтобы не работать с дробными числами. Когда производиться вычисления входного напряжения в вольтах. Мы просто будем хранить наше напряжения в милливольтах. Например, значение переменной voltage 4234 означает, что мы имеем 4,234 вольта. Вообще операции с дробными числами кушают очень много памяти микроконтроллера (наша прошивка вольтметра весит чуть больше 4 килобайт, это половина памяти программ ATmega8), их рекомендуется использовать только при особой необходимости.

Вычисления входного напряжения в милливольтах просто:

i 1= read _ adc (4)*2.56/1023*1000; // для 2,56


Здесь read_adc(4)– Значение АЦП на 4 бите порта C.

2,56 – опорное напряжение

1023 - это 1024 уровня ацп поскольку нумерация начинается с 0 те 10 бит

1000 - коэцифиентпозволяющий перевести значение в миливольты

 

Рассмотрим варианты подключений

Условимся, что максимальное измеряемое напряжение будет 5В. Также пусть наш макет выводит на ЖКИ содержимое регистра ADC.

 

 

Обвязка микроконтроллера и ЖКИ WH1602A стандартна.

Источник опорного напряжения мы будем использовать встроенный на 2,56В. С помощью делителя R4-R5 мы добьемся максимального напряжения 2,5В на входе PC4, при напряжении на щупе до 5В.

Дроссель на 10мкГн и конденсатор на 0,1 мкФ для устранения шумов и наводок на АЦП на схеме не показан. Их наличие подразумевается само собой, если используется АЦП.

 

Порядок выполнения работы

1. Получить задание у преподавателя

2. Разработать алгоритм

3. Разработать программу в CodeVisionAVR

4. Скомпилировать файл прошивки

5. Спроектировать макетную плату в PROTEUS

6. Загрузить файл (*.hex) в PROTEUS и запустить симуляцию в проекте.

Оформление отчета

Отчет должен содержать:

а) формулировку цели работы,

б)схему устройства

в) код программы в CodeVisionAVR

г)схема проекта в PROTEUS

д) Выводы по работе

 

 

 

Список использованной литературы

1) М.Б. Лебедев . CodeVision AVR. Пособие для начинающих. Додэка XXI, 2008. 592 с.

2) https://avrlab.com/node/94

3)

 

Содержание:


Дата добавления: 2021-01-20; просмотров: 127; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!