adc hakkında yardım

Başlatan izci, 22 Temmuz 2017, 19:19:40

izci

Merhaba  basit bir voltmetre yapıyorum kullandığım işlemci 16f887, adc ayarlarını yapamıyorum. datasheet ine baktım fakat çözemedim,devre isiste çalışıyor uygulamada hata veriyor.. ilk 3 analog kanalı aktif etmek istiyorum ve referans gerilimi işlemci beslemesinden alsın istiyorum bu durumda ANSEL registerine hangi değer verilmeli?


@ __config  _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _CPD_ON & _BOR_OFF  & _IESO_OFF & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF
@ __config  _CONFIG2, _BOR21V & _WRT_OFF

OSCCON=%01101100
define osc 4

DEFINE ADC_BITS  8     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 5 ' ADC sampling time (uSec)

PORTA=0:TRISA=%00000111
portb=0:TRISB=%00000000
portc=0:TRISC=%00000000 
portd=0:TRISD=%00000000   
porte=0:TRISE=%1000   
ANSEL= %00000111 'A portu analog pinler
ANSELH=%00000000  'B portu Analog pinler iptal
ADCON0=0
ADCON1=0
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal
CCP1CON=0  'pwm kapalı
CCP2CON=0
WPUB=0  'PORTB pullup lar kapalı


  '***********lcd tanımlamaları***********
DEFINE LCD_DREG PORTD 'LCD data bacakları Portd de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 0. bitten başlıyor
DEFINE LCD_EREG PORTD 'LCD Enable Bacağı Portd de bağlı
DEFINE LCD_EBIT 4 'LCD Enable Bacağı 4. bite bağlı
DEFINE LCD_RWREG PORTD 'LCD RW Bacağı Portd de bağlı
DEFINE LCD_RWBIT 5 'LCD RW Bacağı 5. bite bağlı
DEFINE LCD_RSREG PORTD 'LCD RS Bacağı Portd de bağlı
DEFINE LCD_RSBIT 6 'LCD RS bacağı 6. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor
LCDOUT $FE,1
pause 400
LCDOUT $FE,$0C
'*************değişken atama********************
volt1 var byte
volt2 var byte




ana:
adcin 0,volt1
pause 1
adcin 1,volt2
pause 1
LCDOUT $FE,1, #volt1
LCDOUT $FE,$C0,#volt2
pause 200
goto ana

ete

Ref voltajları ADCON1 register,i ayarlıyor. Verdiğin değer doğru.
İlk 3 kanal için ANSEL registerine de %00000111 değerini vermelisin.
Ayrıca define komutları da biraz farklı değerler almalı onları verdiğin program satırlarından değiştirdim.
Bu şekilde çalışması gerekir.
Uygulamada ne hatası veriyor görmek lazım. Başka bir şeyle alakalı olabilir.
Ete

mehmet

İki VDD, iki VSS bağlı mı?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

izci

Alıntı yapılan: ete - 22 Temmuz 2017, 19:55:33
Ref voltajları ADCON1 register,i ayarlıyor. Verdiğin değer doğru.
İlk 3 kanal için ANSEL registerine de %00000111 değerini vermelisin.
Ayrıca define komutları da biraz farklı değerler almalı onları verdiğin program satırlarından değiştirdim.
Bu şekilde çalışması gerekir.
Uygulamada ne hatası veriyor görmek lazım. Başka bir şeyle alakalı olabilir.
Ete
adc voltajını potla konrol ediyordum yavaş çevirdiğimde sıkıntısız okurken potu hızlıca çevirdiğimde okumuyordu sanırım çevrim süresi ile ilgili idi, sizin düzenlemenizden sonra düzgün çalışıyor hocam.
peki hocam bu SAMPLEUS 5us bu pic için sabit bir değermidir? 10bit okuma yapmaya kalkınca yada osilatör frekansını değiştirince bununda değişmesi gerekirmi?
 

ete

SAMPLEUS örnekleme süresidir. ADC okuma işlemi içeride bulunan bir kondansatörün önce şarj edilip yük üzerinden boşalma süresi ölçülerek yapılan bir işlemdir. İşlemci bazında bu kondansatör şarj etme süresi farklıdır. Data sheetlerde Acquisition time olarak adlandırılıyor ve hesapla bulunuyor. Bu işlemci için bulunan değer 4,7us idi küsürtalı değer veremediğimiz için en yakın tam değer olarak 5us verdim. Bu değer kimide 12us kiminde 19,7~20us olarak kullanılıyor. Data sheet e bakıp ne verilmiş ise onu kullanmak en doğrusudur. Ayrıca OSC frekansı ADC işlemi için kullanılacak CLK değerini etkiler. Bunuda data sheet den tespit etmek gerekiyor. Bu işlemci için Data Sheet sayfa 101 (gerçek sayfası 103) de ADC CLK PERIOD (TAD) vs. DEVICE OPERATING FREQUENCIES şeklinde adlandırılmış olan Tabl0-9-1 de hangi frekanslarda be kullanılması gerektiği gösterilmiştir. Taranmış alanlar uygun olmayanları gösterdiği için 4 Mhz de 2us (Fosc/8 )ve 2-6us (FRC) seçenekleri uygun görülmektedir. Tabiiki ben Fosc/8 seçeneğini seçtim. Zaten Pic MultiCalc programıda aynı seçeneği sunmaktadır.
Burada dikkat edilmesi gereken bir husus var. Bi rprogramda bir tanımlama yeterlidir.
DEFINE ADC_CLOCK 1   tanımlaması Fosc/8 seçeneğini bize sağlamaktadır.
Aynı seçeneği ADCON0 registeri 7-6 bitlerine %01 değerini vererek de elde etmek mümkün. Ancak define komutunu kulllanınca artık ADCON0 registerini programa yazmamak gerekir. ADCO0=0 olarak vereceğiniz değer bile ilk tanımlamayı bozacaktır. Galiba bu kısmı atlamışız. O komutu silmek lazım gelir.

Ete

izci

evet hocam size onu da soracaktım datashet te  adc bölümünde  nerdeyse tüm tanımlamalar ADCON0 registerinde hallediliyor ama başka bir yazınızda pbp da ADCON0 a bizim değer vermememiz  gerektiğini yazmışşınız demekki DEFİNE ile tanımladığımız için.
103. sayfada ki tabloya baktım 8mhz için 4us görünüyor FOSC/32  karşılığı ADC_CLOCK 2, bu durumda dahili osilatörü 8 mhz de, adc 10bit  çalıştırsam;

OSCCON=%01101110
define osc 8
define ADC_BITS 10
DEFINE ADC_CLOCK 2
DEFINE ADC_SAMPLEUS 5
ADCON1= %10000000
volt1 var word
volt2 var word

bu şekilde değiştirsem yeterli olacakmı Erol hocam?

Powered by EzPortal