ccs c ile voltaj farkı

Başlatan helloworld, 10 Ekim 2014, 23:39:54

helloworld




merhaba!
resimde de görüldüğü gibi 2 tane brbrndn farklı voltaj degeri a pinlerinden giriyor.ve çıkış olarak da b pini aralarındaki farklı bildiriyor.fikir yürütebilen paylaşabilir mi?

mehmet

Analog giriş yapıp fark alınır. Bu pwm
olarak dışarı verilir. Uygun filitre
dc gerilime çevrilir. Ya da PCF8591
ile iki değer okunur fark alınır, bu
Aout ile dışarı verilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Salih

@helloword sorduğun devre ne amaçladır,
dersindeki bir sorumudur, projemidir, yapman gereken devremidir?

helloworld

Projem için yapmam gereken aşamalardan biri.analog girişleri alıp pwm olarak dışarı vermem gerekiyor(@ mehmet e katılıyorum) kodlarını yazamıyorum.ayrı ayrı olsa kodlarını yazarım belki ama iç içe olunca yazamadım

sadogan

Takılıdığın yer neresi :
V1-V2<0 olma durumumu ?

helloworld

Hayır v1-v2 ye göre bi motorun voltajını arttırıp azaltıcam

Salih

Önce çalışacağın PIC modelini tespit et,
ve programa başla, takıldığın yerlerde yardım ederiz.

helloworld




girişe 2 farklı voltaj degeri veriyorum.bunların farkı float oldugu için çıkışa (b portu) binary olarak veremiyorum.nasıl yapabilirim acaba.

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli


#byte portb=6



#INT_AD               // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
   output_high(pin_c5);  // RC5 çıkışı 1
   delay_ms(200);
   output_low(pin_c5);   // RC5 çıkışı 0
}

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
double voltaj1,voltaj2,V_fark;            // ondalıklı tipte voltaj isminde değişken tanıtılıyor

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_c(0x00);  // C portu komple çıkış
   set_tris_e(0x0F);  // E portu komple giriş

   output_c(0x00);    // C portu çıkışını sıfırla

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog 
   enable_interrupts(INT_AD);     // AD çevrimi bitti kesmesi tanıtılıyor
   enable_interrupts(GLOBAL);     // Tüm kesmeler aktif



   while(1)   // sonsuz döngü
   {
      set_adc_channel(5);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj1=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      
      delay_ms(500);
    
      set_adc_channel(6);   // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj2=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      delay_ms(500);
       
      V_fark=voltaj1-voltaj2;   //burada farkını buluyorum.fakat ondalıklı
      
     
      
      set_tris_b(portb);
              
   }
}


nasıl bir kod yazalım ki V_fark 8 bitlik b portuna binary olarak aktarılsın.daha sonra buradan DAC yapmam gerekicek.

sadogan

Adc ile okuduğun değer giriş geriliminin binary değeri
bunu ister dac ister pwm e gönder ordada farkın binary değeri gerekiyor.
Kısaca onlu siteme çevirmen gerekmiyor.
Söyle yapabilirsin.
include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli


#byte portb=6



#INT_AD               // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
   output_high(pin_c5);  // RC5 çıkışı 1
   delay_ms(200);
   output_low(pin_c5);   // RC5 çıkışı 0
}

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
double voltaj1,voltaj2,V_fark;            // ondalıklı tipte voltaj isminde değişken tanıtılıyor

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_c(0x00);  // C portu komple çıkış
   set_tris_e(0x0F);  // E portu komple giriş

   output_c(0x00);    // C portu çıkışını sıfırla

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog 
   enable_interrupts(INT_AD);     // AD çevrimi bitti kesmesi tanıtılıyor
   enable_interrupts(GLOBAL);     // Tüm kesmeler aktif



   while(1)   // sonsuz döngü
   {
      unsigned int16 adc_val1,adc_val2,adc_fark;
      set_adc_channel(5);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      adc_val1=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

  //    voltaj1=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      
      delay_ms(500);
    
      set_adc_channel(6);   // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      adc_val2=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

    //  voltaj2=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      delay_ms(500);
       
      adc_fark=adc_val1-adc_val2;   //burada farkını buluyorum.fakat ondalıklı
      
     
      
      set_tris_b(portb);
              
   }
}

