|
| |||||||
|
Опубликовано 2010-03-29 11:33:52 автором Ruslan Використання АЦП в AVR. Урок AVR 6Часто буває потрібно заміряти напругу. Для цих цілей в мікроконтролері є АЦП (аналого-цифровий перетворювач). АЦП - це пристрій, який перетворює аналоговий сигнал в його цифрове подання. На вхід АЦП подається аналоговий сигнал, а на виході ми отримуємо еквівалентний цифровий сигнал. Основні характеристики АЦП
Тут:
Нам для нашого вольтметра потрібно встановити джерело опорної напруги на ніжці AVCC (ніжка харчування АЦП), частота перетворення 500 кілогерц
Ми наші вимірювання з АЦП будемо виводити на lcd-дисплей, для його ініціалізації переходимо у вкладку LCD і встановлюємо все, як на скріншоті
Тепер всі налаштування виконані, натискаємо 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. Комментарии - (4)
Добавить комментарийДля отправки комментария вы должны авторизоваться. |
|||||||