Digital Voltmeter (DVM) with auto range selector

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

peko

Uyku mu ??
:roll:

Uzun yıllar önceydi.. Bak geçmişe gittim birden fsan..
Ne günlerdi ama..
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

SpeedyX

Alıntı yapılan: "Erol"Speedyx ADC girişini kaldırdım, gerilim normale dondu..
Program da bir hata var sanırım.
Nasıl bir hata mesela? programın son halini veriyorum;
#include <16F876.h>
#device ADC=10
#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(int 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() {
   int16 v1,v2,voltaj;

   Set_tris_a(0b00000000);
   Set_tris_b(0b00000000);
   Set_tris_c(0b00000000);

   lcd_init();

   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(ALL_ANALOG);
   set_adc_channel(0);

//   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);
      KanalDegistir(0);
      v1=READ_ADC(ADC_START_AND_READ);
      if (v1==1023) {
         KanalDegistir(1);
         v1=READ_ADC(ADC_START_AND_READ);
         if (v1==1023) {
            KanalDegistir(2);
            v1=READ_ADC(ADC_START_AND_READ);
            if (v1==1023) {
               KanalDegistir(3);
               v1=READ_ADC(ADC_START_AND_READ);
            }
         }
      }
      voltaj = v1;
      lcd_gotoxy(10,1);
      printf(lcd_putc,"C:%d",x+1);
      lcd_gotoxy(1,2);
//      printf(lcd_putc,"%4.2w V DC",y*voltaj);
      printf(lcd_putc,"%lu    ",voltaj);
   }
}

En basit şekliyle bu.

Belkide fsan'ın dediği gibi diyodlardan kaynaklanıyordur.

fsan

Merhaba arkadaslar,

Konu
--PICBasicPro--
altinda ama..

@SpeedyX
Kodu hangi C compiler ile yazdin kardes?

aslinda cok kanalli ADC li bir PIC kullandiktan sonra Auto-Ranging olayi icin 4052 entegresine gerek yok bence..

Gerilim bölucü direncleri direk adc girislerine baglayip adc kanallari scan yapmak daha mantikli gibime geliyor..

olamazmi sizce?

kolay gelsin

fsan

Alıntı yapılan: "peko"Uyku mu ??
:roll:

Uzun yıllar önceydi.. Bak geçmişe gittim birden fsan..
Ne günlerdi ama..

Hayirdir üstat

Cok ta uzaklara gitme ya, ne olur ne olmaz, aramizda kal.

iyi uykular :)

Erol YILMAZ

SpeedyX ISIS 6.7 sp3 un kaydememe rahatszılığı yüzünden çalışmanın bir kısmı heba oldu. Kardeş önce analog giriş idüzgünce çalıştır sonra alırız 4052 ten.

@fsan derleyici CCS,

4052 2 kanal analog multiplexer. bence kullanım yeri gayet güzel.
Mantığı kavradıktan sonra tek tek girişe göre avantajları da var.

Bu devrede kafama takılan,

Giriş direnci çok yüksek, bunu güzel bir opampla takip etsek ADC öncesi çok iyi olur. Bir de  Autorange  için bir strateji belirlenmeli, daha fazla düşünmek yada kalite bir ölçü aletini izlemek lazım. Evde Brymen var onu izleyeyim. Fluke da şirkette var. ona da bakayım. siz de bakın.
güzel bir komposizyon ödevi yapalım. :D

Erol YILMAZ

0...30V ayarli guc kaynagi Fluke75 e baglandi.
Gerilim 0 dan baslayarak yavasca artirildi.
1.234, 2.754 V vs...  3.250 olacagi sirada  pat !

3.25 oldu 4.98 vs diye devam etti...

Ayni sekilde geri donerken  3.25,  3.01, 2.80 derken 2.750 gorundu...

Yani geciste olu band var. 2.75 ve 3.25 Volta denk geliyor.

fsan

Alıntı yapılan: "Erol"SpeedyX ISIS 6.7 sp3 un kaydememe rahatszılığı yüzünden çalışmanın bir kısmı heba oldu.

Sevgili Erol,
ISIS 6.7 sp3 kaydememe rahatszılığı yok galiba artik birader. Saolsunlar programci arkadaslar o sorunu halletmisler =)
Forumda veya Sonsivri de olacakti bir kontrol et.

Alıntı yapılan: "Erol"
Bu devrede kafama takılan,
Giriş direnci çok yüksek, bunu güzel bir opampla takip etsek ADC öncesi çok iyi olur. Bir de  Autorange  için bir strateji belirlenmeli, daha fazla düşünmek yada kalite bir ölçü aletini izlemek lazım. Evde Brymen var onu izleyeyim. Fluke da şirkette var. ona da bakayım. siz de bakın.
güzel bir komposizyon ödevi yapalım. :D

Griste OPAMP kullanma fikri iyi bencede.
Autorange mantigi: Kanallari scan ederken en yüksek gerilim ölcme modunda  baslayip, eger gerekirse alt kademelerde inip deneme  yapilmasi lazim. (Bence)

SpeedyX

Merhaba arkadaşlar

adc yi çalıştırıyorum, sorun yok ama o devreyi bağlayınca olay kopuyor, normalde adc den değer okumak için;
#include <16F876.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOCPD,NOLVP,NOBROWNOUT,NOWRT,NOCPD,NODEBUG
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,RESTART_WDT)

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

int16 voltaj;

void main() {
   setup_adc(ADC_CLOCK_DIV_32);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   
   Set_tris_a(0b00000000);
   Set_tris_b(0b00000000);
   Set_tris_c(0b00000000);

   while(1) {
         delay_ms(1000);
         voltaj=READ_ADC();
         printf("%lu\n\n",voltaj);
   }
}

yazmanız yeterli, normaldede (sırf proteusta değil) çok defa kullandım bu şekilde.
Neyse siz devam edin. Autorange olayı ile ilgileniyorum, bir deneme yapayım dedim. oda sanırım proteus yüzünden olmadı :)
Tekrar deneme yaparız sonra.
Saygılar.