Atmega328p mikrodenetleyicisi 6 kanal (28 DIP ) veya 8 kanal (TQFP ve VFQFN paketleri) 10 bitlik Ardışık Yaklaşımlı ( successive approximation ) ADC birimine sahiptir.
Ardışık Yaklaşımlı ADC'nin çevrim süresi kısa ve sabittir. Yüksek çözünürlükte ADC işlemleri yapılabilir.
10 bit olması analog gerilim değerinin 0-1023 arasında bir değere dönüştürüleceği anlamına gelir. Analog gerilim değerinin minimum değeri sayısal olarak 0(sıfır)'a denk gelirken, analog gerilimin maksimum dğeri de sayısal olarak 1023'e denk gelecektir.Elde edilen 10 bitlik sayısal bilgi ADC data register'ında ADCH ve ADCL olarak kaydedilir. Ayrıca Analog gerilimin maksimum değeri AVref gerilim değerinden büyük olamaz.
Kullanacağımız Kaydediciler
1- ADMUX (ADC Multiplexer Selection Register)
REFS[1:0] : ADC için voltage referansı seçer
ADLAR : ADC sonucunun ADC data register'a yazılma şeklini belirler.
1- Sonucu sola dayalı yazar
ADCL kaydedicisi
ADCH kaydedicisi
0- Sonucu saga dayalı yazar
ADCL kaydedicisi
ADCH kaydedicisi
MUX[3:0] : Analog girişlerden hangisnin ADC işlemine tabi tutulacağını belirler.
2 - ADCSRA (ADC Control and Status Register A)
ADEN : ADC Enable Bit
1- ADC aktif
0- ADC kapalı
ADSC : ADC Start Conversion Bit
1- ADC işlemi başlar
0- ADC işlemi bitince kendisi sıfır olur.
ADATE : ADC Auto Trigger Enable Bit
1- ADC Auto Trigger aktif
ADIF : ADC Interrupt Flag Bit
ADC Kesmesi kurulu ise ve ADC çevrimi sona erdiğini belirtir. Donanım tarafından 0
yapılır
ADIE : ADC Interrupt Enable Bit
1- ADC Kesmesi aktif
ADPS[2:0] : ADC Prescaler Select Bits
ADC saat sinyalinin ne kadar olacağını belirler.
3- ADCSRB (ADC Control and Status Register B)
ACME : Analog Comparator Mutiplexer Enable
1 ise Analog karşılaştırıcı aktif olur.
ADTS[2:0] : ADC Auto Trigger Source Bits
ADC'nin hangi kaynaktan tetikleneceğini belirler.
programımız
#include <avr/io.h>
#define F_CPU 8000000ul
uint16_t adc_okunan=0;
void Adc_ayar()
{
ADMUX |= 0x40; //ADC Voltage Reference Selection AVcc
// AREF = AVcc
ADCSRA |=0x07; // ADC prescaler 128 , ADC frekansı =62500Hz, 16usn
ADCSRA |= 0x80; // ADEN=1, ADC aktif
}
uint16_t adc_oku(uint8_t kanal)
{
kanal &=0x07; // kanal datasının ilk üç biti kullanılacak
// 000~111 8 kanal
ADMUX &= 0xF8; //ADMUX ilk üç biti 0 yapılıyor.
ADMUX |= kanal ; // kanal seçimi yapıldı
ADCSRA |=0X40; // ADSC =1 yapıldı ve ADC Çevrimi başladı,
while (ADCSRA & 0x40 ); // ADSC 1 olduğu sürece çevrim devam eder
// çevrimin bittiğini ADSC=0 olduğunda anlarız.
// ADSC 0 olana kadar bekliyoruz.
return(ADC); // ADSC 0 olduktan sonra elde edilen değer otomatik olarak
// ADC register'ına kaydedilir.
}
int main(void)
{
Adc_ayar();
for(;;)
{
........................................
.......................................
adc_okunan=adc_oku(0); // ADC0 - sıfırıncı ADC kanalı okunacak
..........................................
........................................
}
}
1- Sonucu sola dayalı yazar
ADCL kaydedicisi
ADCH kaydedicisi
0- Sonucu saga dayalı yazar
ADCL kaydedicisi
ADCH kaydedicisi
MUX[3:0] : Analog girişlerden hangisnin ADC işlemine tabi tutulacağını belirler.
2 - ADCSRA (ADC Control and Status Register A)
ADEN : ADC Enable Bit
1- ADC aktif
0- ADC kapalı
ADSC : ADC Start Conversion Bit
1- ADC işlemi başlar
0- ADC işlemi bitince kendisi sıfır olur.
ADATE : ADC Auto Trigger Enable Bit
1- ADC Auto Trigger aktif
ADIF : ADC Interrupt Flag Bit
ADC Kesmesi kurulu ise ve ADC çevrimi sona erdiğini belirtir. Donanım tarafından 0
yapılır
ADIE : ADC Interrupt Enable Bit
1- ADC Kesmesi aktif
ADPS[2:0] : ADC Prescaler Select Bits
ADC saat sinyalinin ne kadar olacağını belirler.
3- ADCSRB (ADC Control and Status Register B)
ACME : Analog Comparator Mutiplexer Enable
1 ise Analog karşılaştırıcı aktif olur.
ADTS[2:0] : ADC Auto Trigger Source Bits
ADC'nin hangi kaynaktan tetikleneceğini belirler.
programımız
#include <avr/io.h>
#define F_CPU 8000000ul
uint16_t adc_okunan=0;
void Adc_ayar()
{
ADMUX |= 0x40; //ADC Voltage Reference Selection AVcc
// AREF = AVcc
ADCSRA |=0x07; // ADC prescaler 128 , ADC frekansı =62500Hz, 16usn
ADCSRA |= 0x80; // ADEN=1, ADC aktif
}
uint16_t adc_oku(uint8_t kanal)
{
kanal &=0x07; // kanal datasının ilk üç biti kullanılacak
// 000~111 8 kanal
ADMUX &= 0xF8; //ADMUX ilk üç biti 0 yapılıyor.
ADMUX |= kanal ; // kanal seçimi yapıldı
ADCSRA |=0X40; // ADSC =1 yapıldı ve ADC Çevrimi başladı,
while (ADCSRA & 0x40 ); // ADSC 1 olduğu sürece çevrim devam eder
// çevrimin bittiğini ADSC=0 olduğunda anlarız.
// ADSC 0 olana kadar bekliyoruz.
return(ADC); // ADSC 0 olduktan sonra elde edilen değer otomatik olarak
// ADC register'ına kaydedilir.
}
int main(void)
{
Adc_ayar();
for(;;)
{
........................................
.......................................
adc_okunan=adc_oku(0); // ADC0 - sıfırıncı ADC kanalı okunacak
..........................................
........................................
}
}
Mükemmel açıklayıcı bir anlatım, datasheet niteliğinde(en azından giriş seviye için).Teşekkürler
YanıtlaSilTeşekkürler.
SilBu yorum yazar tarafından silindi.
YanıtlaSilDevamı için zaman arıyorum :) İnşallah gelir
Sil