CCS C de ADC hızını nasıl belirliyoruz?

Başlatan GreeN, 21 Haziran 2011, 13:52:59

GreeN

Ezbere olmasın artık şu ADC , CCS C ne kadar yeterli bilmiyorum?

dsPIC30f4012 1Msps ADC 'si olan bir PIC. Bunu 750 , 600,500 yada 1 Mbps ile çalışmasını nasıl ayarlarım?


setup_adc_ports(sAN0);
 setup_adc(ADC_CLOCK_INTERNAL );


Yukarıdaki Kodu Yazıp Geçiyoruz.

setup_adc parametlerilerinde ADC_TAD_MUL_2 diye bir tanımlama var. Acquisition time değerini belirliyormuş. Nedir peki ?

Yada örneğin ;

for(i=0;i<128;i++){

sample[i]=read_ac();

}



Yukarıdaki kodda sample=read_ac();  satırını program counter , okuma gerçekleşene kadar beklermi? Değer tompana alındıktan sonramı devam eder.  Yoksa biraz bekleme mi gerek? Bu bekleme süresi mi  ADC hızını belirleyecek ? Çok saçma olur eğer böyleyse ...

Saygılarımla...

Terörü Lanetliyoruz.

ehliseyf

Sanırım adc nin Conversion Time adc işleminin gerçekleşmesi için gerekli zaman.Bu zamanı Sn ile böleersen adc sample elde edersin gibime geliyor.

ben 20usn altına inemiyor diyebiliyorum. 877 için

iki datasheet kıyaslanabilir sanırım

1 / 20 x 10 üzeri -6 = 10 üzeri 6 / 20  = 4 x 10 üzeri 4= 40 000 sanırım.

sn ye 40000 tane örnek alabilirsin.bu şekilde

yanılıyorda olabilirim.
Code'm mu oturturum !

bayelektronik

read_adc() fonksiyonundan sonra eğer bi gecikme olmazsa isis te hemen uyarı geliyor.şu ana kadar yaptığım uygulamarda enaz 10usn gecikme koymuşumdur read_adc() den sonra.normalde 20usn koymayı tercih ediyorum.

GreeN

1Msps ibaresinde Msps birimi (mega sample per second) saniyede 1Milyon örnek anlamına gelmiyor mu? Yanılıyormuyum? yani 1uS'de bir örnek. (işin aslı bana tamda bu lazım) 


for(i=0;i<128;i++){

sample[i]=read_adc(ADC_READ_ONLY);

while(!done) {   

done = adc_done();

}
}


adc_done : bunu adc 'yi set ederken kullanılmış bir kodu inceledim.  Set ettikten sonra bir bekleme ekleriz ya. Adc kendine gelsin diye. Yada ben öyle yapardım. yukarıdaki kodu bir deneyecem. Eğer ümit ettiğim gibi olursa ADC okuma bittiğinde adc_done 1 değerini alacak.
Terörü Lanetliyoruz.

firatim38

meraba arkadaşlar. ben de ccs c de pot ile motor kontrolu yapmam gerek. 16f88 kullanıyorum. galiba ADC yi öğrenmem gerekli bu konuda araştırma yapıyorum ama bi türlü sonuca ulaşamadım. yardımcı olabilcek olan var mı?

GreeN

Alıntı yapılan: firatim38 - 30 Haziran 2011, 13:37:13
meraba arkadaşlar. ben de ccs c de pot ile motor kontrolu yapmam gerek. 16f88 kullanıyorum. galiba ADC yi öğrenmem gerekli bu konuda araştırma yapıyorum ama bi türlü sonuca ulaşamadım. yardımcı olabilcek olan var mı?

Dostum kimseyi kandırmaya çalışma. Abicim önce bir ccs c indir kur , proteusuda , sonra google da bir iki ccs c kodu bul. Denemeler yap , sonra şu bahsettiğin iş hakkındaki çalışmanı paylaş "abi şunu yaptım ama bir problem var galiba " diye sor. Kusura bakmada böyle yanıt alman çok zor dostum.

Aşağıdaki linkte ADC anlatılıyor sanırım;

http://www.teknobakis.com/ccs-c-ile-pic-programlama-adc-fonksiyonlari
Terörü Lanetliyoruz.

firatim38

CCS C zaten kurulu daha önce çizgi izleyen yaptım. timer0 ile de hız kontrolu yaptım ama şu anpot ile hız kontrolu yapmam gerek. ya ben nasıl araştıracağımı bilmiyorum ya da derdimi anlatamıyorum. internette bi haftadır araştırıyorum serar çiçeğin ccs c kitabına da bakıyorum. ama ya ben araştırmayı bilmiyorum ya da nasıl bilgiye ulaşacağımı yapamıyorum. sorun burda.

VFR

Çizgi izleyen robotu yapan birinin bunu yapamaması çok şaşırtıcı.
Üstelik başka bir yerde açtığınız konuda devre ve programı verdim, hala sorun nerede anlamıyorum?

firatim38

ya ben 16f88 kullanıyorum. yani 16f877 den biraz farklı oluyo kodların yazımı. ya da ben anlayamıyor da olabilirim. şimdi ben timer0 kullancam potu da pice bağlıcam. pot u oynattıkça motor hız kontrolu yapcam. bunun için de adc kullanmam gerekli. ama bu adc koduyla timer0 kodlarını nasıl birleştircem onu yapamıyorum.

VFR

Timer0'la ADC'nin bir bağlantısı yok.
16F88 için sadece #include <16F877.h>  burayı 16F88 olarak değiştirceksiniz.
Bir de port isimleriyle oynarsınız olur biter bunla anlamayacak ne var?
set_adc_channel(0);
delay_us(20);
 hiz=read_adc();

Bu kod ile ADC kanalını okursunuz daha sonra gelen hiz bilgisini pwm'e aktarırsınız olay bu kadar basit.

firatim38

kardeş kusura bakma belki sorduğum sorular sana anlamsız geliyor olabilir ama insan bilmediği şeyi anlatamayabiliyo bazen. çok teşekkür ederim ilgilendiğin için

GreeN

#11
#include <16F877A.h>
#device adc=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=20000000)

void main()
{
   int16 pot_deger;
   
   /*adc setup*/
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   delay_us(10);
   /*ccp1 setup : pwm*/
   setup_timer_2(T2_DIV_BY_4,249,1);     
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(498);
   setup_comparator(NC_NC_NC_NC);
   
   while(1){
   pot_deger = read_adc();
   set_pwm1_duty(pot_deger);
   delay_ms(500);
   }
}





Sakın pwm çıkışına direk motor bağlama !!!
Terörü Lanetliyoruz.

firatim38

çok sağolasın. olayı çözdüm :) eyvallah

firatim38

ben birşey daha sorcam ama. tek motor kontrolu yapabildim, 2 tane pot ile 16f88 de iki tane motor kontrolu yapabilir miyim. ben bi tane CCP1 çıkışı olduğu için bitane yapılır diye düşünüyorum ?

VFR

1 tane CCP kanalı varsa 1 tane hız kontrolü yapabilirsin donanımsal olarak.
Yazılımsal olarakta yapabilirsin ama PIC ile başka birşey yapmaman gerekir o zaman .