Digital Voltmeter (DVM) with auto range selector

Başlatan fsan, 12 Şubat 2006, 17:57:34

fsan

Sevgili üstatlar
Nette dolasiken gördügüm bir sayfa:
http://wiredworld.tripod.com/tronics/hiresdvm.html

Digital Voltmeter yapmislar, auto ranging kismi ilgimi cekti PIC kullanarak bizde bunu gerceklistirebilirmiyiz acaba diye nette biraz arastirip bende bir seyler yapmaya calistim, yalniz yazdigim kodda baya bir matematik islemler var tam anlamiyorum nasil yapmislar.    





yukaridaki proteus semadaki potlarin ayarini ben yaptim yapilmasi gereken:

programda AUTORANGING, CALC_VOLTS ve DISPLAY sub rütinlerde gerekli degisiklikler yapilarak Giris voltaji LCD de yazdirilacak.  

Isis ve PBP dosyalari indirip inceleyebilirsiniz.
http://home.no/fsan/projects/Diverse/Digital%20Voltmeter

Erol YILMAZ

Sevgili Fsan,

AutoRange olcu aleti mumkun olan en hassas olcumu gostermeyi amacliyor. 10 Bit ADC ve LSB yi de ekrana yansittigizi varsayalim. 1023 V a kadar giris yapariz tabii uygun gerilim bolme direncleri ile birlikte...

Peki girisimiz 3.64 V oldugunda ekranda sadece 3 mu gorecegiz ?
3.64 gorme hakkimiz yok mu? :D
10 bit ADC ile elbette var. (LSB biti fenomenini dusunmeden soyluyorum.)
Diyelim ki 1. giris secili ve ADC ile gerilimi okuyoruz. ADC sonucu 1023 oldu. Yani sona dayandi.
Bu durumda anliyoruz ki dis gerilim 1. kademeyi doldurdu. 2. kademe girisi seciyoruz. Buradan okudugumuz degerler 350 gibi o zaman bunu degerlendiriyoruz.
2. kademe de olculen degerler cok dustuyse bir ara acil olarak 1. kademeden olcum alip 1023 un altindamiyiz? diye bakabiliriz. altindaysak 1. kademeye geceriz.
Degilsek 2. kademede kaliriz. aynen 2. kademede okurken ADC sona dayandiysa 3. kademeye gecis yapariz.

Ben gecisleri sanki on-off gibi dusundum, araya bir olu band atmakta fayda var. Zira Fluke larda oyle.

BASIC bilmedigim icin program olarak yardimci olamayacagim ama konu benim de ilgimi cekiyor. Kolay gelsin...
http://picproje.com/index.php/topic,5904

fsan

Sevgili Erol,

Hocam Senin yazdiklarinin hepsine katiliyorum aslinda 10bit adc kullansak daha iyi olur, hatta adc li bir PIC ;) ben bu 8bit lik adc0831 kullanmam sadece test amacli nasil calistigini ögrenmek icin idi. [ADCBits\9] ekstra bit bilincli olarak, ekstra bir clock puls gerekiyormus galiba oyüzden.

Ben zaten potlari senin dedigin gibi: if ADCBits > 254 then.. next sekilde scan ediyorum orada bir sorun yok. sadece matamatiksel islemlerde biraz zayif kaliyoruz  :D  giristeki 0-5 volt ölcme calisiyor yaliniz 1:10, 1:100 vs. buralari nasil hesaplayacagimi bilemedim.

tesekkürler.

Erol YILMAZ

1. kademede gelen gerilim max. 5 V a kadar okuyacak.
2. kademe max. 50 Volta kadar.
3. kademe de max. 500 Volta kadar okuma icin kullanilacak.

Bunu nasil yapabiliriz diye dusunmek istiyorum, vakit gec oldu simdi :D

fsan

haklisin üstat zaten birince kademede adc0831 devre 0-5V ölcüm yapiyor sonraki kademeler 10 ile katlamak daha mantikli

SpeedyX

Merhabalar,
Bir gelişme var mı?
Bunu 5-8 Adc li bir pic ile 4052 yi kullanmadan nasıl yaparız?

SpeedyX

Ben denemek için birşey yaptım ama çalışmadı, sıfır gösteriyor, aynısını yaptım, şaseleyemiyor sanırım.

dosyalar burada

#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOCPD,NOLVP,NOBROWNOUT
#use delay(clock=4000000,RESTART_WDT)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte portc = 7
#byte portb = 6
#byte porta = 5

#bit cnt1 = portc.6
#bit cnt2 = portc.7

#define use_portb_lcd TRUE
#include <LCD.C>

int x=0;
int16 y=1;

void KanalDegistir() {
   x++;
   
   if(x>3)
      x=0;
   
   switch (x) {
      case 0 : cnt1=0;
               cnt2=0;
               y=1;
               break;
      case 1 : cnt1=1;
               cnt2=0;
               y=10;
               break;
      case 2 : cnt1=0;
               cnt2=1;
               y=100;
               break;
      case 3 : cnt1=1;
               cnt2=1;
               y=1000;
               break;
   }
}

void main() {
	Set_tris_a(0b00000000);
	Set_tris_b(0b00000000);
	Set_tris_c(0b00000000);

   lcd_init();

   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   set_adc_channel(1);

//   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   set_timer0(0);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);

   disable_interrupts(int_rtcc);
	disable_interrupts(int_timer1);
   disable_interrupts(global);

   printf(lcd_putc,"SpeedyX");

	while(1) {
      delay_ms(500);
      lcd_gotoxy(10,1);
      printf(lcd_putc,"C:%d",x+1);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%4.2w V DC",y*READ_ADC());
      KanalDegistir();
	}
}


:?:

fsan

Merhaba,
"100V" Label DC kaynak ayarlarini bir kontrol et. Giriste gercekten 100V mi var?

SpeedyX

Aynı alıp yapıştırdım o kısımı, şimdi tekrar kontrol ettim, 1k-100-10-1 yazıyor sırayla.

fsan

adc girise giden o baglantiyi oradan cekip birde öyle denemek lazim.

ADC girisini VDD ye dire bagla bakalim LCD de kac volt okunacak

SpeedyX

ADC girişini direkt VDD ye bağlayınca yanlış adc kanalını seçtiğimi farkettim (malum, uykusuzluk). Fakat yine bir değişiklik olmadı. yani yine 0.00985624... şeklinde voltaj gözüküyor orada.

fsan

uykusuzluk mu?

he, he.. o nedir kardes? o icaat edildi mi? :)

SpeedyX

Alıntı yapılan: "fsan"uykusuzluk mu?
he, he.. o nedir kardes? o icaat edildi mi? :)
Ne demek istiyorsun kardeş? açık yaz?
sadece aynı şeyin neden çalışmadığı hakkında fikir istedim,proteusun saçmalığı mı yoksa pic e voltajı o şekilde girmemek mi gerekiyor? ben önceden hep o şekilde girdim, hayret hepde çalıştı. daha "icat" edilmemiş uykusuzluk mu engel oluyor acaba bu işe, ne iştir?

fsan

yaw gardas bir saka yaptik =)

ben uykuz oldugumda kafam daha iyi calisir nedense :P

formda baska bir yerde uzman arkadaslar AC volt ölcmeye calisiyorlar dur bakalim onlar ne yapacaklar. Zener diot isi bozuyor biraz, onu kaldirincada pic girisinde fazla yüksek gerilim gidiyor nasil olacak bilmemki.

Erol YILMAZ

Speedyx ADC girişini kaldırdım, gerilim normale dondu..
Program da bir hata var sanırım.