Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

16f873a ile adc uygulamasi

Başlatan selvi, 24 Şubat 2011, 09:15:42

selvi

#15
Alıntı YapPot değerlerini tespit ederken tamamen mantık hesabı yapmıştım. Pot tipi Joystickler vardır. Onlar gibi düşündüm.
Orta konumda sistemin durması  alt ve üst kısımlarda ise hareket verilmesi gerek diye düşünmüştüm
bahsettiginiz sekilde calisiyor. kumanda kollari ve calismasida orta konumda iken dururuyor alt ve ust kisimlarda hareketi sagliyor.
   ileri konumda 2 farkli hizi  vericide potun ust kademesini ornegin 0-512 degerleri 2 parcaya ayirarak 2 farkli bilgi yolluyorum.(potb>300 and potb<400)  - (potb<300 )seklinde ayiriyorum her biri icin farkli bilgi yolluyorum.bu kisim zaten verici programinda var.bahsettiginiz konu alicida bunu nasil sagliyorsunuz seklinde ise aliciyi besleyen bataryanin 3 cikisi var(8.4v-9.6v-gnd).3 tane role ile bu enerji baglantilarini yaptim.vericiden  gelen bilgiye gore normal ileri(DC motora 8.4v) veya  hizli ileri(DC motora 9.6v) hareket ediyor.
   ileri ve hizli ileri kademesi icin vericide programi bir onceki  mesajda verdigim sekilde duzenledigimde araba ileri hareket halinde iken hizli ileri komutu verdigimde araba duruyor(sanki dur komutu aliyor) ayni konumda (hizli ileri) iken sag yada sol yaptigimda hizli ileri hareketini sagliyor.
birde araba ilerken sag yada sol komutu verdigimde ilk anda kismi bir donus oluyor tekrardan tekerlekler duz pozisyonunu aliyor(sag yada sol komutu surekli oldugu halde).
  geri giderken bazen sag-sol komutu vermedigim halde saga yada sola hareket edebiliyor.normalde geri pozisyonda iken sag-sol komutu oldugu surece donus yapabiliyor.
programi inceliyorum geri ve ileri icin sag-sol komut bilgileri ayni(sola donus icin  PULSOUT PORTB.3,200
       PORTB.3=0:PAUSEUS 15)
Yaşam anlamlandırıldıkça kutsaldır....

ete

Benzer şekilde çalışan bir joystick elime geçmiş idi. Üzerinde 2 adet pot (aslında trimpot) yer alıyor. Biliyorsunuz pot un orta konumuna ait ADC değeri 511 dir. Yaptığım ölçümlerde joystick kolu serbest orta konumda durduğu zaman durduğu değer aralığı;
-480 ile 532 değerlari arasında yer alıyor. Sabit bir değer olmuyor. Kolu çekip bırakıyorum Bazen 505 de duruyor bazen 490 da bazen 520 gibi değerlerde duruyor. Emniyetli durma aralığı olarak ben 480 ile 535 arasını almış idim. Bu joystickile bir kamera kontrol sistemi yapmıştım. Çift motor ve Kameranın PWM ile sürülmüş iki motor ile X ve Y ekseininde hareket ettirilmesi gibi bir sistem idi.
Orta konumdan kalkış yaptığın zaman potun aldığı değerde önemli olduğundan mümkün olduğunca dar bir durma aralığı tespit etmiştim. Sonuçta emniyetli aralık olarak 480 ile 535 arası değerler işimi görmüş idi.

