Опубликовано 2010-03-29 11:33:52 автором Ruslan

   Використання АЦП в AVR. Урок AVR 6


Часто буває потрібно заміряти напругу. Для цих цілей в мікроконтролері є АЦП (аналого-цифровий перетворювач). АЦП - це пристрій, який перетворює аналоговий сигнал в його цифрове подання. На вхід АЦП подається аналоговий сигнал, а на виході ми отримуємо еквівалентний цифровий сигнал.

Основні характеристики АЦП

  • Частота перетворення - це скільки разів в секунду АЦП зможе виміряти напругу
  • Розрядність - кількість дискретних значень напруги, на який ділиться весь робочий діапазон вхідних напруг. АЦП в AVR десяти розрядні. Тобто, максимальна напруга на вході АЦП буде переводитися в 210=1024
  • Діапазон вхідних напруг - це мінімальне і максимальне значення напруги, яке можна подавати на входи АЦП. Для avr це діапазон від 0 до напруги живлення мікроконтролера
Для роботи АЦП необхідний джерело опорної напруги (ІОН). Це еталон, по відношенню до якого він вимірює напругу на вході. У AVR в якості джерела опорної напруги може виступати живлення МК, джерело опорної напруги, підключений до ніжці ARef і внутрішній ІОН на 2,56 ст. ІОН має бути якомога стабільніше, від цього залежить точність вимірювань. Щоб помацати все це, давайте зробимо простий вольтметр на 5в. Запускаємо CVAVR, на питання запустити CodeWizardAVR натискаємо "так" і переходимо у вкладку ADC

установка ADC в CWAVR

Тут:

  • ADC Enable - дозволяє або забороняє роботу АЦП
  • Use 8 bit - АЦП 8 біт, тобто максимальне число на виході АЦП - це 255 (за замовчуванням АЦП 10-бітний)
  • ADC Interrupt - буде генеруватися переривання, коли АЦП закінчить перетворення. При виборі цієї опції з'являються додаткові пункти

     переривання по закінченню вимірювання АЦП

    • Noise Canceler - при перетворенні процесор буде переходити в режим холостого ходу (Idle Mode). Таким чином зменшується кількість перешкод, які впливають на точність АЦП
    • Automatically scan inputs - почергове автоматичне сканування входів АЦП. Результати вимірювання поміщаються в масив
  • Volt Ref - вибирається джерело опорної напруги

     вибір джерела опорної напруги CWAVR

    • AREF pin - джерело опорної напруги на ніжці AREF
    • AVCC pin - джерело опорної напруги на ніжці AVCC
    • Int., cap. on AREF - підключити до виводу aref внутрішнє джерело опорної напруги на 2,56в і конденсатор
  • Clock - вибір частоти роботи АЦП

Нам для нашого вольтметра потрібно встановити джерело опорної напруги на ніжці AVCC (ніжка харчування АЦП), частота перетворення 500 кілогерц

Ми наші вимірювання з АЦП будемо виводити на lcd-дисплей, для його ініціалізації переходимо у вкладку LCD і встановлюємо все, як на скріншоті

 ініціалізація LCD в CWAVR

Тепер всі налаштування виконані, натискаємо file->Generate. save and exit. Дописуємо код, який згенерував CWAVR, і прибираємо в ньому ініціалізації периферії МК, які ми не використовуємо, виходить наступний код:

#include <mega8.h> 
#include <delay.h> 
#include < stdio.h> 
// Alphanumeric LCD Module functions 
#asm 
.equ __lcd_port=0x12 ;PORTD 
#endasm 
#include <lcd.h> 
 
#define ADC_VREF_TYPE 0x40 
 
// Read the AD conversion result 
unsigned int read_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; 
} 
 
void main(void) 
{ 
char lcd_buffer[16]; 
unsigned int u; 
// ADC initialization 
// ADC Clock frequency: 500,000 кгц 
// ADC Voltage Reference: AVCC pin 
ADMUX=ADC_VREF_TYPE & 0xff; 
ADCSRA=0x81; 
 
// LCD module initialization 
lcd_init(16); 
 
while (1) 
{ 
/*так як АЦП у нас 10-бітний, то максимальне число, яке поверне функція, read_adc() 
буде дорівнює 1024, це число буде еквівалентом напруги на вході adc0. 
Наприклад, якщо read_adc() повернув 512, то це означає, що на вхід adc0 ми подали половину опорної напруги 
Щоб обчислити реальну напругу, нам потрібно скласти пропорцію 
опорна напруга - 1024 
шукана напруга - adc 
У нас опорна напруга = 5 
Шукана напруга = 5 * adc/1024, або Шукане напруга = 0,005*adc 
для простоти переведемо вольти в миливольты, домножив на 1000 
Шукана напруга = 0,005*adc*1000 
*/ 
u=read_adc(0) * 5;//викликаємо функцію для вимірювання напруги і передаємо їй номер ніжки, на якій потрібно виміряти напругу 
lcd_clear(); //чистимо дисплей перед виведенням 
lcd_gotoxy(0,0); // переведення курсора в положення x=0 y=0 
sprintf(lcd_buffer,"U = %i mv",u); // формуємо рядок для виводу 
lcd_puts(lcd_buffer); //виводимо рядок на дисплей 
delay_us(500); //робимо затримку 500 мл 
}; 
}
>

Програма готова, справа за схемою

схема простого вольтметра

Схема дуже проста, на ній ми бачимо мікроконтролер atmega8 і lcd-дисплей знакосинтезуючий 16х2 (приклад роботи з lcd описаний тут). Наш простий вольтметр вимірює напруги до 5 в. Як вимірювати напруги більше 5 читайте в цій статті. Схема виконана в Proteus, всі необхідні файли для цього уроку знаходяться в архіві Volt.zip.

Комментарии - (3)

Добавить комментарий

Для отправки комментария вы должны авторизоваться.