Рассмотрим варианты подключений
Лабораторная работа №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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!