Senin sistemde pot değerleri konum olarak önem arzediyor. Yani 400 ün altında nerde durduğu pek önemli değil sanırım. Aynı şekilde 535 in üzeride çok önemli değil sanırım. Bu durumda sabit bir aralık almanda mahsur olmamalı. Bunun için orta nokta 511 olarak alırsak bu değerden 100 çıkartalım 411 sayısını bulur. Bu senin alt seviyen olabilir. Üst seviye olarak da 511+100=611 olarak almanda yarar var. Bu son derece emniyetli bir aralık olacaktır. İstersen benim yaptığım gibi kumanda kolunu bir çok defa değişik yönlere çekip bırakarak durduğu noktanın adc karşılığını ölçersin ve bune biraz emniyet payı ekleyerek daha dar bir aralık tespit edebilirsin. Aralığın dar olması motor kontrolünde tepki süresini kısaltacaktır.  Aslında voltaj kontrolü yerine bu kumanda kolları ile kontrol edilebilen PWM kontrollü bir sistem yapsan hiçde fena olmazdı. Gerekirse yardımcı olabilirm.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

Alıntı YapÖrneğin ADC girişi olan bir pic kullanarak AN0 dan 1K lık bir pot kullanarak HPWM sinyalinin frekansını değiştirebilmemiz mümkün olabilir.  Hatta ikinci bir pot kullanarak sinyalin Duty değerinide değiştirmek mümkün olabilir
pwm sistemiyle kontrol daha kullanisli ve daha fonksiyonel olacagini dusunuyorum.ders notlarinizda adc ile pwm sistemine donuk anlatim ve ornek var .orda formul olusturulurken potun degeri ile PR2 degeri ters orantili oldugunu ve islemleri ona gore yapmissiniz.ters orantili olma konusunu anlayamadim.mevcut durumuyla arabayi yonlendirmek icin sabit bir frekans ve duty degerini  pot kontrolu ile mi kontrol edecegiz?bu yontemle arabayi ornegin;potun degisimine gore ileri hareketi adim adim hizlanacak saga donuste adim adim olacak seklinde anliyorum bahsettiginiz sistemi.adc ile pwm birlestirlmesi konusunda nasil islenecegine donuk yardimlarinizi bekliyorum.
Yaşam anlamlandırıldıkça kutsaldır....

ete

#18
Pot değerine bağlı olarak frekans artırmak istersen Potu yuları yani +5V tarafına yaklaştırınca frekansın artmasını istersin. GND tarafına doğruda frekansın düşmesi istenir. PR2 burada ters davranıyor.  Pot değerine bağlı olarakPR2 değeri hesaplandığı için pot değeri artarken PR2 değeri artar ancak frekans değeri düşer. Terslikten bunu kast etmiştim. Önemli bir olay değil. Daha iyi anlaman için;
- 1 Khz de bir PWM sinyalinde 1/4 bölücü ile PR2 değeri 249 olurken;
- frekansı 2 Khz yapmakiçin PR2 değerini 124 yapmak ve aynı şekilde;
- frekansı 3 Khz yapmak için PR2 değerini 82 yapmak gerekir.
Pot ölçümünde ADC karşılığı 0-1023 arasında değiştiğine göre hangi aralıkta frekans ayarlanacak ise potun alt değerine karşılık olarak alt frekansa ait PR2 değerini , potun üst değerine karılık olarak da üst frekans değerine ait pr2 değerini vermek gerekir. Daha açık bir anlatımla
Frekans aralığımız 1 Khz ile 20 Khz arasında olmuş olsun. Bu durumda Pot 0 konumda iken frekans 1 Khz olmalı ve Pot 1023 konumda ikende frekansımız 20 Khz olmalı. Bu durumda pot 0 konumunda pr2 olarak bize 1Khz e ait pr2 değerini hesaplayıp vermeli 103 konumda ise 20 Khz e karılık gelen pr2 değerini hesaplayıp vermelidir.
1 Khz de PR2 değeri  249 id
20 Khz de ise PR2 değeri  12 olacaktır.
Gerisini sen hesaplarmısın yoksa onuda ekleyeyimmi?.  Bu arada PWM sinyali kullanarak Servo sürmeye ait örneklerim olması gerek.
aşağıdaki link te dosya yer almaktadır. Site kapalı deniyor ama şimdi denedim girilebiliyor.
Yükleyemez isen bildir başka bir yere yükleyeyim yada özel mesaj atıp mail adresini bildiriver.
Belkide derslerde bu projedenbahsetmişimdir. Öyle ise yüklemen gerekmez.