Salih

Alıntı yapılan: helloworld - 13 Ekim 2014, 20:28:06
Hayır v1-v2 ye göre bi motorun voltajını arttırıp azaltıcam

Motorun özelliği nedir.
Eğer DC ise pic den pwm çıkışını bir mosfet le motora uygulayabilirsin.
Pwm'nin değerini de fark gerilime bağlarsın.

helloworld

#10
Alıntı yapılan: salih - 20 Ekim 2014, 13:36:34
Motorun özelliği nedir.
Eğer DC ise pic den pwm çıkışını bir mosfet le motora uygulayabilirsin.
Pwm'nin değerini de fark gerilime bağlarsın.

motor 12v dc hocam.

@sadogan , şimdi 3.33 v ile 2.50 nin farkı 0.83 ya.yazdıgın programda bu portb ye aktarılan deger ne oluyor? ben orasını anlıyamıyorum.pwm yapsam nasıl yaparım.yani benim o 0.83 ü birşekilde belirtmem gerek portb de.yani artık 8 bitlik mi olur bu? yoksa pwm mi yapılır nasıl yapılır?

çünkü amacım şu.bu gelen analog bilgide motorun yüke binip binmedigini pic anlıyacak.binerse motorun voltajını arttırıcam.motor da aynı hızıyla dönmeye devam edicek.projeyi veren hoca ilk 2 tane voltajın farkını bul çıkısa bildir getir bakalım dedi.aşama aşama gidiyorum.o yüzden gerçekten yardım lazım.geceleri buna çalısmaktan çıldırıcam  :-\

mesaj birleştirme:: 20 Ekim 2014, 21:59:23

portb=adc_fark;
set_tris_b(portb);

burada b portu 8 bitlik ama adc 10 bitlik.msb tarafından 2bit b protunda gözükmüyor.artan 2 biti c portundan nasıl devam ettirebilirim?

yani aşşagıdaki gibi olucak




yukarıda fark 2 v: ve çıkış 0110011001=409 ve 409*0,004...=2v ama baştaki 2 biti b portundan gösteremiyorum

Salih

Forumu biraz araştırsan istediğin her şeyi bulursun.
Aşağıdaki linkdeki konu hemen hemen senin istediğinle aynı, bir incele.

https://www.picproje.org/index.php/topic,45659.msg337869.html#msg337869

sadogan

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_c(0x00);  // C portu komple çıkış
   set_tris_e(0x0F);  // E portu komple giriş

   output_c(0x00);    // C portu çıkışını sıfırla

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog 
    enable_interrupts(GLOBAL);     // Tüm kesmeler aktif
   while(1)   // sonsuz döngü
   {
      unsigned int16 adc_val1,adc_val2,adc_fark;
      set_adc_channel(5);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      adc_val1=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
       set_adc_channel(6);   // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      adc_val2=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
      adc_fark=adc_val1-adc_val2;  
      output_b(adc_fark);       
      output_c(adc_fark>>8);
              
 }
}

Bu istediğin basit bir işlem, programını düzenledim

helloworld

az önce en baştaki #devide ADC=10 U 8 yaptım.b portuna sıgdırdım.ama hassas olmaz diye senin kodunu kullanıyım.peki şimdi dac yapıp bunu 2v olarak nasıl çıkarabilirim.mesela dac0800 var ama isis te no model specified diyor.
şu farkı analog olarak nasıl verebilirim ekstra dac entegresi kullanark.

Salih

@sadogan arkadaş nihayetinde DC motor kontrol etmek istiyor.
Dolayısı ile pwm çıkışı kullanması gerekir.