http://www.4shared.com/file/C2RjicZH/SERVO_ETE.html

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

servo surmek icin 1ms-2msn arasinda darbe vermek gerekiyor.birde 20ms de bir bu darbeleri vermek gerekiyor.bu durumda frekans secimi nasil olacak.1ms icin frekans 1khz,2ms icin frekans 500hz olmali.birde duty degeri var.PWM de istedigimiz frekanslari secebilirmiyiz.duty degerini %100 alirsak frenas araligini 500hz-1khz arasinda alabilirmiyiz.buda sanki cok mantikli değil,duty nin %100 olmasi.servoya gore hangi frekansi almaliyiz.bir kac gundur inceliyorum.tam baglantilarini kuramadim.onun icin isin icine de yarim giriyorum.birde isin haberlesme kismki var.yani verici-alici kismi.gonderdiginiz dosyalara baktim.
Yaşam anlamlandırıldıkça kutsaldır....

Maxim

selvi , duty %100 olamazki
pic pwm çıkışının %100 duty olması demek = 5 volt

ete

Minimum darbe süresi 1 ms oda 1000us demek oluyor . Bu süre darbenin high süresi olduğuna göre bir de LOW süresini eklemek gerekiyor.
Demekki 1ms lik darbe için peryodu 2ms olan bir frekans ve %50 duty uygulaman gerekiyor. Buna karşılık gelen frekans ise;
F=1000.000/1000=1000 Hz yani 1Khz.
Maksimum darbe süresi 2 ms ve T peryodu ise 4 ms olacaktır. Buna karşılık gelen Frekans ise F=1000.000/4000=250 Hz olacaktır.
Demekki servoyu sürmek için duty değeri %50 olan ve 250 Hz ile 1000 Hz arasında bir sinyal vererek işi çözebilirsin.

Darbelerin her 20 ms de verilmesi gerektiği konusunda emin değilim. Yaptığım gerçek denemelerde bunun öyle olmadığını görmüştüm.
Motora konum değiştirecek bir darbe verdinmi konumu değiştirir ve ikinci bir konum için senden darbe bekler. Belkide iki darbe arası en az 20 ms olmalıdır diye bir kural vardır ama ona da emin değilim.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam bu pwm ile olusturlmus programi verici-alici seklinde nasil duzenlnecek.vericide pot var.alicida servo var.asagidaki programda adc_pwm ile olusturulmus program var.bu sekilde servo sag-sol yapiyor.verici-alici seklinde nasil ayristirilacak.
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

DEFINE OSC 4

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 =%10000100   '2 servo AN0,AN1,AN3  analog   giris
T2CON = %00000110

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi
CMCON=7
'****************HPWM PRESETÝNG*********************
DEFINE CCP1_REG   PORTC    'Hpwm 1 pin port
DEFINE CCP1_BIT     2      'Hpwm 1 pin bit
DEFINE CCP2_REG   PORTC    'Hpwm 2 pin port
DEFINE CCP2_BIT     1      'Hpwm 2 pin bit 
'******************* DEÐÝÞKENLER  ********************
HAM  var word
X    VAR WORD
DUTY VAR BYTE   
'---------------------------------------------------------------------------

PR2=249
CCP1CON.2=1
CCP1CON.3=1

BASLA:
      DUTY=50
      GOSUB POTOKU
      
      GOTO BASLA
      
POTOKU:
       ADCIN 0,HAM
       PR2=((1024-HAM)*/4675)/100+62
       
       X=(PR2+1)* DUTY /25
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=x>>2
       RETURN

 END
Yaşam anlamlandırıldıkça kutsaldır....